C# Unity 如何在另一个类中调用结构体定义的对象数组
Unity C# 跨类调用结构体数组解决方案
itemList是ClassA的实例成员,你需要先在ClassB中获取到ClassA的实例引用才能访问,以下是Unity开发中3种常用的实现方式:
- 方式1:Inspector拖拽赋值(新手友好,无需额外查找逻辑)
public class ClassB : MonoBehaviour { // 公开字段会在Unity Inspector中生成赋值槽 public ClassA classAInstance; private void TestGetItemInfo() { // 增加判空逻辑避免空引用报错 if(classAInstance != null && classAInstance.itemList != null) { // 遍历访问所有元素的属性 foreach (var item in classAInstance.itemList) { Debug.Log($"物品名称:{item.name},物品价格:{item.price}"); } // 也可以直接访问指定索引的元素,比如第一个元素的obj属性: // GameObject targetObj = classAInstance.itemList[0].obj; } } }
代码编写完成后,把挂载了ClassA组件的游戏对象,拖到ClassB组件对应的classAInstance赋值槽即可。
- 方式2:动态查找获取实例(适合对象动态生成的场景)
public class ClassB : MonoBehaviour { private ClassA classAInstance; private void Awake() { // 查找场景中第一个挂载了ClassA组件的对象 classAInstance = FindObjectOfType<ClassA>(); } // 后续访问itemList的逻辑和方式1完全一致 }
- 方式3:ClassA设为单例(适合全局唯一的管理类场景)
先修改ClassA的代码增加单例逻辑:
public class ClassA : MonoBehaviour { // 全局可访问的静态单例实例 public static ClassA Instance { get; private set; } public struct Item { public string name; public int price; public GameObject obj; } public Item[] itemList; private void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); } else { Instance = this; } } }
之后在ClassB中无需提前存储引用,可直接调用:
public class ClassB : MonoBehaviour { private void TestGetItemInfo() { if (ClassA.Instance != null && ClassA.Instance.itemList != null) { Debug.Log(ClassA.Instance.itemList[0].name); } } }
注意:Item是值类型结构体,如果你需要在ClassB中修改Item的属性,不能直接修改遍历得到的临时变量,必须通过索引直接修改数组内的元素,比如
classAInstance.itemList[0].price = 200;,修改临时变量不会同步到原数组。
内容的提问来源于stack exchange,提问作者ben s
相关产品推荐
相关产品推荐

