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

Unity继承场景下多维数组无法正常传递的问题求助

问题解决:Unity继承中多维数组为空的问题

原因分析

Unity的序列化系统对多维数组(如GameObject[,])的支持存在缺陷。当子类继承自带有多维数组的MonoBehaviour父类时,Unity会重新序列化并创建一个新的多维数组实例,覆盖父类Awake方法中初始化的数组,导致子类访问到的是空数组。而单维数组、int/float/string等基本类型的序列化逻辑正常,因此不会出现此问题。

解决方案

方案1:禁用多维数组的序列化

在父类的多维数组字段上添加[NonSerialized]特性,阻止Unity对其进行序列化,这样子类访问的就是父类Awake中初始化的同一个数组实例:

using UnityEngine;

public class ScriptA : MonoBehaviour
{
    [NonSerialized]
    protected GameObject[,] boardFields = new GameObject[8, 8];

    void Awake()
    {
        boardFields[4, 0] = GameObject.Find("Canvas/Board/Fields/A4");
        Debug.Log(boardFields[4, 0]);
        // 其余初始化代码
    }
}

public class ScriptB : ScriptA
{
    void Start()
    {
        Debug.Log(boardFields[4, 0]); // 现在可正常获取对象
    }
}

方案2:改用单维数组模拟多维结构

如果需要保留序列化支持,可以用单维数组通过索引计算模拟多维数组,Unity对单维数组的序列化支持完全正常:

using UnityEngine;

public class ScriptA : MonoBehaviour
{
    protected GameObject[] boardFields = new GameObject[8 * 8];

    void Awake()
    {
        // 通过索引计算模拟[4,0]的位置
        int index = 4 + 0 * 8;
        boardFields[index] = GameObject.Find("Canvas/Board/Fields/A4");
        Debug.Log(boardFields[index]);
        // 其余初始化代码
    }
}

public class ScriptB : ScriptA
{
    void Start()
    {
        int index = 4 + 0 * 8;
        Debug.Log(boardFields[index]); // 正常获取对象
    }
}

内容的提问来源于stack exchange,提问作者Dupcjusz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:53:19