유니티(Unity) 엔진 사용 시 스크립트 연결이 끊어진 게임 오브젝트를 찾는 방법

유니티 엔진 사용 시 스크립트를 유니티 에디터 밖에서 지우거나, 이동시키면서 메타 파일을 빠트리면 문제가 생깁니다. 그 문제는 그 스크립트를 사용하는 게임 오브젝트의 인스펙터 창에 ‘Missing (Mono Script)’라고 표시되면서 게임 오브젝트와 스크립트의 연결이 끊어지는 것입니다.

그 문제는 발견하기 어려우므로, 아래와 같은 스크립트를 사용해서 자동으로 찾는 게 좋습니다. 좀 더 작업하면 연결을 복구하는 기능도 추가할 수 있겠지만, 노력이 많이 필요하므로 굳이 그러진 않아도 될 것 같습니다.

아래 스크립트를 Editor 폴더에 MissingScriptFinder.cs로 저장하면 메뉴에서 사용 가능합니다.

using UnityEditor;
using UnityEngine;

public static class MissingScriptFinder
{
	static int missingScriptCount;
	
	[MenuItem("GameObject/Find Missing Scripts Recursively")]
	static void FindMissingScriptsRecursively()
	{
		missingScriptCount = 0;
		foreach (GameObject gameObject in Resources.FindObjectsOfTypeAll<GameObject>())
			FindMissingScriptsInGameObject(gameObject);
		Debug.Log("Found " + missingScriptCount + " missing scripts.");
	}

	static void FindMissingScriptsInGameObject(GameObject gameObject)
	{
		Component[] components = gameObject.GetComponents<Component>();
		for (int i = 0; i < components.Length; ++i)
			if (!components[i])
			{
				++missingScriptCount;
				Debug.LogWarning("'" + GetPath(gameObject) + "' has an empty script attached in position: " + i, gameObject);
			}
		foreach (Transform childTransform in gameObject.transform)
			FindMissingScriptsInGameObject(childTransform.gameObject);
	}

	static string GetPath(GameObject gameObject)
	{
		return AssetDatabase.Contains(gameObject) ? AssetDatabase.GetAssetPath(gameObject) : GetSceneGameObjectPath(gameObject);
	}

	static string GetSceneGameObjectPath(GameObject gameObject)
	{
		string path = gameObject.name;
		for (Transform transform = gameObject.transform; transform.parent; transform = transform.parent)
			path = transform.parent.name + "/" + path;
		return path;
	}
}

참고:

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중