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
相关产品推荐
相关产品推荐

