好久没有写博客了,真不好意思!本人是个拖延症患者当然还有一部分原因是本人比较懒,O(∩_∩)O哈哈~

上一篇博文介绍了通过简单的方式来查找Prefab或场景物件是否有丢脚本的(地址:http://www.7fires.cn/unitytechnique/149),但没有介绍在检查到脚本后改怎么去删除这些组件,难道是让美术或者策划去手工一个个的修改么?这当然是不行的,这次就来说说怎么删除这些缺失的组件。

研究过Unity的都知道,Unity的Prefab或者场景都是通过序列化的方式来保存,而Unity之所以会报丢失脚本引用的问题就是在反序列化时,根据序列化中的数据,找不到原先所引用的脚本,如果不想通过手工的方式来删除他的话,就只能通过脚本修改序列化的数据来达到真正的删除缺失的组件。

脚本代码如下:

[MenuItem("Tools/清除丢失组件")]
public static void ClearMissComponent()
{
    Transform[] transforms = Selection.GetTransforms(SelectionMode.Deep);
    foreach (var transform in transforms) {
        ClearMissComponent(transform.gameObject);
    }
}
 
private static void ClearMissComponent(GameObject go) {
    if (go == null) {
        return;
    }
    var components = go.GetComponents<Component>();
 
    SerializedObject serializedObject = new SerializedObject(go);
    SerializedProperty prop = serializedObject.FindProperty("m_Component");
 
    int r = 0;
    for (int j = 0; j < components.Length; j++) {
        if (components[j] == null) {
            prop.DeleteArrayElementAtIndex(j - r);
            r++;
            Debug.LogWarning("移除丢失组件: " + go.name, go);
        }
    }
    serializedObject.ApplyModifiedProperties();
}

通过上面的代码,只需选中需要检查的Prefab或者场景物件,就可以删除里面丢失了脚本的组件