Unity中引用无MonoBehaviour的脚本是否可行?数据能否正常传递?
问题1:Unity是否会自动获取DataHolder的引用?
- 答案是不会。DataHolder是普通C#类,既不继承MonoBehaviour也不继承ScriptableObject,Unity的序列化、Inspector自动绑定机制不会自动为该字段创建实例或赋值。
- 你当前代码中的
public DataHolder data字段如果没有手动赋值,默认值为null,运行到Update内的赋值逻辑时会直接抛出空引用异常。
问题2:上述逻辑能否正确完成数据传递?
- 只有你提前完成
data字段的初始化/赋值的前提下,赋值逻辑本身可以正常同步货币数据,但原有写法存在明显缺陷:- 没有对
data做非空校验,空引用崩溃风险极高 - 放在Update里每帧赋值完全没有必要,仅在货币数值变动时主动同步一次即可,会造成无谓的性能消耗
- DataHolder内的
dragonLevel、dragonMasterLevel数组同样没有初始化,直接访问也会触发空引用异常
- 没有对
参考修正代码
public class Money : MonoBehaviour { public int Gold; public int Platinum; public int Tokens; public DataHolder data = new DataHolder(); // 主动初始化实例 // 推荐在货币数值变动时调用该方法同步,替代每帧更新 public void SyncToDataHolder() { if (data == null) data = new DataHolder(); data.Platinum = Platinum; data.Tokens = Tokens; data.Gold = Gold; } // 如果必须实时同步,至少补充非空判断 private void Update() { if(data != null) { data.Platinum = Platinum; data.Tokens = Tokens; data.Gold = Gold; } } } public class DataHolder { // 初始化数组,长度根据实际业务调整即可 public int[] dragonLevel = new int[100]; public bool[] dragonMasterLevel = new bool[100]; public int Gold; public int Platinum; public int Tokens; }
内容的提问来源于stack exchange,提问作者Filip
相关产品推荐
相关产品推荐

