AssetDatabase

AssetDatabase 는 사용자 프로젝트에 있는 에셋에 접근할 수있게하는 API입니다. 무엇보다 이것은 에셋을 찾고, 로드, 생성, 제거 그리고 수정할 수 있습니다. 유니티 에디터는 내부적으로 에셋 파일을 추적하고 에셋과 그것을 참조하는 객체의 연결을 관리하는데 AssetDatabase를 사용합니다. 유니티는 프로젝트 폴더의 모든 변경을 알고 있어야 하기 때문에 사용자가 에셋데이타에 접근 또는 수정을 원할 때는 파일 시스템보다 항상 AssetDatabase API를 이용해야 합니다.

AssetDatabase인터페이스는 에디터에서만 사용가능하며 빌드된 플레이어 에서는 기능이 없습니다. 다른 모든 에디터 클래스처럼 이것은 �Editor� 폴더에 위치한 스크립트에게만 사용가능 합니다(만약 프로젝트의 메인 에셋 폴더에 에디터라는 라는 폴더가 존재하지 않으면 생성하십시오).

에셋 불러오기

유니티는 보통 프로젝트에 드래그되어오면 자동으로 불려 지는데 스크립트 제어를 통해서도 불러 올수 있습니다. 이렇게하기 위해서는AssetDatabase.ImportAsset 를 아래의 예제처럼 사용합니다

using UnityEngine;
using UnityEditor;
 
public class ImportAsset {
	[MenuItem ("AssetDatabase/ImportExample")]
	static void ImportExample ()
	{
		AssetDatabase.ImportAsset("Assets/Textures/texture.jpg", ImportAssetOptions.Default);
	}
}

또한 추가로 AssetDatabase.ImportAssetOptions 타입의 인자를AssetDatabase.ImportAsset 함수에 넘겨줄 수 있습니다. 스크립팅 참조 페이지 에서는 다른 옵션들과 함수에서 그 옵션들의 영향을 알수 있습니다

에셋 로딩

The editor loads assets only as needed, say if they are added to the scene or edited from the Inspector panel. However, you can load and access assets from a script using AssetDatabase.LoadAssetAtPath, AssetDatabase.LoadMainAssetAtPath, AssetDatabase.LoadAllAssetRepresentationsAtPath and AssetDatabase.LoadAllAssetsAtPath . See the scripting documentation for further details.

에디터는 에셋을 필요할 때만 로딩을 하는데 예를들어 씬에 에셋이 추가되었거나 Inspector창에서 수정되었을 때입니다. 그러나AssetDatabase.LoadAssetAtPath, AssetDatabase.LoadMainAssetAtPath, AssetDatabase.LoadAllAssetRepresentationsAtPathAssetDatabase.LoadAllAssetsAtPath . 자세한 사항은 스크립팅 문서를 보세요.

using UnityEngine;
using UnityEditor;
 
public class ImportAsset {
	[MenuItem ("AssetDatabase/LoadAssetExample")]
	static void ImportExample ()
	{
		Texture2D t = AssetDatabase.LoadAssetAtPath("Assets/Textures/texture.jpg", typeof(Texture2D)) as Texture2D;
	}
}

AssetDatabase를 이용한 파일 작업

Since Unity keeps metadata about asset files, you should never create, move or delete them using the filesystem. Instead, you can use AssetDatabase.Contains, AssetDatabase.CreateAsset, AssetDatabase.CreateFolder, AssetDatabase.RenameAsset, AssetDatabase.CopyAsset, AssetDatabase.MoveAsset, AssetDatabase.MoveAssetToTrash and AssetDatabase.DeleteAsset.

유니티는 에셋 파일에 대한 메타 데이터를 가지고 있기 때문에 파일 시스템을 이용하여 그 파일들을 생성, 이동, 제거 하여서는 않됩니다. 대신 AssetDatabase.Contains, AssetDatabase.CreateAsset, AssetDatabase.CreateFolder, AssetDatabase.RenameAsset, AssetDatabase.CopyAsset, AssetDatabase.MoveAsset, AssetDatabase.MoveAssetToTrashAssetDatabase.DeleteAsset를 사용할 수 있습니다

public class AssetDatabaseIOExample {
	[MenuItem ("AssetDatabase/FileOperationsExample")]
	static void Example ()
	{
		string ret;
 
		// Create
		Material material = new Material (Shader.Find("Specular"));
		AssetDatabase.CreateAsset(material, "Assets/MyMaterial.mat");
		if(AssetDatabase.Contains(material))
			Debug.Log("Material asset created");
 
		// Rename
		ret = AssetDatabase.RenameAsset("Assets/MyMaterial.mat", "MyMaterialNew");
		if(ret == "")
			Debug.Log("Material asset renamed to MyMaterialNew");
		else
			Debug.Log(ret);
 
		// Create a Folder
		ret = AssetDatabase.CreateFolder("Assets", "NewFolder");
		if(AssetDatabase.GUIDToAssetPath(ret) != "")
			Debug.Log("Folder asset created");
		else
			Debug.Log("Couldn't find the GUID for the path");
 
		// Move
		ret = AssetDatabase.MoveAsset(AssetDatabase.GetAssetPath(material), "Assets/NewFolder/MyMaterialNew.mat");
		if(ret == "")
			Debug.Log("Material asset moved to NewFolder/MyMaterialNew.mat");
		else
			Debug.Log(ret);
 
		// Copy
		if(AssetDatabase.CopyAsset(AssetDatabase.GetAssetPath(material), "Assets/MyMaterialNew.mat"))
			Debug.Log("Material asset copied as Assets/MyMaterialNew.mat");
		else
			Debug.Log("Couldn't copy the material");
		// Manually refresh the Database to inform of a change
		AssetDatabase.Refresh();
		Material MaterialCopy = AssetDatabase.LoadAssetAtPath("Assets/MyMaterialNew.mat", typeof(Material)) as Material;
 
		// Move to Trash
		if(AssetDatabase.MoveAssetToTrash(AssetDatabase.GetAssetPath(MaterialCopy)))
			Debug.Log("MaterialCopy asset moved to trash");
 
		// Delete
		if(AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(material)))
			Debug.Log("Material asset deleted");
		if(AssetDatabase.DeleteAsset("Assets/NewFolder"))
			Debug.Log("NewFolder deleted");
 
		// Refresh the AssetDatabase after all the changes
		AssetDatabase.Refresh();
	}
}

AssetDatabase.Refresh 사용하기

에셋 변경을 끝마쳤을 때는AssetDatabase.Refresh를 불러서 변경 사항을 데이터 베이스에 저장(commit)하고 그 사항들을 프로젝트에 적용시킬 수 있습니다.

역링크