내부 처리/Behind the Scenes
Text-Based Scene Files

AssetDatabase

AssetDatabase는 프로젝트의 에셋에 액세스할 수 있는 API입니다. 에셋을 찾아 로드하는 방법이 있으며, 에셋을 생성, 삭제, 수정할 수 있는 방법 등등이 있습니다. Unity 에디터는 AssetDatabase를 사용하여 내부적으로 에셋 파일을 추적하여 에셋 및 그것을 참조하는 개체의 링크를 유지합니다. Unity는 프로젝트 폴더의 ​​모든 변경 사항을 추적할 필요가 있기 때문에 에셋 데이터를 액세스 또는 수정한 경우, 파일 시스템이 아닌 AssetDatable API를 항상 사용해야 합니다.

AssetDatabase 인터페이스는 에디터에서만 사용할 수 있으며, 빌드된 플레이어는 해당 함수가 없습니다. 기타 에디터 클래스들처럼 Editor폴더 밑에 있는 스크립트에서만 사용할 수 있습니다.(프로젝트에 “Editor”폴더가 없으면 기본 Assets폴더 밑에 “Editor” 폴더를 만드세요.)

에셋 임포트

Unity는 일반적으로 프로젝트에 드래그 앤 드롭 했을 때 에셋을 자동으로 임포트하지만, 스크립트에 통해 임포트도 할 수 있습니다. 이를 위해서는 [AssetDatabase.ImportAsset (../ScriptReference/AssetDatabase.ImportAsset.html) 메소드를 다음 예제와 같이 사용할 수 있습니다.

using UnityEngine;
using UnityEditor;

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

또한 AssetDatabase.ImportAsset을 호출 할때 추가 인수 [AssetDatabase.ImportAssetOptions (ScriptRef : ImportAssetOptions.html)를 전달할 수 있습니다. 스크립팅 레퍼런스 문서에서 다양한 옵션과 함수의 동작에 대해 찾을 수 있습니다.

에셋 로드

에디터는 에셋을 필요로 할 경우에만 로드합니다. 예를 들어 씬에 추가하거나 또는 인스펙터 패널에서 편집한 경우 등입니다. 그러나 에셋을 스크립트에서 로드 및 액세스하려면 AssetDatabase.LoadAssetAtPath (../ScriptReference/AssetDatabase.LoadAssetAtPath.html), AssetDatabase.LoadMainAssetAtPath (../ScriptReference/AssetDatabase.LoadMainAssetAtPath.html), AssetDatabase.LoadAllAssetRepresentationsAtPath (../ScriptReference/AssetDatabase.LoadAllAssetRepresentationsAtPath.html) 및 AssetDatabase.LoadAllAssetsAtPath (../ScriptReference/AssetDatabase.LoadAllAssetsAtPath.html)를 사용합니다. 자세한 내용은 스크립팅 설명서를 참조하십시오.

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를 이용한 파일 처리

Unity는 에셋 파일의 메타 데이터를 유지하기 위해 반드시 파일 시스템을 사용하여 생성, 이동, 삭제를 해야 하는 것은 아닙니다. 대신 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를 호출하세요. 이를 통해 데이터베이스에 변경 내용을 커밋하고 프로젝트를 갱신합니다.

내부 처리/Behind the Scenes
Text-Based Scene Files