Version: Unity 6.0 (6000.0)
언어 : 한국어
Unity Accelerator Prometheus metrics reference
Contents of the Asset Database

에셋 데이터베이스

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

대부분의 파일 포맷은 스토리지 공간을 절약하기 위해 최적화되었지만, 게임이나 실시간 애플리케이션에서 에셋 데이터는 CPU, 그래픽스 또는 오디오 하드웨어와 같은 하드웨어가 즉시 사용할 준비가 된 포맷이어야 하기 때문에 전환 프로세스가 필요합니다. 예를 들어 Unity는 .png 이미지 파일을 텍스처로 임포트할 때 런타임 시 원래의 .png 포맷 데이터를 사용하지 않습니다. 대신 텍스처를 임포트할 때 Unity는 프로젝트의 Library 폴더에 저장된 다른 형식으로 이미지의 새 표현을 만듭니다. Unity 엔진의 Texture 클래스가 이 임포트된 버전을 사용하며, Unity는 이를 GPU에 업로드하여 실시간으로 표시합니다.

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

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

에셋 임포트 종속성

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

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

에셋 캐싱

에셋 캐시는 Unity가 임포트한 에셋 버전을 저장하는 곳입니다. Unity는 소스 에셋 파일과 그 종속성에서 임포트된 버전을 언제든지 다시 생성할 수 있으므로 임포트된 버전은 미리 계산된 데이터의 캐시로 취급되며 Unity를 사용할 때 시간을 단축할 수 있습니다. 이러한 이유로 에셋 캐시의 파일을 버전 관리 시스템에서 제외해야 합니다.

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

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

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

Unity는 이를 위해 Unity 액셀러레이터라는 솔루션을 제공합니다. 액셀러레이터의 기능 중 하나는 동일한 로컬 네트워크의 동일한 프로젝트에서 작업 중인 모든 사람에게 캐시된 에셋 버전을 저장하고 제공하는 소프트웨어 에이전트입니다. 즉, 한 명의 팀원이 특정 에셋을 임포트해야 합니다. 그러면 임포트한 에셋 버전이 액셀러레이터에 저장되며, 다른 팀원이 로컬에서 임포트 프로세스를 기다리는 대신 캐시된 버전을 다운로드할 수 있습니다.

소스 에셋과 아티팩트

Unity는 Library 폴더에 두 개의 데이터베이스 파일을 관리하며, 이 파일을 함께 에셋 데이터베이스라고 합니다. 이 두 데이터베이스는 소스 에셋 파일에 대한 정보를 추적하고, 임포트 결과에 대한 정보인 아티팩트를 추적합니다.

소스 에셋 데이터베이스

소스 에셋 데이터베이스에는 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.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를 이용한 파일 작업

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

플랫폼 전환 및 재임포트

플랫폼 간에 전환하면 Unity가 에셋을 다시 임포트할 수 있습니다. 이는 일반적으로 에셋 임포트 방식이 플랫폼마다 다를 때 자주 발생합니다. 예를 들어 플랫폼마다 텍스처 포맷이 다르므로 텍스처는 각 플랫폼마다 다르게 임포트됩니다.

에셋 데이터베이스 V2를 사용하는 경우 플랫폼은 에셋 데이터베이스가 Unity 빌트인 임포터의 임포트 결과를 저장하는 데 사용하는 해시의 일부입니다. 즉, 여러 플랫폼에서 에셋을 임포트하는 결과가 캐시된 데이터의 개별 조각으로 저장됩니다.

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

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

에셋 데이터베이스 버전

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

Unity Accelerator Prometheus metrics reference
Contents of the Asset Database