요즘 유니티는 예전 유니티와 많이 다르다. 예전에 뭔가 2% 부족하다고 느꼈던 기능들이 하나씩 추가되고 또 출시될 예정이라 꽤나 정교한 엔진이 돼가고 있음을 자주 느낀다.

그래서 가능하면 최신 기능을 위해 어지간하면 업데이트를 자주 해주는 것이 좋다.

(물론 기업 같은 경우엔 LTS 버전을 사용하는게 훨씬 안정적이고 좋긴 하지만.)

 

본론으로 들어가자면,

사실 지금 소개할 기능은 2019버전뿐만 아니라 이전에도 있던 기능이다.

Unity 메뉴얼 상으로 2017 버전부터 존재한 걸 보면 아마 그때부터 추가된 기능일 것이다.

 

유니티에선 여러 오브젝트에 붙어 있는 여러 컴포넌트의 Awake나 Start 같은 유니티 이벤트 함수들이 호출될 때,

어떤 오브젝트의 어떤 컴포넌트가 먼저 호출 될지는 정해져 있지 않다.

 

그래서 게임 첫시작 할 때, 가장 우선적으로 처리해야 하는 시스템, 데이터 초기화 같은, 다른 클래스들보다 먼저 호출 되어야하는 주요 클래스들의 호출 순서를 컨트롤할 수 없어서 다른 방법으로 이 호출 순서가 꼬이지 않게 처리해야 했다.

 

바로 이런 문제를 간단하게 해결 할 수 있는 방법이 있는데, 그게 바로 Script Execution Order이다.

단어 그대로 스크립트 호출 순서를 컨트롤하는 기능이다.

 

예시용 프로젝트의 셋팅 사진을 예로 들자면.

빨간 박스가 작성자가 설정한 스크립트 클래스 명이고, 파란 박스가 유니티가 자체 설정, 아래 Default Time이 일반적인 호출 순서이다.

각 항목 우측에 있는 숫자는 우선순위를 뜻하고, 0보다 낮을수록 먼저, 0보다 높을수록 나중에 호출된다는 뜻한다.

때문에 원한다면, 일반적인 default time 보다 더 늦게 호출하도록 설정할 수도 있다,

 

우선순위 값을 변경하면 항목의 위치가 값에 맞게 자동으로 변경되고, 각 항목의 좌측의 '='를 이용해 드래그엔드랍으로 우선순위 값을 자동으로 바꿀 수도 있다.

 

사진에 작성자가 적용한 항목들은 다음과 같다.

SimpleDI.PersistentContext: 게임에 전역적으로 사용될 클래스들을 초기화하는 컴포넌트

SimpleDI.SceneContext: 씬에 종속적인 클래스들을 초기화하는 컴포넌트

SimpleDI.MonoLifeCycle: Monobehaviour를 상속하지 않은 클래스들에 대해 Update같은 함수를 호출해주기 위한 컴포넌트

 

풀어서 설명하자면, 전역 -> 씬 -> 업데이트 시작으로 시스템이나 데이터 초기화의 순서가 꼬이지 않도록 설정해놓은 것이다.

 

Script Execution Order은 앞서 설명한대로,

유니티 이벤트 함수에 대하여 어떤 컴포넌트들이 우선 혹은 나중에 호출될지를 결정하는 셋팅이기 때문에,

설정할 클래스는 당연히 컴포넌트여야 한다.

 

이 셋팅은 스크립트로도 설정할 수 있어서, 스크립트로 특정 스크립트의 우선순위 값을 얻어오거나, 바꿀 수 있다.

 

void MonoImporter.SetExecutionOrder(MonoScript script, int order);

int MonoImporter.GetExecutionOrder(MonoScript  script);

 

마지막으로 알아둘 점과 사용 시 주의할 점이 있다.

 

알아둘 점

  • 이 셋팅은 게임 시작부터 끝까지 전역적으로 영향을 미침
  • 각각의 순서는 클래스의 메타 파일에 저장되기 때문에 메타 파일이 지워지면 셋팅값이 사라짐

주의할 점

  • 남발하지 말 것
  • 정말 중요한 코어 컴포넌트 몇 개만 사용할 것
  • 평범한 컴포넌트한테는 우선순위 값을 주지 말 것

이유를 설명하자면, 이 자체가 클래스들에게 순서 의존성을 부여하는 것이기 때문에, 나중에 우선 호출되는 컴포넌트가 나중 호출되는 컴포넌트의 우선 호출을 요구하는, 의존성 순환구조가 되어버릴 문제가 있기 때문이다. 이렇게 되면 나중에 구조를 수정하기 힘들어질 수 있다.

그래서 가능하다면 예시 사진과 같이 중요 컴포넌트에게만 호출 순서를 부여하고 내부적으로는 이 컴포넌트들을 이용하여 순서를 조절할 수 있게 하는 것이 좋다.

+ Recent posts