如何检查Transform数组空项 处理Inspector未赋值引用异常
Unity Inspector数组未赋值元素的兼容处理方案
Unity中在Inspector面板为数组/列表预分配元素槽位但未绑定对应对象时,数组长度会按预设的槽位数量生成,未绑定的槽位值为null。仅判断数组本身不为null、长度大于0无法覆盖这类空元素场景,访问空元素的成员时就会抛出UnassignedReferenceException,可以通过以下几种方式做兼容:
- 遍历访问时做逐元素空校验
所有访问数组元素属性、方法的逻辑前,先判断当前元素是否为null,空元素直接跳过即可。注意Unity重载了UnityEngine.Object的相等运算符,直接用== null判断可以同时识别两种空场景:一是Inspector槽位未绑定对象的空,二是绑定的对象已被场景/资源删除但引用残留的“伪非空”场景。
参考代码:// 先校验数组本身合法性 if (lookObjects != null && lookObjects.Length > 0) { foreach (var target in lookObjects) { // 逐元素判空,空元素直接跳过 if (target == null) continue; // 确认元素非空后再执行逻辑 Vector3 lookAt = target.position - transform.position; // 其余业务逻辑... } } - 生命周期初始阶段过滤空元素
如果不想在每次遍历数组时重复写判空逻辑,可以在Awake或Start阶段提前过滤数组内所有空元素,重新生成仅包含有效对象的数组,后续业务逻辑直接使用即可。
参考代码:using System.Linq; private void Awake() { if (lookObjects == null) { lookObjects = new Transform[0]; return; } // 过滤所有空元素,重写数组 lookObjects = lookObjects.Where(obj => obj != null).ToArray(); } - 编辑器阶段提前提示未绑定问题
可以实现OnValidate方法,在Inspector面板数值发生变动时自动检测数组内的空槽,打印警告提醒开发人员及时补全绑定,把问题拦截在运行前。
参考代码:private void OnValidate() { if (lookObjects == null) return; for (int i = 0; i < lookObjects.Length; i++) { if (lookObjects[i] == null) { Debug.LogWarning($"lookObjects数组第 {i} 位元素未绑定对象,请检查Inspector赋值", this); } } }
注意:不要使用
ReferenceEquals(target, null)判断Unity对象是否为空,该方法会绕过Unity的对象生命周期校验,将已销毁的对象判定为非空,仍然会触发运行时异常。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

