씬의 기반 작업(Behind the Scenes)
텍스트 기반 씬 파일(Text-Based Scene Files)

AssetDatabase

AssetDatabase는 프로젝트에 포함된 에셋에 접근하게 해주는 API입니다. 특히 에셋을 찾고 로드하며 생성, 삭제, 수정하는 메서드를 제공합니다. Unity 에디터는 내부적으로 AssetDatabase를 사용해 에셋 파일을 추적하고 에셋과 이를 참조하는 오브젝트 사이의 연결을 유지합니다. Unity는 프로젝트 폴더의 ​​모든 변경 사항을 추적해야 하므로 에셋 데이터의 접근이나 수정을 원할 때는 반드시 파일 시스템 대신 AssetDatabase API를 사용해야 합니다.

AssetDatabase 인터페이스는 에디터에서만 사용 가능하며 빌드된 플레이어에는 기능이 없습니다. 다른 에디터 클래스와 마찬가지로 Editor 폴더에 위치한 스크립트에만 사용 가능합니다(해당 폴더가 없다면 프로젝트의 메인 Assets 폴더에 “Editor”라는 이름의 폴더를 생성합니다).

에셋 임포트

Unity는 일반적으로 에셋이 프로젝트에 드래그됐을 때 자동적으로 임포트하지만 스크립트 컨트롤로 임포트할 수도 있습니다. 그렇게 하려면 아래의 예처럼 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 호출에 전달할 수 있습니다. 스크립팅 레퍼런스 페이지는 서로 다른 옵션과 이것이 함수의 동작에 미치는 영향을 기록합니다.

에셋 로드

에디터는 에셋이 씬에 추가되거나 인스펙터 패널에서 편집된 경우 등 필요한 때만 에셋을 로드합니다. 하지만 AssetDatabase.LoadAssetAtPath, AssetDatabase.LoadMainAssetAtPath, AssetDatabase.LoadAllAssetRepresentationsAtPath, AssetDatabase.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를 이용한 파일 작업

Unity는 에셋 파일의 메타 데이터를 유지하므로 파일 시스템을 사용해 생성, 이동 또는 삭제를 해서는 절대 안 됩니다. 대신 AssetDatabase.Contains, AssetDatabase.CreateAsset, AssetDatabase.CreateFolder, AssetDatabase.RenameAsset, AssetDatabase.CopyAsset, AssetDatabase.MoveAsset, AssetDatabase.MoveAssetToTrash, AssetDatabase.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)