在修改预制体时,会经常删除原本脚本引用到的节点,这会到导致脚本中变量的引用丢失;因此可以借助工具来提示修改者,删除节点可能导致引用丢失。
思路:将脚本对象序列化,判断属性引用ObjectReferenValue是否为空,且ObjectReferenceInstanceIDValue是否不为零,以此来判断是否丢失引用。具体代码如下:
private static void CheckMissingReferenceScript(GameObject go)
{
if (null == go) return;
MonoBehaviour[] scripts = go.GetComponentsInChildren<MonoBehaviour>(true);
if (null != scripts)
{
string tips = string.Empty;
for (int i = 0; i < scripts.Length; i++)
{
MonoBehaviour mono = scripts[i];
if (null == mono) continue;
SerializedObject tempObject = new SerializedObject(mono);
SerializedProperty temProperty = tempObject.GetIterator();
while (temProperty.NextVisible(true))
{
if (temProperty.propertyType == SerializedPropertyType.ObjectReference
&& temProperty.objectReferenceValue == null
&& temProperty.objectReferenceInstanceIDValue != 0)
{
tips += mono.GetType().ToString() + "| |" + temProperty.propertyPath + "引用丢失\t\n";
}
}
}
if (!string.IsNullOrEmpty(tips))
{
EditorUtility.DisplayDialog(tips, "", "确定");
}
}
}
这个脚本可以检查出哪个脚本上哪个属性引用丢失。