Version: Unity 6.0 (6000.0)
언어 : 한국어
Contents of the Asset Database
에셋 데이터베이스 워크플로 커스터마이즈

에셋 데이터베이스 새로 고침

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

  • Unity 에디터가 다시 포커스를 얻는 경우(Preferences 창에서 Auto-Refresh를 활성화한 경우)
  • 메뉴에서 Assets > Refresh를 선택하는 경우
  • C#에서 AssetDatabase.Refresh를 호출하는 경우

일부 다른 AssetDatabase API는 지정한 에셋에만 Refresh()를 트리거합니다. 예: CreateAsset()ImportAsset()

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

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

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

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

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

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

디스크의 변경 사항 검색

Unity는 디스크의 변경 사항을 찾을 때 프로젝트에서 AssetsPackages 폴더를 스캔하여 지난번 스캔 이후 추가되고, 수정되고, 삭제된 파일이 있는지 확인합니다. 모든 변경 사항을 목록에 수집하여 다음 단계에서 처리합니다.

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

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

종속성 추적

에셋 데이터베이스는 정적 종속성동적 종속성 같은 두 가지 유형의 에셋 종속성을 추적합니다. 에셋의 종속성이 변경되면 Unity는 해당 에셋을 다시 임포트합니다.

정적 종속성

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

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

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

일반적으로 Unity는 임포트 프로세스 중에 에셋의 동적 종속성을 발견합니다. 이러한 종속성은 소스 에셋의 콘텐츠에 의해 정의되기 때문입니다. 예를 들어 셰이더가 또 다른 셰이더를 참조하고 프리팹이 다른 프리팹에 종속될 수 있습니다.

임포터는 소스 에셋의 콘텐츠에 따라 조건부로 전역 상태를 사용할 수도 있으며, 이 경우에도 동적 종속성이 됩니다. 타겟 플랫폼, 프로젝트의 색 공간, 그래픽스 API, 스크립팅 런타임 버전 또는 텍스처 압축 상태를 예로 들 수 있습니다.

Unity는 에셋의 동적 종속성을 에셋 임포트 컨텍스트에 저장합니다.

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

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

도메인 다시 로드

Unity가 스크립트 변경 사항을 감지하면 C# 도메인을 다시 로드합니다. 이는 새 스크립트된 임포터가 생성되었을 수 있고, 해당 로직이 새로 고침 대기열의 에셋 임포트 결과에 영향을 미칠 가능성이 있기 때문입니다. 이 단계에서는 새 스크립트된 임포터가 적용되도록 Refresh()를 재시작합니다.

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

Unity가 모든 코드 관련 에셋을 임포트하고 도메인을 다시 로드하면 나머지 에셋으로 넘어갑니다. 각 에셋의 임포터는 해당 유형의 에셋을 처리하고 파일 이름 확장자에 따라 임포트해야 하는 파일 유형을 식별합니다. 예를 들어 TextureImporter는 .jpg, .png, .psd 파일을 가져오는 작업을 담당합니다.

임포터에는 다음의 두 가지 유형이 있습니다.

Unity는 모든 네이티브 임포터를 먼저 처리한 다음 별도의 단계에서 모든 스크립팅된 임포터를 처리합니다.

임포터가 에셋 파일을 임포트하면 Unity가 AssetImportContext를 생성합니다. AssetImportContext는 에셋의 정적 종속성을 보고합니다.

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

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

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

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

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

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

  • 새로 고침 임포트 단계에서 에셋이 수정된 경우. 예를 들어 목록의 파일이 수정되어 수정 날짜가 이전 새로 고침 날짜와 같지 않은 경우입니다. 에디터에 포커스가 있을 때 버전 관리 시스템에서 파일을 가져오기 시작하면 발생할 수 있습니다.

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

  • 프리/포스트 프로세스 콜백 중 하나 또는 OnPostProcessAllAssets 내부에서 파일을 강제로 다시 임포트하는 경우(예: AssetDatabase.ForceReserializeAssets 또는 AssetImport.SaveAndReimport 사용). 이렇게 하는 경우 무한히 다시 임포트하는 루프가 발생하지 않도록 주의해야 합니다.

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

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

핫 리로드

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

스크립트를 변경하고 저장하면 Unity가 프로젝트의 모든 스크립트 데이터를 핫 리로드합니다. 먼저 로드된 모든 스크립트에 모든 직렬화 가능한 변수 값을 저장하고, 스크립트를 다시 로드한 후 값을 복원합니다. 직렬화할 수 없는 변수에 저장된 모든 데이터는 핫 리로드 중에 손실됩니다.

이는 프로젝트의 모든 에디터 창과 모든 MonoBehaviour에 영향을 줍니다. 다른 직렬화 사례와 달리, Unity는 다시 로드할 때 SerializeField 속성이 없는 경우에도 기본으로 비공개 필드를 직렬화합니다.

참고: Unity는 빌트인 DefaultImporter에서 임포트한 에셋을 먼저 임포트한 후 스크립트 에셋을 임포트하므로 스크립트에서 정의된 PostProcessAllAssets를 기본 에셋에 호출하지 않습니다.

새로 고침 종료

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

Contents of the Asset Database
에셋 데이터베이스 워크플로 커스터마이즈