Version: 2021.1
언어: 한국어
에셋 메타데이터
에셋 데이터베이스 새로 고치기

에셋 데이터베이스

대부분의 에셋 유형을 사용할 때 Unity는 에셋의 소스 파일에서 게임 또는 실시간 애플리케이션에 사용할 수 있는 포맷으로 데이터를 전환해야 합니다. Unity는 전환된 파일, 그리고 전환된 파일과 연결된 데이터를 에셋 데이터베이스에 저장합니다.

대부분의 파일 포맷은 저장 공간을 절약하도록 최적화되어 있어서 전환 프로세스가 필요하지만, 게임 또는 실시간 애플리케이션의 경우에는 에셋 데이터가 하드웨어(예: CPU, 그래픽스 또는 오디오 하드웨어)에 적합한 포맷이어야 합니다. 예를 들어 Unity는 .png 이미지 파일을 텍스처로 임포트할 때에는 런타임 시점에 원본 .png 포맷의 데이터를 사용하지 않습니다. 대신, 텍스처를 임포트하면 Unity는 프로젝트의 Library 폴더에 저장된 다른 포맷으로 이미지를 새롭게 구현합니다. Unity 엔진의 Texture 클래스는 이러한 임포트된 버전을 사용하며, Unity는 이를 GPU에 업로드하여 실시간으로 표시합니다.

이후에 이미 임포트한 에셋의 소스 파일을 수정하는 경우 (또는 해당 종속성을 변경하는 경우) Unity는 해당 파일을 다시 임포트하고 임포트한 버전의 데이터를 업데이트합니다. 이러한 프로세스에 대한 자세한 내용은 에셋 데이터베이스 새로 고치기를 참조하십시오.

또한 에셋 데이터베이스는 에셋에 액세스하고 임포트 프로세스를 제어하거나 커스터마이즈할 때 사용할 수 있는 AssetDatabase API를 제공합니다.

참고: 이 문서는 에셋 데이터베이스의 버전 2를 참조합니다. 자세한 내용은 아래의 에셋 데이터베이스 버전을 참조하십시오.

에셋 임포트 종속성

에셋 데이터베이스는 각 에셋에 대한 모든 종속성을 추적하고, 임포트한 모든 에셋 버전의 캐시를 보관합니다.

에셋의 임포트 종속성은 임포트한 데이터에 영향을 줄 수 있는 모든 데이터로 구성됩니다. 예를 들어 에셋의 소스 파일뿐만 아니라, 에셋의 임포트 설정(예: 텍스처의 압축 타입) 또는 프로젝트의 타겟 플랫폼(예: PS4 하드웨어는 Android 하드웨어와 다른 포맷의 데이터를 필요로 함)도 종속성입니다. 이러한 종속성을 수정하면 임포트된 에셋의 캐싱된 버전이 유효하지 않게 되며, Unity는 변경 사항을 반영하기 위해 다시 임포트해야 합니다.

에셋 캐싱

에셋 캐시는 Unity가 임포트한 에셋 버전을 저장하는 곳입니다. Unity는 소스 에셋 파일과 해당 종속성에서 임포트한 버전을 항상 다시 생성하므로 임포트된 버전은 미리 계산된 데이터의 캐시로 취급됩니다. 따라서 Unity를 사용할 때 시간을 절약할 수 있습니다. 이러한 이유로 에셋 캐시의 파일을 버전 관리 시스템에서 제외해야 합니다.

Unity는 기본적으로 로컬 캐시를 사용합니다. 즉, 임포트된 버전의 에셋은 로컬 컴퓨터의 프로젝트 폴더에 있는 Library 폴더에 캐싱됩니다. 버전 관리에서 이 폴더를 제외하려면 ignore file 을 사용해야 합니다.

하지만 팀과 함께 일하고 버전 관리 시스템을 사용하는 경우 에셋 캐시를 LAN 전체에 공유하는 Unity 액셀러레이터도 사용하면 도움을 받을 수 있습니다.

캐싱된 에셋은 버전 관리 시스템에 저장하기에 적합하지 않습니다. 예를 들어 팀원들이 프로젝트를 함께 진행하고 로컬 캐싱을 사용하는 경우에는 에셋이나 종속성이 변경될 때 모든 팀원의 Unity 사본이 임포트 프로세스를 수행하므로 많은 시간이 소비됩니다.

