Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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# 我做错什么了吗_C#_Random_Unity3d_Shuffle - Fatal编程技术网

C# 我做错什么了吗

C# 我做错什么了吗,c#,random,unity3d,shuffle,C#,Random,Unity3d,Shuffle,这个剧本我已经写了好几个星期了。我有一个脚本,每当一个新游戏开始时,列表上的项目都会被洗牌。我不知道为什么,但我似乎一点也不会乱翻物品清单。请帮忙,如果可以的话,自己测试一下。另外,请向我解释可能存在的问题,或者我可以做些什么来解决它,我对这一点还很陌生 `using UnityEngine; using System.Collections; using System.Collections.Generic; public class RayCasting : MonoBehaviour {

这个剧本我已经写了好几个星期了。我有一个脚本,每当一个新游戏开始时,列表上的项目都会被洗牌。我不知道为什么,但我似乎一点也不会乱翻物品清单。请帮忙,如果可以的话,自己测试一下。另外,请向我解释可能存在的问题,或者我可以做些什么来解决它,我对这一点还很陌生

`using UnityEngine;
using System.Collections;
using System.Collections.Generic;

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

    #region Unity
    void Start ()
    {
        Screen.lockCursor = true;
        // Do a while loop until finalItems contains 5 Items
        while (finalItems.Count < 5) {
            Item newItem = items[Random.Range(0, items.Count)];
            if (!finalItems.Contains(newItem)) {
                finalItems.Add(newItem);
                }
            items.Clear();
            }
    }
    void Update ()
    {
        RaycastHit hit;
        Ray ray = new Ray(transform.position, transform.forward);
        if (Physics.Raycast(ray, out hit, pickupDistance))
        {
            foreach(Item item in finalItems)
            {

                if(Input.GetMouseButtonDown(0)) {
                    if (item.gameObject.Equals(hit.collider.gameObject))
                {
                    numItemsCollected++;
                    item.Collect();
                    break;
                        }
                }
            }
        }
    }

    void OnGUI()
    {

        GUILayout.BeginArea(new Rect(130,400,100,130));
        {
            GUILayout.BeginVertical();
            {
        if (numItemsCollected < items.Count)
        {
            foreach (Item item in finalItems)

                        GUILayout.Label(string.Format("[{0}] {1}", items.Collected ? "" + items.password: " ", items.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 int password;

    public bool Collected { get; private set; }



    public void Collect()
    {
        Collected = true;
        gameObject.SetActive(false);
    }

    public void passwordNumber()
    {
        password = 0;
        Collected = true;
        gameObject.SetActive(false);
    }


}

`
`使用UnityEngine;
使用系统集合;
使用System.Collections.Generic;
公共类光线投射:单行为
{
公众浮标拾取距离;
公共清单项目;
公开财务清单;
#区域统一
无效开始()
{
Screen.lockCursor=true;
//执行while循环,直到finalItems包含5项
而(最终计数<5){
Item newItem=项目[随机范围(0,items.Count)];
如果(!finalItems.Contains(newItem)){
最终添加(新项目);
}
items.Clear();
}
}
无效更新()
{
雷卡斯特击中;
射线=新射线(transform.position,transform.forward);
if(物理光线投射(光线、命中率、拾取距离))
{
foreach(财务报表中的项目)
{
if(Input.GetMouseButtonDown(0)){
if(item.gameObject.Equals(hit.collider.gameObject))
{
numItemsCollected++;
item.Collect();
打破
}
}
}
}
}
void OnGUI()
{
BeginArea(新直肠(130400100130));
{
GUILayout.beginstical();
{
if(numItemsCollected
这个例子太复杂了,有很多与您似乎要问的问题无关的代码。作为一种基本策略,您应该尝试隔离您认为有问题的代码,修复该问题,然后将其应用于更大的情况

例如,您的基本逻辑至少有一个错误:Random.Range是inclusive,因此您可能有一个越界索引,除非您使用“index.Count-1”

下面是一个示例,它从一个较大的“原始”列表中创建一个包含5个随机项的列表。您应该能够将此应用于代码:

using UnityEngine;
using System.Collections.Generic;

public class RandomList : MonoBehaviour {

  public List <int> originals = new List<int>();
  public List <int> randomized = new List<int>();
  public int desiredNumberOfRandomInts = 5;
    // Use this for initialization
    void Awake () {
    for(int i = 1; i <= 20; ++i) {
      originals.Add(i);
    }
    while(randomized.Count < desiredNumberOfRandomInts) {
      int randomSelection = originals[Random.Range(0, originals.Count-1)];
      if (!randomized.Contains(randomSelection)) {
        randomized.Add(randomSelection);
      }
    }
  }
}
使用UnityEngine;
使用System.Collections.Generic;
公共类随机列表:单行为{
公共列表原件=新列表();
公共列表随机化=新列表();
公共int-desiredNumberOfRandomInts=5;
//用于初始化
无效唤醒(){

对于(int i=1;i我认为删除
items.Clear()
可能有效,原因我在评论中解释过

while (finalItems.Count < 5) {
   Item newItem = items[Random.Range(0, items.Count)];
   if (!finalItems.Contains(newItem)) {
       finalItems.Add(newItem);
   }
}
while(finalItems.Count<5){
Item newItem=项目[随机范围(0,items.Count)];
如果(!finalItems.Contains(newItem)){
最终添加(新项目);
}
}

但是,我仍然假设您已经在某个地方有了
项的列表(列表必须大于5,因为您将循环至少5次)。如果您没有
项。Count
仍将保持为0,并使您的随机值变为
Range(0,0)

我真的不明白你的问题是什么。你能详细解释一下吗1)你希望脚本做什么,以及2)脚本做了什么你没有预料到的事情?好吧,那么脚本基本上是制作一个1-10之间的项目列表。每次你点击列表中找到的项目,它会给你一个随机数,这意味着你收集了它,这个数字会做一些不重要的事情。我的prbl是什么em是项目不会在每次新游戏开始时都随机移动。我不希望每次游戏开始时列表都是相同的。这样更好吗?我不知道我是否做错了什么,但它不会随机化项目列表。我不知道去哪里。如果你需要更多细节,请告诉我。在回答之前,我想验证一些东西。变量
items
是一个
列表
,但我看不到您的代码向其中添加任何列表项。而且您总是在循环结束时清除它,这意味着
项。计数
将保持为零,无论您循环多少次。那么如果
Random.Range
始终返回0,循环如何结束?我的意思是说正因为这个原因,我不想把这些项目去掉。有人建议这样做,但没有用。我明白了,你是说我应该在我的foreach声明中把项目换成项目吗?