Unity C#为Fish对象分配诱饵列表出现全量相同异常
问题原因
- 核心错误在输出逻辑:你在
Start的循环里输出诱饵时,遍历的是全局变量asignedLures,而不是每个Fish实例自带的lures属性。这个全局变量每次调用AsignLure都会被新的列表覆盖,所以循环输出时只能拿到最后一次生成鱼时赋值的诱饵列表,看起来所有鱼的诱饵都相同。 - 额外优化点:
fishName、asignedLures两个字段不需要定义为类全局变量,改为方法内局部变量可以避免意外的全局值覆盖问题。
修复后代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { List<Fish> generatedFish; string[] fishNames = {"Karas", "Karp", "Ploc" }; // Start is called before the first frame update void Start() { generatedFish = new List<Fish>(); generateFish(); foreach(Fish fish in generatedFish) { Debug.Log(fish.fishName); // 改为遍历当前鱼实例自带的诱饵列表 foreach(string lure in fish.lures) { Debug.Log(lure); } } } class Fish { public string fishName { get; set; } public List<string> lures { get; set; } } public void generateFish() { int numberOfGeneratedFish = 2; for(int i = 0; i <= numberOfGeneratedFish; i++) { string newFishName = AsignName(); generatedFish.Add(new Fish { fishName = newFishName, lures = AsignLure(newFishName) }); } } public string AsignName() { return fishNames[Random.Range(0, fishNames.Length)]; } public List<string> AsignLure(string fishName) { List<string> asignedLures; switch (fishName) { case "Karas": asignedLures = new List<string> {"corn", "dough", "worms" }; break; case "Karp": asignedLures = new List<string> { "potato", "corn", "pea" }; break; case "Ploc": asignedLures = new List<string> { "perlovka", "mastique" }; break; default: asignedLures = new List<string>(); break; } return asignedLures; } }
内容的提问来源于stack exchange,提问作者Oleksii Stetsenko
相关产品推荐
相关产品推荐

