EveryDay.DevUp

[Unity] Assembly definition files ( 어셈블리 정의 파일 ) 본문

Unity

[Unity] Assembly definition files ( 어셈블리 정의 파일 )

EveryDay.DevUp 2020. 6. 11. 00:46

 

 

Unity는 기본적으로 Assembly-CSharp과 Assembly-CSharp-Editor 어셈블리를 가지고 있다. 기본적으로 Asset에 있는 스크립트 파일은 Assembly-CSharp에 묶이고, Editor 폴더 안에 있는 스크립트 파일은  Assembly-CSharp-Editor에 묶이게 된다.

 

 

스크립트의 개수가 적은 경우 컴파일 시간이 짧기 때문에 문제가 없지만, 스크립트의 양이 많아질 수록 하나의 어셈블리에서 스크립트를 관리하면 컴파일의 시간이 비례하여 증가하게 된다.

Unity는 이에 대한 해결 방법으로 사용자가 어셈블리를 정의하여 사용할 수 있도록 Unity 2017.3 버전 이후에 추가하였다. 

 

[ 기본 어셈블리에 사용자 어셈블리가 포함되고 종속적인 관계를 맺을 수 있음 ]

 

사용자 정의 어셈블리를 만드는 방법은 간단하다.

① Asset->Create->Assembly Definition으로 [임의의 이름 (여기서는 UserAssmbly로 지금 ) ].asmdef 파일을 생성한다.

 

[ Asset->Create->Assmbly Definition ]

 

② 사용자 정의 어셈블리로 만들 스크립트가 있는 폴더에 해당 어셈블리를 이동한다.

: 어셈블리가 있는 폴더를 기준 폴더 안에 스크립트가 묶인다. 하뒤 폴더 또한 사용자 정의 어셈블리가 없다면 같이 묶이게 된다.

 

 

: 하위 폴더에 사용자 정의 어셈블리가 있다면, 하위 폴더의 스크립트는 해당 폴더에 사용자 정의 어셈블리에 묶이게 된다.

 

 

사용자 정의 어셈블리를 사용하면, 해당 어셈블리에 있는 스크립트가 수정되었을 때만 컴파일이 발생하기 때문에, 유니티 기본 어셈블리를 사용할 때보다 컴파일 시간을 단축 시킬 수 있다.

각 어셈블리는 별도의 종속성을 걸어주지 않으면 참조가 발생하지 않기 때문에 코드의 의존성도 낮아지게 된다. 

● 사용자 정의 어셈블리 .asmdef 

 

 

▶ Name

: 실제 어셈블리의 이름으로 .asmdef의 이름과 별개로 동작한다.

※ ChildAssembly.asmdef의 Name을 Child로 하면, 어셈블리의 이름은 Child가 된다.

 

 

▶ General

: Allow 'unsafe' Code 는 C#에서 포인터를 사용하고 변수의 주소를 사용하 등의 작업을 할 수 있다.

: Auto Referenced는 Unity의 Assembly-CSharp과 Assembly-CSharp-Editor 에서 자동으로 참조되는 부분에 대한 설정이다.

 

[ UserAssembly의 UserA 클래스를 참조하려고 할때 ]
[ Auto Referenced의 옵션이 켜졌을 때 ]
[ Auto Referenced의 옵션을 껐을 때 오류가 발생]

 

: Override References는 Unity 외부에서 만들어진 어셈블리를 기반으로하여 사용자 정의 어셈블리를 만든다.

: No Engine Refercenes 해당 옵션을 키면 UnityEngine과 Unity Editor를 사용할 수 없다.

▶ Define Constraints

: 해당 디파인의 조건이 만족되었을 때만 사용하겠다는 의미이다.

[ DEBUG_LOG 디파인이 설정되었을 때만 사용가능 ]
[ DEBUG_LOG 디파인이 없기 때문에 Child 어셈블리가 사용되지 않음 ]
[ DEBUG_LOG 디파인을 프로젝트에 설정 ]
[ DEBUG_LOG 디파인이 설정되어 Child 어셈블리 사용 가능 ]

 

Assembly Definition References

: 참조하여 사용할 어셈블리를 설정할 수 있다. 해당 참조를 사용할 경우 상호간의 참조로 인해 참조의 참조가 계속 반복되는 현상이 나타나지 않도록 해야한다.

: Use GUIDs를 사용하게 되면 어셈블리의 정의 이름으로 참조하는 것이 아닌 에셋의 GUID로 잠조하게 된다. 이를 통해 이름이 변경되도 참조에 문제가 생기지 않는다.

 

[ UserAssembly를 참조 ]
[ UserAssmbly를 참조했기 때문에 Child 어셈블리에서 UserA 클래스를 사용할 수 있음 ]

 

Assembly References 

: Override References 옵션을 키면 나타나는 필드로, 외부 라이브러리 참조에 사용된다.

Platforms

: 해당 어셈블리를 사용할 플랫폼을 설정할 수 있다. 

▶ Version Defines

: 해당 어셈블리가 동작하는 패키지 또는 모듈을 정의함으로써 패키지 간의 종속성을 효과적으로 처리할 수 있다.

 

 

: Resource는 현재 프로젝트에 있는 활성화된 패키지 또는 모듈의 목록을 선택한다.

: Define 은 Expression이 true 일 때 정의되는 디파인을 말한다.

: Expression는 패키지 또는 모듈의 버전 범위를 설정함으로써 해당 패키지의 버전 정보에 따른 분기 처리를 할 수 있도록 한다.

: Expression outcome은 Expression의 표현에 따라 결정된다. 

( 예를 들어 1.0.0은 >=1.0.0 으로 표현되고 [1.0.0]은 =1.0.0으로 표현된다 )

참고자료 : https://docs.unity3d.com/kr/2020.1/Manual/ScriptCompilationAssemblyDefinitionFiles.html