Unity는 Unity 액셀러레이터라는 솔루션을 제공합니다. 액셀러레이터의 기능 중 하나는 소프트웨어 에이전트입니다. 소프트웨어 에이전트는 에셋의 캐싱된 버전을 저장하고 동일한 로컬 네트워크에서 함께 프로젝트를 수행하는 모든 사람들에게 제공합니다. 즉 한 명의 팀원만 특정 에셋을 임포트하면 됩니다. 그러면 임포트된 버전의 에셋이 액셀러레이터에 저장되어 다른 팀원들이 임포트 프로세스를 로컬에서 기다릴 필요 없이 캐싱된 버전을 다운로드할 수 있습니다.

소스 에셋과 아티팩트

Unity는 두 개의 데이터베이스 파일을 라이브러리 폴더에 유지하는데, 이를 통칭하여 에셋 데이터베이스라고 부릅니다. 이러한 두 데이터베이스는 소스 에셋 파일에 대한 정보와 아티팩트(임포트 결과에 대한 정보)를 기록합니다.

소스 에셋 데이터베이스

소스 에셋 데이터베이스에는 Unity가 파일이 수정되었는지 여부, 그리고 그에 따라 파일을 다시 임포트해야 하는지 여부를 결정하는 데 사용하는 소스 에셋 파일의 메타 정보가 들어 있습니다. 여기에는 마지막 수정 날짜, 파일 콘텐츠 해시, GUID에 대한 정보와 기타 메타 정보가 포함됩니다.

아티팩트 데이터베이스

아티팩트는 임포트 프로세스의 결과입니다. 아티팩트 데이터베이스에는 각 소스 에셋의 임포트 결과 정보가 들어 있습니다. 각 아티팩트는 임포트 종속성 정보, 아티팩트 메타 정보, 아티팩트 파일 리스트를 포함합니다.

참고: 데이터베이스 파일은 프로젝트의 Library 폴더에 있으므로 버전 관리 시스템에서 제외해야 합니다. 데이터베이스 파일은 다음 위치에서 찾을 수 있습니다.

  • 소스 에셋 데이터베이스: Library\SourceAssetDB
  • 아티팩트 데이터베이스: Library\ArtifactDB

에셋 임포트

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();
    }
}

플랫폼 전환 및 재임포트

플랫폼 간에 전환할 경우 Unity가 에셋을 다시 임포트할 수 있습니다. 이는 일반적으로 에셋을 임포트하는 방식이 플랫폼마다 다를 때 발생하며, 이러한 경우는 상당히 흔합니다. 예를 들어 플랫폼마다 텍스처 포맷이 다르므로 플랫폼마다 다른 텍스처를 임포트합니다.

에셋 데이터베이스 V2를 사용하는 경우 플랫폼은 에셋 데이터베이스가 Unity 빌트인 임포터의 임포트 결과를 저장하는 데 사용하는 해시의 일부입니다. 즉 다른 플랫폼의 에셋 임포트 결과는 별도의 캐싱된 데이터로 저장됩니다.

이러한 기능으로 인해 프로젝트에 새 에셋이 있는 플랫폼을 처음으로 전환하고 해당 에셋이 이 플랫폼에 대해 아직 임포트되지 않았다면 에셋을 다시 임포트합니다. 즉 해당 프로세스가 완료될 때까지 기다려야 합니다. 하지만 새로 임포트된 데이터는 이전 플랫폼에 대해 예전 데이터의 캐싱된 임포트를 덮어쓰지 않습니다.

따라서 에셋을 이미 임포트한 플랫폼으로 다시 전환할 경우 그러한 에셋 임포트 결과가 이미 캐싱되고 사용할 준비가 되어 있으므로 전환이 훨씬 더 빠릅니다.

에셋 데이터베이스 버전

이 문서는 에셋 데이터베이스의 버전 2, 즉 Unity 2019.3 이상에서 생성된 새 프로젝트의 기본 버전을 참조합니다. 레거시 버전(버전 1)은 이전 Unity 버전의 기본값이며 다른 방식으로 동작합니다. 레거시 버전은 Unity 2020 이상에서 사용할 수 없습니다.

에셋 메타데이터
에셋 데이터베이스 새로 고치기