随机洗牌列表在Unity 3D

本文关键字:Unity 3D 列表 随机 | 更新日期: 2023-09-27 18:12:08

我有点小麻烦。我有一个显示项目列表的数组脚本。现在的问题是,我只希望这个列表在10个项目中显示5个项目,并且是洗牌的,所以你不能每次开始一个新游戏时都有相同的列表。我在想是否应该有个兰登。范围实现,但我不知道在哪里。请帮忙和谢谢。脚本如下:'

public class RayCasting : MonoBehaviour
{
    public float pickupDistance;
    public List<Item> items;

    #region Unity
    void Start ()
    {
        Screen.lockCursor = true;
    }
    void Update ()
    {
        RaycastHit hit;
        Ray ray = new Ray(transform.position, transform.forward);
        if (Physics.Raycast(ray, out hit, pickupDistance))
        {
            foreach(Item item in items)
            {
                if(Input.GetMouseButtonDown(0)) {
                    if (item.gameObject.Equals(hit.collider.gameObject))
                {
                    numItemsCollected++;
                    item.Collect();
                    break;
                        }
                }
            }
        }
    }
    void OnGUI()
    {
        GUILayout.BeginArea(new Rect(130,400,100,100));
        {
            GUILayout.BeginVertical();
            {
        if (numItemsCollected < items.Count)
        {
            foreach (Item item in items)
                        GUILayout.Label(string.Format("[{0}] {1}", item.Collected ? "X" : " ", item.name));
        }
        else
        {
            GUILayout.Label("You Win!");
        }
            }
            GUILayout.EndVertical();
    }
        GUILayout.EndArea();
    }
    #endregion
    #region Private
    private int numItemsCollected;
    #endregion
}
[System.Serializable]
public class Item
{
    public string name;
    public GameObject gameObject;
    public bool Collected { get; private set; }
    public void Collect()
    {
        Collected = true;
        gameObject.SetActive(false);
    }
}

"

随机洗牌列表在Unity 3D

要从你的10个项目列表中随机获得5个项目,你可以使用:

List<Items> AllItems = new List<Items>();
List<Items> RandomItems = new List<Items>();
Random random = new Random();
for(int i = 0; i < 5; i++)
{
    RandomItems.Add(AllItems[random.Next(0, AllItems.Count + 1)]);
}

AllItems列表包含您的10个项目。

循环后,你将在RandomItems列表中拥有5个随机项目。

刚刚算出来了,这就是我对任意列表进行随机排序的解决方案

public class Ext : MonoBehaviour
{
    public static List<T> Shuffle<T>(List<T> _list)
    {
        for (int i = 0; i < _list.Count; i++)
        {
            T temp = _list[i];
            int randomIndex = Random.Range(i, _list.Count);
            _list[i] = _list[randomIndex];
            _list[randomIndex] = temp;
        }
        return _list;
    }
}

在你的例子中,它应该是这样工作的:

AllItems = Ext.Shuffle<Items>(AllItems);
Debug.Log(AllItems[0]); // Will be always random Item

如果你需要5个随机物品,你可以调用

Debug.Log(AllItems[0]); // Random Item
Debug.Log(AllItems[1]); // Random Item
Debug.Log(AllItems[2]); // Random Item
Debug.Log(AllItems[3]); // Random Item
Debug.Log(AllItems[4]); // Random Item