Unity는 다음의 경우 에셋 데이터베이스를 새로 고칩니다.
일부 다른 AssetDatabase API는 Refresh()를 트리거하지만, 이는 지정된 에셋에 대해서만 트리거됩니다. 예: CreateAsset() 및 ImportAsset().
Unity는 에셋 데이터베이스 새로고침 동안 다음의 절차를 수행합니다.
Unity는 에셋 데이터베이스 새로 고침 중에 이전 섹션에서 설명한 단계를 수행합니다. 이 섹션에서는 이러한 프로세스를 자세히 설명합니다. 이 단계는 루프 내에서 발생하며, 일부 단계에서는 새로고침 프로세스가 다시 시작될 수 있습니다(예 : 에셋을 임포트하면 Unity도 임포트해야 하는 다른 에셋이 생성되는 경우).
Unity는 다음 조건을 충족하면 에셋 데이터베이스 새로고침 루프를 다시 시작합니다.
Unity는 디스크의 변경 사항을 찾을 때 프로젝트의 Assets 과 Packages 폴더를 스캔하여 지난번 스캔 이후 추가되고, 수정되고, 삭제된 파일이 있는지 확인합니다. 또한 다음 단계에서 처리하기 위해 모든 변경 사항을 리스트에 수집합니다.
Unity가 파일 리스트를 수집하면 추가되거나 수정된 파일의 파일 해시를 가져옵니다. 그런 다음 해당 파일의 GUID로 에셋 데이터베이스를 업데이트하고 삭제된 것으로 감지된 파일 항목을 제거합니다.
에셋 데이터베이스는 두 개 타입의 에셋 종속성, 즉 정적 종속성과 동적 종속성을 기록합니다. 에셋의 종속성이 변경되면 Unity는 해당 에셋의 재임포트를 트리거합니다.
정적 종속성은 임포터가 기반하는 값, 설정 또는 프로퍼티입니다. 정적 종속성은 에셋 임포트 전에 알려져 있으며, 임포트 프로세스 동안 임포터 동작에 영향을 받지 않습니다. 에셋의 정적 종속성이 변경되면 Unity는 해당 에셋을 다시 임포트합니다.
다음은 일반적인 정적 종속성의 예입니다.
일반적으로 Unity는 임포트 프로세스 동안 에셋의 동적 종속성을 감지합니다. 이러한 종속성은 소스 에셋의 콘텐츠에 의해 정의되기 때문입니다. 예를 들어 셰이더는 다른 셰이더를 참조할 수 있고, 프리팹은 다른 프리팹에 기반할 수 있습니다.
또한 임포터는 소스 에셋의 콘텐츠에 따라 전역 상태를 조건부로 사용하며, 이러한 경우에도 동적 종속성이 됩니다. 이러한 예로는 타겟 플랫폼, 프로젝트의 색 공간, 그래픽스 API, 스크립팅 런타임 버전, 텍스처 압축 상태 등을 들 수 있습니다.
Unity는 에셋의 동적 종속성을 에셋 임포트 컨텍스트에 저장합니다.
변경되거나 추가된 파일 리스트에서 Unity는 코드와 관련된 파일을 수집하여 스크립트 컴파일 파이프라인으로 전송합니다. 컴파일러는 프로젝트의 스크립트 파일과 어셈블리 정의 파일을 사용하여 어셈블리를 생성합니다. 이 단계에 대한 자세한 내용은 스크립트 컴파일 어셈블리 정의 파일 문서를 참조하십시오.
Unity가 스크립트 변경 사항을 감지하면 C# 도메인을 다시 로드합니다. 이는 새로운 스크립트된 임포터가 생성될 수 있고 해당 로직이 잠재적으로 새로고침 대기열에 있는 에셋의 임포트 결과에 영향을 줄 수 있기 때문입니다. 이 단계는 Refresh()를 다시 시작하여 새로운 스크립트된 임포터가 제대로 동작하도록 만듭니다.
Unity가 모든 코드와 관련된 에셋을 임포트하고 도메인을 다시 로드하면 나머지 에셋으로 이동합니다. 각 에셋의 임포터는 에셋 타입을 처리하고 파일 이름 확장자에 따라 임포트해야 하는 파일 타입을 식별합니다. 예를 들어 TextureImporter는 .jpg, .png 및 .psd 파일을 임포트합니다.
임포터에는 두 가지 타입으로 네이티브 임포터와 스크립트된 임포터가 있으며 각각 별도의 단계에서 처리됩니다. 네이티브 임포터 그룹이 먼저 처리되며 대부분의 Unity 빌트인 임포터가 여기에 포함됩니다. 그 다음 Unity의 임포트 기능을 확장한 커스텀 임포터인 스크립트된 임포터가 처리되며 C#으로 작성되었습니다.
임포터가 에셋 파일을 임포트하면 AssetImportContext가 생성됩니다.
AssetImportContext는 에셋의 정적 종속성을 보고하는 데 사용됩니다.
또한 임포트 단계 동안 많은 콜백이 발생합니다.
전처리 에셋 임포터는 다음을 호출합니다.
OnPreprocessAsset
OnPreprocessAnimation
OnPreprocessAudio
OnPreprocessModel
OnPreprocessSpeedTree
OnPreprocessTexture
후처리 에셋 임포터는 다음을 호출합니다.
OnAssignMaterialModel
OnPostprocessAnimation
OnPostprocessAssetbundleNameChanged
OnPostprocessAudio
OnPostprocessCubemap
OnPostprocessGameObjectWithAnimatedUserProperties
OnPostprocessGameObjectWithUserProperties
OnPostprocessMaterial
OnPostprocessMeshHierarchy
OnPostprocessModel
OnPostprocessSpeedTree
OnPostprocessSprites
OnPostprocessTexture
모든 임포트가 완료될 때 트리거되는 마지막 포스트 프로세싱 콜백은 OnPostprocessAllAssets
입니다.
Asset 폴더에서 새로고침 프로세스를 다시 시작하게 만드는 많은 상황이 있습니다. 다음은 그중 일부 예입니다.
에셋 임포트가 실패한 경우
새로고침의 임포트 단계 동안 에셋이 수정된 경우. 예를 들어 리스트의 파일이 수정되면 해당 수정 날짜가 이전 새로고침과 다를 수 있습니다. 이는 에디터에 포커스가 있는 동안 버전 관리 시스템에서 파일을 가져올 때 발생할 수 있습니다.
임포트 동안 에셋이 다른 에셋을 생성한 경우. 예를 들어 FBX를 임포트할 때 텍스처가 FBX에서 추출되어 프로젝트에 배치될 수 있습니다. 즉 Unity가 해당 텍스처와 그에 따라 생성되는 아티팩트를 임포트해야 합니다.
사전/사후 프로세스 콜백 중 하나 또는 OnPostProcessAllAssets 내에서 파일 재임포트를 강제로 적용하는 경우. 예를 들어 AssetDatabase.ForceReserializeAssets
또는 AssetImport.SaveAndReimport
를 사용할 수 있습니다. 단, 무한 재임포트 루프가 일어나지 않도록 주의하십시오.
스크립트 컴파일 후 어셈블리 재로드가 발생하는 경우. 새로고침 프로세스 동안 C# 파일을 생성하는 경우 해당 새 파일을 반드시 컴파일해야 Unity가 새로고침을 다시 시작합니다.
에셋을 “텍스트 전용”으로 저장하지만 에셋을 바이너리로 직렬화해야 하는 경우, 재시작이 발생할 수 있습니다. (예를 들어 터레인이 포함된 씬은 바이너리로 직렬화해야 합니다. 터레인 데이터는 텍스트 파일에서 문자 배열로 확인하기 어려울 수 있습니다.)
핫 리로드는 에디터가 열려 있는 동안 Unity가 변경 사항을 임포트하여 스크립트와 에셋에 적용하는 프로세스를 말합니다. 이 프로세스는 에디터가 플레이 모드에 있을 때와 플레이 모드에 있지 않을 때 모두 일어날 수 있습니다. 변경 사항을 적용하기 위해 애플리케이션이나 에디터를 다시 시작할 필요가 없습니다.
스크립트를 변경해서 저장하면 Unity가 프로젝트의 모든 스크립트 데이터를 핫 리로드합니다. 우선 로드된 모든 스크립트에서 직렬화 가능한 변수 값을 저장하고 다시 스크립트를 로드한 후 값을 복원합니다. 직렬화할 수 없는 변수에 저장된 모든 데이터는 핫 리로드 중에 잃게 됩니다.
참고: (built-in DefaultImporter)[BuiltInImporters]에 의해 임포트된 에셋은 스크립트 에셋 전에 임포트되므로 스크립트에서 정의된 PostProcessAllAssets 콜백이 기본 에셋에 대해 호출되지 않습니다.
이러한 모든 단계가 끝나면 Refresh()가 완료되고 아티팩트 데이터베이스가 새로운 정보로 업데이트됩니다. 또한 디스크에 필요한 임포트 결과 파일이 생성됩니다.