유니티(Unity)에서 애셋이 어디에서 참조되고 있는지 알아 내는 방법

유니티에는 ‘Find References In Scene’이라는 기능이 있는데, 그 기능은 어떤 애셋이 씬의 어느 객체에서 참조되고 있는지 알고 싶을 때 유용합니다.

그런데 어떤 애셋을 어느 애셋에서 참조하고 있는지 확인하는 기능, 즉 ‘Find References In Assets’이 필요할 때도 있습니다. 왜냐하면 어떤 프리팹을 수정하려고 할 때 그 프리팹이 다른 애셋에서 참조되고 있다면, 그 애셋도 고려해야 하기 때문입니다.

다음은 위의 두 가지 기능을 한 번에 실행하는 것을 구현한 C# 소스 코드입니다. 이 코드를 사용하려면, 이 코드를 AssetReferenceFinder.cs 파일로 저장해 Editor 폴더에 넣어 두고, 애셋에서 마우스 오른쪽 버튼을 눌러서 컨텍스트 메뉴를 띄운 후에 Find References를 선택하면 됩니다.

// EditorUtility.IsPersistent 대신에 AssetDatabase.Contains를 쓰는 게 나은지는 모르겠습니다.

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

public class AssetReferenceFinder : EditorWindow
{
	Vector2 scrollPosition;
	List<Object> references = new List<Object>();

	[MenuItem("Assets/Find References", false, 20)]
	static void FindReferences()
	{
		var assetReferenceFinder = EditorWindow.GetWindow(typeof(AssetReferenceFinder)) as AssetReferenceFinder;

		foreach (var o in Resources.FindObjectsOfTypeAll(typeof(Object)))
			if (o != Selection.activeObject && (AssetDatabase.IsMainAsset(o) || !EditorUtility.IsPersistent(o) && o is GameObject))
				foreach (var dependency in EditorUtility.CollectDependencies(new [] { o }))
					if (dependency == Selection.activeObject)
						assetReferenceFinder.references.Add(o);
	}

	void OnGUI()
	{
		scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);

		foreach (var reference in references)
			EditorGUILayout.ObjectField(EditorUtility.IsPersistent(reference) ? "Asset: " : "Scene Object: ", reference, typeof(Object), true);

		EditorGUILayout.EndScrollView();
	}
}

참고로, 이 코드는 정적 참조만 고려하므로, AddComponent나 new를 이용해 실행 시간에 추가되는 애셋, 그리고 Plugins 폴더에 존재하는 일부 애셋의 참조 여부는 알아 내지 못합니다. 따라서, 이 코드를 안 쓰이는 애셋을 정리하는 용도로는 사용하지 않는 게 안전합니다.

참고:

Advertisements

2 thoughts on “유니티(Unity)에서 애셋이 어디에서 참조되고 있는지 알아 내는 방법

답글 남기기

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

WordPress.com 로고

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

Twitter 사진

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

Facebook 사진

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

Google+ photo

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

%s에 연결하는 중