Version: 2020.3
에셋 데이터베이스
AssetDatabase 배칭

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

Unity는 다음의 경우 에셋 데이터베이스를 새로 고칩니다.

  • Unity 에디터가 다시 포커스를 얻는 경우(환경 설정 창에서 자동 새로고침을 활성화한 경우)
  • 메뉴에서 Assets > Refresh를 선택하는 경우
  • C#에서 AssetDatabase.Refresh를 호출하는 경우

일부 다른 AssetDatabase API는 Refresh()를 트리거하지만, 이는 지정된 에셋에 대해서만 트리거됩니다. 예: CreateAsset()ImportAsset().

Unity는 에셋 데이터베이스 새로고침 동안 다음의 절차를 수행합니다.

  1. 에셋 파일의 변경 사항을 찾은 후 소스 에셋 데이터베이스를 업데이트합니다.
  2. 코드 관련 파일(예: .dll, .asmdef, .asmref, .rsp 및 .cs 파일)을 임포트하고 컴파일합니다.
  3. 새로고침이 스크립트에서 호출되지 않은 경우 도메인을 다시 로드합니다.
  4. 임포트한 코드 관련 파일에 대해 모든 에셋을 포스트 프로세싱합니다.
  5. 코드와 관련이 없는 에셋을 임포트하고 임포트한 나머지 모든 에셋을 포스트 프로세싱합니다.
  6. 에셋을 핫 리로드합니다.

에셋 데이터베이스의 상세한 새로고침 프로세스

Unity는 에셋 데이터베이스 새로 고침 중에 이전 섹션에서 설명한 단계를 수행합니다. 이 섹션에서는 이러한 프로세스를 자세히 설명합니다. 이 단계는 루프 내에서 발생하며, 일부 단계에서는 새로고침 프로세스가 다시 시작될 수 있습니다(예 : 에셋을 임포트하면 Unity도 임포트해야 하는 다른 에셋이 생성되는 경우).

Unity는 다음 조건을 충족하면 에셋 데이터베이스 새로고침 루프를 다시 시작합니다.

  • 임포트 후 임포터가 사용한 파일이 디스크에서 변경된 경우.
  • OnPostProcessAllAssets에서 다음을 호출할 수 있습니다.
  • 임포트되는 파일의 타임스탬프가 임포트 프로세스 동안 변경되면 파일은 다시 임포트하기 위해 대기합니다.
  • 임포터가 임포트 도중 파일을 생성하는 경우(예를 들어 FBX 모델은 모델에서 텍스처를 추출하여 새로고침을 다시 시작할 수 있습니다).

디스크의 변경 사항 검색

When Unity looks for changes on disk, it scans the Assets and Packages folders in your Project to check if any files have been added, modified, or deleted since the last scan. It gathers any changes into a list to process in the next step.

소스 에셋 데이터베이스 업데이트

Unity가 파일 리스트를 수집하면 추가되거나 수정된 파일의 파일 해시를 가져옵니다. 그런 다음 해당 파일의 GUID로 에셋 데이터베이스를 업데이트하고 삭제된 것으로 감지된 파일 항목을 제거합니다.

종속성 추적

에셋 데이터베이스는 두 개 타입의 에셋 종속성, 즉 정적 종속성동적 종속성을 기록합니다. 에셋의 종속성이 변경되면 Unity는 해당 에셋의 재임포트를 트리거합니다.

정적 종속성

정적 종속성은 임포터가 기반하는 값, 설정 또는 프로퍼티입니다. 정적 종속성은 에셋 임포트 전에 알려져 있으며, 임포트 프로세스 동안 임포터 동작에 영향을 받지 않습니다. 에셋의 정적 종속성이 변경되면 Unity는 해당 에셋을 다시 임포트합니다.

다음은 일반적인 정적 종속성의 예입니다.

  • 에셋 이름
  • 에셋과 연결된 임포터의 ID
  • 임포터 버전
  • 현재 선택된 빌드 타겟 플랫폼
동적 종속성

Unity typically discovers the dynamic dependencies of an Asset during the import process. This is because these dependencies are defined by the content of the source asset. For example, a Shader might reference another Shader, and a Prefab might depend on other Prefabs.

The importer might also use a global state conditionally based on the content of the source asset, in which case it also becomes a dynamic dependency. Examples of this are the target platform, the Project’s color space, the graphics API, the scripting runtime version, or the Texture compression state.

Unity stores these dynamic dependencies of an Asset in an Asset Import Context.

코드 관련 파일 임포트 및 컴파일

변경되거나 추가된 파일 리스트에서 Unity는 코드와 관련된 파일을 수집하여 스크립트 컴파일 파이프라인으로 전송합니다. 컴파일러는 프로젝트의 스크립트 파일과 어셈블리 정의 파일을 사용하여 어셈블리를 생성합니다. 이 단계에 대한 자세한 내용은 스크립트 컴파일 어셈블리 정의 파일 문서를 참조하십시오.

