如何获取List中被点击GameObject的索引?
获取点击对象在List中的索引解决方案
嘿,我来给你解决这个问题!你要在点击实例化的GameObject时获取它在List里的索引,有两个实用的办法,看你需求选:
方法1:用List内置的IndexOf方法
这是最直接的方式,利用List自带的IndexOf方法查找当前对象在列表中的位置。不过要注意,这个方法会遍历列表查找元素,所以如果列表特别大、频繁调用的话性能会稍差,但你的场景是10个对象,完全没问题。
首先,确保你的ObjectA脚本能访问到那个静态的myObjects列表(假设包含这个列表的脚本类叫Spawner,记得替换成你实际的类名):
// ObjectA脚本中的OnMouseDown方法 void OnMouseDown() { // 调用Spawner类的静态列表,查找当前对象的索引 int objectIndex = Spawner.myObjects.IndexOf(gameObject); // 做个判断,防止对象不在列表中的情况(比如被移除或销毁) if (objectIndex != -1) { Debug.Log($"点击的对象在列表中的索引是: {objectIndex}"); } else { Debug.LogWarning("这个对象不在myObjects列表里哦!"); } }
方法2:实例化时直接存储索引(性能更优)
如果担心性能,或者需要更直接的访问方式,可以在每个实例化的对象上提前存好它的索引。这种方式是O(1)的访问速度,不用遍历列表。
第一步,给ObjectA脚本加一个用来存储索引的字段:
// ObjectA脚本 public int objectIndex; // 存储当前对象在列表中的索引 void OnMouseDown() { Debug.Log($"点击的对象在列表中的索引是: {objectIndex}"); }
第二步,在实例化对象的时候,把循环的索引值赋值给这个字段:
// 包含myObjects列表的脚本中的Start方法 public static List<GameObject> myObjects = new List<GameObject>(); public GameObject ObjectA; // 预制体 void Start() { for (int i = 0; i < 10; i++) { GameObject ObjectACopy = Instantiate(ObjectA); // 获取ObjectA组件,赋值当前循环的索引 ObjectACopy.GetComponent<ObjectA>().objectIndex = i; myObjects.Add(ObjectACopy); } }
两种方法的小提示
- 方法1适合简单场景,不用额外维护字段,但要注意对象是否还在列表中(返回-1表示不在)。
- 方法2性能更好,但如果后续你对列表做了移除、排序等操作,存储的索引就会和实际列表位置不匹配了,这种场景下要谨慎使用。
内容的提问来源于stack exchange,提问作者Fan4i
相关产品推荐
相关产品推荐

