首页 > 解决方案 > 如何将一个随机预制件限制为仅使用一次,但将一大堆预制件随机放置在其他对象之上?

问题描述

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

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

标签: arraysunity3drandomrestrictprefab

解决方案


您宁愿想“洗牌”一次数组,然后迭代洗牌的数组,例如使用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);
    }
}

推荐阅读