我在这里做错了什么Unity 3D
本文关键字:Unity 3D 什么 错了 在这里 | 更新日期: 2023-09-27 18:13:19
我写这个脚本已经有几个星期了。我有这个脚本,其中的项目是在一个列表洗牌每次新游戏开始。我不知道为什么,但我似乎不能洗牌一个项目列表。请帮助,并为自己测试,如果你可以。也请向我解释什么可能是问题,或者我能做些什么来解决它,我还是很新的。
`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);
}
}
`
这个示例太复杂了,并且有许多与您似乎要问的问题无关的代码。作为一种基本策略,您应该尝试隔离您认为有问题的代码,修复该问题,然后将其应用于更大的情况。
例如,你的基本逻辑至少有一个错误:随机。Range是包括,所以除非使用"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);
}
}
}
}
我认为删除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)
。