특수 폴더와 스크립트 컴파일 순서
.NET 프로파일 지원

스크립트 컴파일 및 어셈블리 정의 파일(Script compilation and assembly definition files)

설명

Unity 에디터는 스크립트가 관리되는 어셈블리로 컴파일되는 방법을 자동으로 정의합니다. Unity 에디터에서 반복 스크립트 변경 사항을 컴파일하는 시간은 일반적으로 프로젝트에 스크립트를 더 많이 추가할수록 늘어납니다.

어셈블리 정의 파일을 사용하여 폴더 안에 있는 스크립트를 기반으로 자체 관리되는 어셈블리를 정의할 수 있습니다. 이렇게 하려면 스크립트에서 변경 사항을 적용할 때 필요한 어셈블리만 다시 빌드되도록 하기 위해 프로젝트 스크립트를 종속성이 분명하게 정의된 여러 어셈블리로 분리해야 합니다. 이렇게 해서 컴파일 시간을 단축할 수 있습니다. 관리되는 어셈블리 하나는 Unity 프로젝트 안에 있는 라이브러리 하나와 같다라고 생각할 수 있습니다.

그림 1 - 스크립트 컴파일
그림 1 - 스크립트 컴파일

위의 그림 1은 프로젝트 스크립트를 여러 어셈블리로 분할하는 방법을 도해로 설명합니다. Main.dll의 스크립트만 변경하면 다른 어셈블리는 다시 컴파일되지 않습니다. Main.dll에는 더 적은 스크립트만 포함되므로 Assembly-CSharp.dll에 비해 컴파일 속도가 빠릅니다. 이와 마찬가지로 Stuff.dll의 스크립트만 변경하면 Main.dll과 Stuff.dll만 다시 컴파일됩니다.

어셈블리 정의 파일 사용 방법

어셈블리 정의 파일은 Assets > Create > Assembly Definition 을 선택하여 생성할 수 있는 에셋 파일입니다. 이 파일의 확장자는 .asmdef입니다.

어셈블리 정의 파일을 Unity 프로젝트의 폴더에 추가하여 폴더의 모든 스크립트를 어셈블리로 컴파일합니다. 인스펙터에서 어셈블리 이름을 설정합니다.

참고: 어셈블리 정의 파일이 있는 폴더의 이름과 어셈블리 정의 파일의 파일 이름은 어셈블리의 이름에 영향을 미치지 않습니다.

그림 2 - 임포트 설정 예
그림 2 - 임포트 설정 예

또한 인스펙터를 사용하여 프로젝트의 다른 어셈블리 정의 파일에 레퍼런스를 추가하십시오. 인스펙터를 보려면 어셈블리 정의 파일을 클릭해서 표시해야 합니다. 레퍼런스를 추가하려면 레퍼런스(References) 섹션의 + 아이콘을 클릭하여 파일을 선택하십시오.

Unity는 레퍼런스를 사용하여 어셈블리를 컴파일하고 어셈블리 간 종속성을 정의합니다.

테스트용으로 어셈블리를 표시하려면 인스펙터에서 어셈블리 테스트(Test Assemblies)를 활성화하십시오. 그러면 어셈블리 정의 파일의 unit.framework.dll 및 UnityEngine.TestRunner.dll에 레퍼런스가 추가됩니다.

테스트용으로 어셈블리를 표시하는 경우 다음 사항을 확인하십시오.

  • 사전 정의된 어셈블리(Assembly-CSharp.dll etc.)는 테스트용으로 표시된 어셈블리 정의 파일을 자동으로 참조하지 않습니다.

  • 어셈블리는 노멀 빌드에 포함되지 않습니다. 플레이어 빌드에 어셈블리를 포함하려면 스크립트를 빌드할 때 BuildOptions.IncludeTestAssemblies를 사용하십시오. 단, 빌드에 있는 어셈블리만 포함되고 아무 테스트도 실행하지 않습니다.

참고: 어셈블리 내 스크립트에서 안전하지 않은 키워드를 사용하는 경우 인스펙터에서 안전하지 않은 코드 허용(Allow ‘unsafe’ Code) 옵션을 활성화해야 합니다. 그러면 어셈블리를 컴파일할 때 안전하지 않은 옵션을 C# 컴파일러에 전달합니다.

인스펙터에서 어셈블리 정의 파일의 플랫폼 호환성을 설정합니다. 특정 플랫폼을 제외하거나 포함시킬 수 있습니다.

