【问题标题】:Shuffling Items in Unity 3D在 Unity 3D 中洗牌项目
【发布时间】:2014-09-03 05:56:30
【问题描述】:

我有一个显示项目列表的数组脚本。

现在的问题是我只希望这个列表显示十个项目中的五个并且还洗牌,所以你不能每次开始新游戏时都有相同的列表

我在想是否应该实现Random.Range,但我不知道在哪里。

请帮助,并解释应该做什么。我对此还是有点陌生​​,谢谢。

这是脚本:

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

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 ? "" + item.password: " ", 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 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);
    }
}

【问题讨论】:

    标签: c# arrays random unity3d shuffle


    【解决方案1】:

    我假设您希望保持 items 不变而不删除任何项目,因此我建议创建第二个名为 finalItems 的列表,其中将包含您的 5 个随机项目。

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

    然后在您的 foreach 语句中,循环通过 finalItems 而不是 items

    这将在每场比赛中为您提供 5 个随机物品!

    【讨论】:

    • 我认为你的脚本工作它只是不显示项目的名称。我是否必须为 finalItems 创建另一个类,这样我才能创建一个变量以放入我的 GUI 中?
    • 我仍然无法让它随机化我不知道我是否做错了。我用 finalItems 替换了 foreach 语句中的所有项目,并将其余代码插入,但我无法看到随机化。
    • 我只是从上面的代码中删除,我还没有测试过。我认为随机性会起作用。如果您在运行时检查您的 RayCasting 组件,finalItems 是否包含 5 个项目?它们是随机的吗?如果您想确保不再使用items(以防您在其他地方使用它),您可以在Start 函数的末尾调用items.Clear() 来帮助抛出任何错误。 finalItems 应该具有随机性,因为这就是 Random.Range 的全部意义所在。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2021-06-14
    相关资源
    最近更新 更多