도메인 다시 로드

Unity가 스크립트 변경 사항을 감지하면 C# 도메인을 다시 로드합니다. 이는 새로운 스크립트된 임포터가 생성될 수 있고 해당 로직이 잠재적으로 새로고침 대기열에 있는 에셋의 임포트 결과에 영향을 줄 수 있기 때문입니다. 이 단계는 Refresh()를 다시 시작하여 새로운 스크립트된 임포터가 제대로 동작하도록 만듭니다.

코드와 관련이 없는 에셋 임포트

Unity가 모든 코드와 관련된 에셋을 임포트하고 도메인을 다시 로드하면 나머지 에셋으로 이동합니다. 각 에셋의 임포터는 에셋 타입을 처리하고 파일 이름 확장자에 따라 임포트해야 하는 파일 타입을 식별합니다. 예를 들어 TextureImporter는 .jpg, .png 및 .psd 파일을 임포트합니다.

There are two types of importers: Native Importers and Scripted Importers, each of which is processed in a separate phase. The Native Importers group is processed first, and includes most of Unity’s built-in importers. Next, the Scripted importers are processed, which are custom importers that extend Unity’s import capabilities, and are written in C#.

When an importer imports an asset file, an AssetImportContext is generated.

The AssetImportContext is used to report the Static Dependencies of an asset.

또한 임포트 단계 동안 많은 콜백이 발생합니다.

전처리 에셋 임포터는 다음을 호출합니다.

후처리 에셋 임포터는 다음을 호출합니다.

모든 임포트가 완료될 때 트리거되는 마지막 포스트 프로세싱 콜백은 OnPostprocessAllAssets입니다.

Asset 폴더에서 새로고침 프로세스를 다시 시작하게 만드는 많은 상황이 있습니다. 다음은 그중 일부 예입니다.

  • 에셋 임포트가 실패한 경우

  • 새로고침의 임포트 단계 동안 에셋이 수정된 경우. 예를 들어 리스트의 파일이 수정되면 해당 수정 날짜가 이전 새로고침과 다를 수 있습니다. 이는 에디터에 포커스가 있는 동안 버전 관리 시스템에서 파일을 가져올 때 발생할 수 있습니다.

  • 임포트 동안 에셋이 다른 에셋을 생성한 경우. 예를 들어 FBX를 임포트할 때 텍스처가 FBX에서 추출되어 프로젝트에 배치될 수 있습니다. 즉 Unity가 해당 텍스처와 그에 따라 생성되는 아티팩트를 임포트해야 합니다.

  • 사전/사후 프로세스 콜백 중 하나 또는 OnPostProcessAllAssets 내에서 파일 재임포트를 강제로 적용하는 경우. 예를 들어 AssetDatabase.ForceReserializeAssets 또는 AssetImport.SaveAndReimport를 사용할 수 있습니다. 단, 무한 재임포트 루프가 일어나지 않도록 주의하십시오.

  • 스크립트 컴파일 후 어셈블리 재로드가 발생하는 경우. 새로고침 프로세스 동안 C# 파일을 생성하는 경우 해당 새 파일을 반드시 컴파일해야 Unity가 새로고침을 다시 시작합니다.

  • 에셋을 “텍스트 전용”으로 저장하지만 에셋을 바이너리로 직렬화해야 하는 경우, 재시작이 발생할 수 있습니다. (예를 들어 터레인이 포함된 씬은 바이너리로 직렬화해야 합니다. 터레인 데이터는 텍스트 파일에서 문자 배열로 확인하기 어려울 수 있습니다.)

핫 리로드

핫 리로드는 에디터가 열려 있는 동안 Unity가 변경 사항을 임포트하여 스크립트와 에셋에 적용하는 프로세스를 말합니다. 이 프로세스는 에디터가 플레이 모드에 있을 때와 플레이 모드에 있지 않을 때 모두 일어날 수 있습니다. 변경 사항을 적용하기 위해 애플리케이션이나 에디터를 다시 시작할 필요가 없습니다.

When you change and save a script, Unity hot-reloads all of the project’s script data. It first stores all serializable variable values in all loaded scripts, reloads the scripts, then restores the values. All of the data stored in non-serializable variables is lost during a hot reload.

Note: Assets imported by the (built-in DefaultImporter)[BuiltInImporters] are imported before script assets, so any script-defined PostProcessAllAssets callbacks are not called for default assets.

새로고침 종료

이러한 모든 단계가 끝나면 Refresh()가 완료되고 아티팩트 데이터베이스가 새로운 정보로 업데이트됩니다. 또한 디스크에 필요한 임포트 결과 파일이 생성됩니다.

에셋 데이터베이스
AssetDatabase 배칭
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961