0

如何将一个随机预制件限制为仅使用一次,但将一堆预制件随机放置在其他对象之上?

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);
        }
    }
}
4

2 回答 2

0

您宁愿想“洗牌”一次数组,然后迭代洗牌的数组,例如使用LinqOrderBy并使用Random.valueas 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);
    }
}
于 2021-05-03T04:28:52.943 回答
0

我理解您的问题的方式是您最多希望实例化 memberRoomPrefabArray 中的每个元素一次。您可以创建一个临时列表,它是 memberRoomPrefabArray 的副本,并删除在下一个循环周期之前实例化的每个元素。

void Start()
{
    List<GameObject> temp = new List<GameObject>(memberRoomPrefabArray);
    
    foreach (GameObject localWood in memberWoodArray)
    {
        int localRoomIndex = Random.Range(0, temp.Count);
        
        Instantiate(temp[localRoomIndex], localWood.transform.position, Quaternion.identity);
        
        temp.RemoveAt(localRoomIndex);
    }
}

您可能想要添加一些检查,例如if (temp.Count == 0) { break; }是否有可能memberRoomPrefabArraymemberWoodArray.

编辑:更改Random.Range(0, temp.Count - 1)Random.Range(0, temp.Count),显然,它仅最大程度地包含浮点数而不是整数。

于 2021-05-03T02:32:50.837 回答