You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:42:02