Unity中如何向非静态类传递GameObject并解决字段初始化报错
问题修复方案
错误原因
报错是两个问题叠加导致的:
- Unity 不允许在类的字段定义阶段,直接用另一个非静态成员变量作为参数初始化其他字段。你写的字段初始化逻辑执行时机在
Awake、Start等生命周期函数之前,此时 Inspector 中挂载的item还未完成赋值,无法被读取。- 你当前的
Item类中,ItemName和ShownObj是构造函数内的局部变量,构造执行结束后就会被回收,无法作为类属性对外访问。
修复步骤
- 第一步:修正
Item类的字段定义,把需要对外访问的属性提到类层级
public class Item { // 公共类字段,可对外访问 public string ItemName; public GameObject ShownObj; public Item(string name, GameObject obj) { ItemName = name; ShownObj = obj; } }
- 第二步:把
Item实例的初始化逻辑移到 Unity 生命周期函数中执行,此时 Inspector 赋值的item已经完成加载
public GameObject item; // 仅声明字段,不直接初始化 public Item testItem; private void Awake() { // 在生命周期函数内完成实例初始化 testItem = new Item("test item", item); }
可选规避方案
如果需要在编辑阶段直接在 Inspector 配置 Item 属性,可以给 Item 类加上序列化特性,不需要手动写代码初始化:
// 加序列化特性后该类可在 Inspector 面板显示配置项 [System.Serializable] public class Item { public string ItemName; public GameObject ShownObj; }
调用代码仅需声明字段即可,可直接在 Inspector 面板赋值:
public Item testItem;
内容的提问来源于stack exchange,提问作者Mason Walker
相关产品推荐
相关产品推荐

