【发布时间】:2019-07-11 18:14:48
【问题描述】:
问题: 在遍历数组后尝试从列表中获取随机元素时出现 ArgumentOutOfRangeException 错误。
目标: 我正在尝试通过查找标签来激活父游戏对象内的随机子游戏对象。父级中有多个子游戏对象。如果该游戏对象带有我正在寻找的标签,我想将其挑选出来并根据其标签将其添加到新列表中。然后在遍历该数组之后,我想为每个新列表获取一个随机元素并将其设置为活动状态
[SerializeField] private List<Transform> heads = new List<Transform>();
[SerializeField] private List<Transform> bodys = new List<Transform>();
[SerializeField] private List<Transform> arms = new List<Transform>();
[SerializeField] private Transform[] bodyParts;
private GameObject head;
private GameObject backpack;
private GameObject arm;
void Start()
{
bodyParts = this.gameObject.GetComponentsInChildren<Transform>();
for (int i = 0; i < bodyParts.Length; i++)
{
switch (bodyParts[i].tag)
{
case "Head":
heads.Add(bodyParts[i]);
break;
case "Arm":
arms.Add(bodyParts[i]);
break;
case "Backpack":
backpacks.Add(bodyParts[i]);
break;
default:
Debug.Log("Not relevant");
break;
}
}
SetActiveBodyPart(heads, head);
SetActiveBodyPart(arms, arm);
SetActiveBodyPart(backpacks, backpack);
}
void SetActiveBodyPart(List<Transform> whichBodyParts, GameObject whichBodyPart)
{
if (whichBodyParts != null)
{
whichBodyPart = whichBodyParts[Random.Range(0, whichBodyParts.Count)].gameObject;
if (!whichBodyPart.activeSelf)
{
whichBodyPart.SetActive(true);
}
}
else Debug.Log("Nothing here...");
}
我在这一行遇到错误:
whichBodyPart = whichBodyParts[Random.Range(0, whichBodyParts.Count)].gameObject;
当我手动停用父级中的所有子游戏对象并开始游戏时,Unity 编辑器中的列表返回 0,但我希望输出为正整数
【问题讨论】:
-
您目前不检查列表是否为空。所以如果whichBodyPart中有0个对象,你会尝试索引进去,任何索引都是无效的。
-
快速学会调试程序代码会有很大帮助。
-
所以我尝试添加
whichBodyParts.Count > 0,是的,它没有给我带来任何错误,而是给我带来了Nothing here...。似乎我与上面的代码有关。据我了解,因为我包含了bodyParts = this.gameObject.GetComponentsInChildren<Transform>();并且还将所有子对象设置为停用。也许这就是问题 -
@CodeCaster 不,
Random.Range(0,1);永远不会返回 1。Random.Range(int, int)的上限 is exclusive。 -
@Ruzihm 啊,浮动重载是不同的。我的立场是正确的。