폴더 계층 구조 안의 여러 어셈블리 정의 파일

폴더 계층 구조 안에 여러 어셈블리 정의 파일(확장자: .asmdef)이 있으면 경로 거리가 가장 짧은 어셈블리 정의 파일에 각 스크립트가 추가됩니다.

예:

Assets/ExampleFolder/MyLibrary.asmdef 파일과 Assets/ExampleFolder/ExampleFolder2/Utility.asmdef 파일이 있는 경우,

  • Assets > ExampleFolder > ExampleFolder2 폴더 안에 있는 모든 스크립트는 정의된 어셈블리인 Assets/ExampleFolder/ExampleFolder2/Utility.asmdef 파일에 컴파일됩니다.

  • Assets > ExampleFolder 에 있는 파일 중 Assets > ExampleFolder > ExampleFolder2 폴더 안에 있지 않은 파일은 정의된 어셈블리인 Assets/ExampleFolder/MyLibrary.asmdef 파일에 컴파일됩니다.

어셈블리 정의 파일은 빌드 시스템 파일이 아님

참고: 어셈블리 정의 파일은 어셈블리 빌드 파일이 아닙니다. 일반적으로 어셈블리 정의 파일은 빌드 시스템에 있는 조건부 빌드 규칙을 지원하지 않습니다.

그렇기 때문에 어셈블리 파일은 전처리 명령(define)의 설정도 지원하지 않습니다. 항상 정적이기 때문입니다.

역호환성과 암시적인 종속성

어셈블리 정의 파일은 Unity 에디터의 기존 미리 정의된 컴파일 시스템과 역호환됩니다. 따라서 미리 정의된 어셈블리는 항상 모든 어셈블리 정의 파일의 어셈블리에 종속됩니다. 모든 스크립트가 Unity 에디터의 액티브 빌드 타겟과 호환되는 모든 미리 컴파일된 어셈블리(플러그인/.dll)에 종속되는 것과 유사합니다.

그림 3 - 어셈블리 종속성
그림 3 - 어셈블리 종속성

그림 3의 다이어그램은 미리 정의된 어셈블리, 어셈블리 정의 파일 어셈블리, 미리 정의된 어셈블리의 상호 종속성을 도해로 설명합니다.

Unity 에디터는 어셈블리 정의 파일에 미리 정의된 컴파일 시스템보다 더 높은 우선 순위를 부여합니다. 따라서 어셈블리 정의 파일 폴더 안에 미리 정의된 컴파일에서 가져온 특수 폴더 이름이 있어도 컴파일에는 영향을 미치지 않습니다. Unity 에디터는 이런 폴더를 특별한 의미가 없는 일반 폴더로 처리합니다.

프로젝트의 모든 스크립트에 어셈블리 정의 파일을 사용하거나, 또는 어셈블리 정의 파일을 전혀 사용하지 않는 것이 좋습니다. 이렇게 하지 않으면 어셈블리 정의 파일을 사용하지 않는 스크립트는 어셈블리 파일이 다시 컴파일될 때마다 매번 다시 컴파일됩니다. 즉, 어셈블리 정의 파일을 사용하는 이점이 반감됩니다.

API

UnityEditor.Compilation 네임스페이스에는 어셈블리 정의 파일과 Unity 에디터가 빌드하는 모든 어셈블리에 대한 정보를 검색해서 가져오는 데 사용하는 정적 CompilationPipeline 클래스가 있습니다.

파일 포맷

어셈블리 정의 파일은 다음과 같은 필드를 포함하는 JSON 파일입니다.

필드 타입
name 문자열
references(optional) 문자열 배열
includePlatforms (optional) 문자열 배열
excludePlatforms (optional) 문자열 배열

같은 어셈블리 정의 파일에서 includePlatforms 필드와 excludePlatforms 필드를 함께 사용하지 마십시오.


##예제
MyLibrary.asmdef

{ “name”: “MyLibrary”, “references”: [ “Utility” ], “includePlatforms”: [“Android”, “iOS”] } ``` MyLibrary2.asmdef

{
    "name": "MyLibrary2",
    "references": [ "Utility" ],
     "excludePlatforms": ["WebGL"]
}

  • 2018–03–07 일부 편집 리뷰를 거쳐 페이지 게시됨

  • Unity 2017.3의 새로운 기능 NewIn20173

  • Unity 2018.1에서 커스텀 스크립트 어셈블리가 업데이트됨

특수 폴더와 스크립트 컴파일 순서
.NET 프로파일 지원