본문 바로가기
Unity 게임 개발/Unity Assembly Definition

Unity 공부 - Assembly Definition 2 - Assembly Definition

by daisy0461 2022. 9. 6.

Assembly Definition

기본적으로 Unity 프로젝트의 모든 코드는 Assembly-CSharp이라는 단일 Assembly에 속합니다.

 

Assembly에서 스크립트 변경을 하면 Assembly의 모든 코드가 다시 컴파일되고 Assembly가 다시 빌드됩니다.

그렇다면 Unity 프로젝트의 모든 코드가 Assembly-CSharp이라는 단일 Assembly라고 했는데 Unity 프로젝트 어딘가에서 스크립트 변경을 하면 모든 코드가 다시 컴파일된다는 의미입니다. 결과적으로 Unity 프로젝트의 속도가 느려집니다.

당연히 모든 코드를 컴파일 다시 하기 때문에 스크립트가 많아지면 많아질수록 더 느려집니다. 

 

Assembly Definition을 왜 쓰는가??

이러한 상황은 코드를 Assembly로 분리하면 코드 업데이트 영향을 크게 줄일 수 있습니다.

사용자 지정 Assembly를 만들고 그 안에 스크립트를 수정하면 Assembly에 종속된 모든 Assembly도 다시 빌드가 됩니다.

기본 Assembly는 정의된 모든 Assembly에 종속됩니다.

 

말이 좀 많이 어려운데 간단하게 예를 들어 설명을 하자면

10개의 스크립트(1~10)가 Unity 프로젝트 안에 있습니다.

이때 사용자 지정 Assembly(A)에는 1, 2, 3 스크립트가 할당되어있습니다.

1, 2, 3 스크립트를 수정하면 10개 스크립트 모두 빌드되는 것입니다.

 

그럼 왜 쓰냐? 10개 스크립트 다 빌드되는 건 만드나 마나 동일한데?

밑을 보면 이유가 나옵니다.

 

4~10 스크립트를 수정하면 A는 기본 Assembly에 종속되어 있지 않습니다.

그렇기 때문에 4~10만 다시 빌드 됩니다.

쉽게 말해 해당 Assembly Definition에 속한 것이 수정될 때 다시 빌드 된다는 것입니다.

 

만약 여기서 다른 사용자 지정 Assembly(B)를 만들고 4, 5, 6 스크립트를 할당합니다.

그리고 A에 할당된 스크립트를 수정을 하면

빌드되는 스크립트는 1, 2, 3, 7, 8, 9, 10인 것입니다.

1, 2, 3은 Assembly(A)이고 7, 8, 9, 10은 A에 종속되어있는 기본 Assembly이기 때문에 다시 빌드됩니다.

 

Assembly Definition 만들기

Assembly Definition은 Assembly에 속한 코드를 포함하는 폴더안에 Asset의 형태로 들어가있다. 

간단하게는 같은 폴더안에 Asset의 형태로 들어가 있다고 보면 된다.

그리고 하위 폴더가 하위 폴더의 Assembly Definition에 속해있지 않다면 함께 Assembly에 속한다.

 

예를 들어 A폴더에 Assembly Definition이 있고 A폴더에 B폴더, C폴더, D폴더가 있다. 

이때 C폴더만 C의 Assembly Definition을 가지고 있다면

A의 Assembly Definition에는 A의 하위 폴더인 B, D도 포함된다는 이야기이다.

 

Assembly Definition 생성

Project 창에서 우클릭 > Create > Assembly Definition을 선택하면 Assembly Definition이 생성된다.

 

 

Assembly Definition Inspector 창

여기서 가장 주목해야하는 것은 Assembly Definition References이다.

밑에 List is Empty라는 곳에 참조할 Reference를 넣으면 된다.

이 말은 만약 다른 Assembly Definition에서 사용하는 코드를 참조해서 사용하고 싶을 때 해당 List에 넣어서

내가 이 Assembly Definition을 참조하고 있다고 알리는 것이다.

List에 넣지 않으면 에러가 난다. 

 

물론 Reference의 수는 작으면 작을 수록 좋다.

A라는 Assembly Definition이 B라는 Assembly Definition을 참조하고 있다면

B가 수정될 때마다 A도 다시 유효한지 확인하기 위해 다시 빌드를 한다.

너무 많으면 Complie시간이 줄어든다는 장점이 줄어들 수 있다.

Assembly로 얼마나 세분화할 수 있는지 고려한 후 작성하면 좋다.

 

예시

 

서로 다른 폴더에 있는 Class A, X

지금 Assembly Definition은 없는 상태이고 서로 다른 폴더에 있는 Class를 참조 가능합니다.

그럼 Test에 Assembly Definition을 생성하면 어떻게 될까.

일단 에러가 생성됩니다.

A에서 X를 찾을 수 없어서 에러가 발생합니다.

근데 Class X에선 A를 찾을 수 있습니다.

Class X가 포함된 폴더에 Assembly Definition을 생성하면 동일하게 A를 찾을 수 없고 에러가 발생합니다.

 

이제 Test에서 Test2를 참조한다고 List에 넣으면

보시는 바와 같이 Class A에서는 에러가 사라지지만 Class X에서는 여전이 A를 찾을 수 없다는 에러가 발생합니다.

 

이 예시로 알 수 있는 점은

  1. Assembly Definition으로 정의해도 기본 Assembly(Assembly-CSharp)에 있는 코드는 정의된 코드도 참조 가능하다.
  2. Assembly Definition은 다른 Assembly (Assembly-CSharp 포함)에 있는 코드는 참조가 불가능하다.
  3. Assembly Definition Reference에 Assembly를 넣으면 참조가 가능하다.

그렇다면 하위 폴더로 있을 때도 예시로 살펴보면

각 폴더에 Assembly Definition이 있으면 Class를 찾을 수 없다고 나옵니다.

이렇게 하위 폴더에 Assembly Definition을 삭제하면 같은 Assembly Definition에 포함되므로 에러가 사라집니다.