【问题标题】:Am I Doing Something Wrong here Unity 3D我在这里做错了吗 Unity 3D
【发布时间】:2014-09-07 14:01:48
【问题描述】:

我已经被这个脚本卡住了大约几个星期了。我有这个脚本,每次新游戏开始时,列表中的项目都会随机播放。我不知道为什么,但我似乎根本无法调整项目列表。请帮忙,如果可以的话,自己测试一下。另外请向我解释可能是什么问题或我可以做些什么来解决它,我对此还是很陌生。

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


}

`

【问题讨论】:

  • 我真的不明白你的问题是什么。您能否更详细地解释一下 1) 您希望脚本做什么,以及 2) 脚本做了哪些您没想到的事情?
  • 好的,所以脚本基本上是从 1 到 10 列出项目。每次你点击你在列表中找到的一个项目时,它会给你一个随机数,这意味着你收集它,这个数字会做一些不重要的事情。我的问题是每次新游戏开始时项目都不会洗牌。我不希望每次开始游戏时列表都相同。是不是好一点??
  • 我不知道我是否做错了什么,但它不会随机化项目列表。我不明白该去哪里。如果您需要更多详细信息,请告诉我。
  • 在回答之前,我想澄清一点。变量itemsList,但我没有看到您的代码向其中添加任何列表项。而且您总是在循环结束时清除它,这意味着无论您循环多少次,items.Count 都将保持为零。那么如果Random.Range 总是返回0,那么循环如何结束呢?
  • 我实际上就是因为这个原因才打算把这些东西拿走。有人建议但没有用。我明白了,你是说我应该在我的 foreach 语句中将 item 切换为 items 吗?

标签: c# random unity3d shuffle


【解决方案1】:

这个例子太复杂了,而且有很多与你提出的问题无关的代码。作为基本策略,您应该尝试隔离您认为有问题的代码,修复该问题,然后将其应用于更大的案例。

例如,您的基本逻辑至少有一个错误: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);
      }
    }
  }
}

【讨论】:

    【解决方案2】:

    我认为删除 items.Clear() 可能会起作用,原因我在评论中解释了。

    while (finalItems.Count < 5) {
       Item newItem = items[Random.Range(0, items.Count)];
       if (!finalItems.Contains(newItem)) {
           finalItems.Add(newItem);
       }
    }
    

    但是,我仍然假设您已经在某处拥有items 的列表(并且该列表必须大于 5,因为您将循环至少 5 次)。如果您不这样做,items.Count 仍将保持为 0,并使您的随机数变为 Random.Range(0,0)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2016-03-03
      • 2013-06-28
      • 2023-01-19
      • 2017-06-07
      • 1970-01-01
      • 2020-12-23
      相关资源
      最近更新 更多