Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity 3D中的随机洗牌列表_C#_List_Random_Shuffle - Fatal编程技术网

C# Unity 3D中的随机洗牌列表

C# Unity 3D中的随机洗牌列表,c#,list,random,shuffle,C#,List,Random,Shuffle,我有点困难。我有一个显示项目列表的数组脚本。现在的问题是,我只希望这个列表中有五个项目显示在十个项目中,并且也会被洗牌,所以你不能每次开始一个新游戏时都有相同的列表。我在想是否应该有一个随机范围,但我不知道在哪里。请帮忙,谢谢。下面是脚本:` public class RayCasting : MonoBehaviour { public float pickupDistance; public List<Item> items; #region Unit

我有点困难。我有一个显示项目列表的数组脚本。现在的问题是,我只希望这个列表中有五个项目显示在十个项目中,并且也会被洗牌,所以你不能每次开始一个新游戏时都有相同的列表。我在想是否应该有一个随机范围,但我不知道在哪里。请帮忙,谢谢。下面是脚本:`

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);
    }
}
公共类光线投射:单行为
{
公众浮标拾取距离;
公共清单项目;
#区域统一
无效开始()
{
Screen.lockCursor=true;
}
无效更新()
{
雷卡斯特击中;
射线=新射线(transform.position,transform.forward);
if(物理光线投射(光线、命中率、拾取距离))
{
foreach(项目中的项目)
{
if(Input.GetMouseButtonDown(0)){
if(item.gameObject.Equals(hit.collider.gameObject))
{
numItemsCollected++;
item.Collect();
打破
}
}
}
}
}
void OnGUI()
{
GUILayout.BeginArea(新Rect(130400100100));
{
GUILayout.beginstical();
{
if(numItemsCollected

`

要从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)]);
}
List AllItems=new List();
列表项=新列表();
随机=新随机();
对于(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;
    }
}

如果你真的想洗牌,遵循Fisher-Yates算法,你可以在Wiki上找到它。如果您只是想要一些随机性,请使用
Random.Next
newguid
执行
OrderBy
。同样的问题还有大约15个副本,挑一个。我对这个问题还是有点陌生,还在学习诀窍,所以如果你能详细说明一下,可以吗?我搜索了很多次,没有发现任何数组和数组中的列表被洗牌的东西。那么我应该替换我的公共列表项吗;使用列表AllItems=new List();您的项目列表可以保持不变。您只需要用您想要的5个随机项填充它。因此,在我的示例中,您将使用项目列表替换RandomItems。random。Next…Next不符合要求,它表示它不是一个变量。您必须创建系统内可用的random类的实例;图书馆。Unity3D内置随机类仅包含静态方法,不包含下一个方法。因此,在使用UnityEngine的代码下面;添加行:使用系统;一旦添加了替换我的代码行:Random Random=new Random();使用System.Random Random=新的System.Random();一次输入使用系统;它取消了随机,并没有改变下一个…我想只是把调校系统;还是还有更多?
AllItems = Ext.Shuffle<Items>(AllItems);
Debug.Log(AllItems[0]); // Will be always random Item
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