본문 바로가기
개발/Unity

유니티 - Missing Component 찾기

by 피로물든딸기 2022. 7. 28.
반응형

Unity 전체 링크

 

게임 오브젝트에 있는 스크립트를 삭제하면 아래와 같은 경고가 발생한다.

 

The referenced script (Unknown) on this Behaviour is missing!

The referenced script on this Behaviour (Game Object 'GameObject') is missing!

위의 경고를 발생시키는 오브젝트가 어디에 있는지 한꺼번에 찾아보자.


아래와 같이 여러 스크립트가 있다고 가정하자.

 

그리고 DeleteScript들은 아래의 게임 오브젝트에 적절히 추가하자.

 

GameObject ~ GameObject (4) 까지 스크립트가 붙여야 한다.

 

이제 DeleteScript를 모두 삭제하자.

그러면 아래와 같이 Missing (Mono Script)와 함께 경고 창이 보이게 된다.

The associated script can not be loaded.
Please fix any compile errors and assign a valid scirpt.

 

위 케이스의 경우 GameObject (1)의 자식인 GameObject (2)를 제외하고 모두 Missing이 발생하도록 하였다.


이제 다시 빈 오브젝트(FindMissingObject)를 만들고 FindMissingObject.cs를 추가하자.

 

FindMissingObject.cs는 아래와 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FindMissingObject : MonoBehaviour
{
    string getObjectHierarchy(GameObject go)
    {
        string path = go.name;
        Transform tr = go.transform;

        while (tr.parent != null)
        {
            path = tr.parent.name + " / " + path;
            tr = tr.parent;
        }

        return path;
    }

    void Start()
    {
        GameObject[] all = FindObjectsOfType<GameObject>();

        foreach (GameObject go in all)
        {
            Component[] components = go.GetComponents<Component>();

            foreach (Component c in components)
            {
                if (c == null)
                {
                    string fullPath = getObjectHierarchy(go);
                    Debug.Log(fullPath + " has missing script!");
                }
            }
        }
    }
}

 

getObjectHierarchy는 오브젝트의 이름을 포함해 하이어라키를 반환한다.

자신의 이름부터 시작해 부모의 오브젝트가 없을 때까지 위로 올라가면서 path에 경로를 저장해둔다.

현재 GameObject (3)GameObject (1)의 자식인 GameObject (2)의 자식이다.

따라서 GameObject (1) / GameObject (2) / GameObject (3) 가 된다.

    string getObjectHierarchy(GameObject go)
    {
        string path = go.name;
        Transform tr = go.transform;

        while (tr.parent != null)
        {
            path = tr.parent.name + " / " + path;
            tr = tr.parent;
        }

        return path;
    }

 

FindObjectsOfType을 이용하면 해당 타입의 모든 오브젝트를 들고온다.

GameObject를 모두 들고와서 Component를 모두 검사한다.

Missing인 컴포넌트가 있다면 null을 반환하는 것을 이용하여 게임 씬에 경고를 일으키는 오브젝트를 찾을 수 있다.

    GameObject[] all = FindObjectsOfType<GameObject>();

    foreach (GameObject go in all)
    {
        Component[] components = go.GetComponents<Component>();

        foreach (Component c in components)
        {
            if (c == null)
            {
                string fullPath = getObjectHierarchy(go);
                Debug.Log(fullPath + " has missing script!");
            }
        }
    }

 

게임을 실행하면 아래와 같이 로그가 나오게 된다.

 

GameObject (1) / GameObject(2)는 스크립트가 있기 때문에 필터링되지 않은 것을 알 수 있다.

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글