arrays - 如何将一个随机预制件限制为仅使用一次,但将一大堆预制件随机放置在其他对象之上?
问题描述
如何将一个随机预制件限制为仅使用一次,但将一堆预制件随机放置在其他对象之上?
using System.Collections.Generic;
using UnityEngine;
public class LevelRoomsScript : MonoBehaviour
{
[SerializeField]
private GameObject[] memberWoodArray = null;
[SerializeField]
private GameObject[] memberRoomPrefabArray = null;
void Start()
{
foreach (GameObject localWood in memberWoodArray)
{
int localNumRoomPrefab = memberRoomPrefabArray.Length;
int localRoomIndex = Random.Range(0, localNumRoomPrefab);
GameObject localRoomPrefab = memberRoomPrefabArray[localRoomIndex];
Instantiate(localRoomPrefab, localWood.transform.position, Quaternion.identity);
}
}
}
解决方案
您宁愿想“洗牌”一次数组,然后迭代洗牌的数组,例如使用LinqOrderBy
并使用Random.value
as order like
using System.Linq;
...
void Start()
{
if(memberRoomPrefabArray.Length < memberWoodArray.Length)
{
Debug.LogError($"Not enough prefabs available for {memberWoodArray.Length} unique spawns!", this);
return;
}
// as the method names suggest this will be a randomized array of the available prefabs
var shuffledPrefabs = memberRoomPrefabArray.OrderBy(m => Random.value).ToArray();
for (var i = 0; i < memberWoodArray.Length; i++)
{
// Since the array is already shuffled we can now go by consecutive order
Instantiate(suffledPrefabs[i], memberWoodArray[i].transform.position, Quaternion.identity);
}
}
推荐阅读
- html - Bootstrap Navbar 不想在元素之间显示点分隔符
- swiftui - 在 Super Simple SwiftUI 应用程序中聚焦 TextField 会导致 LayoutConstraint 错误
- python - 如何使查询参数列表(多个值)在fastapi python框架中至少需要一个值
- typescript - TypeScript - 你可以在没有类型保护的情况下对从某种类型扩展的接口进行类型检查吗?
- html - 如何在 html 和 css 中将链接对齐到中心?
- javascript - React - 如何根据条件显示变量的最后一个值
- python - Holoviews 更改完整的背景颜色
- r - 如何在 R 的 bizdays() 中包含“从”日
- regex - 正则表达式:用制表符替换每行的第一个逗号
- javascript - JS 验证失败,但提交表单