게임 오브젝트에 있는 스크립트를 삭제하면 아래와 같은 경고가 발생한다.
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:
Unity Pro:
Unity 프리미엄 학습:
'개발 > Unity' 카테고리의 다른 글
유니티 UI - 코루틴 메시지 큐로 순서대로 함수 실행하기 (Execute Coroutines Run in Order using Message (0) | 2022.07.28 |
---|---|
유니티 - UI가 있는 경우 Raycast 제한하기 (Detecting when a touch is over UI element) (0) | 2022.07.28 |
유니티 Attribute - AddComponentMenu로 Script 메뉴 관리하기 (0) | 2022.07.27 |
유니티 - 다양한 캐스트 사용하기 (RayCast, BoxCast, SphereCast, CapsuleCast) (0) | 2022.07.25 |
유니티 에디터 - OnValidate와 Reset으로 디버깅하기 (0) | 2022.07.25 |
댓글