스크립트에서 오브젝트를 초기화할 때, 각 오브젝트가 서로 영향을 받지 않는다면 상관이 없지만

서로 영향을 받는 오브젝트라면 초기화 순서에 따라 작동이 달라질 수 있으며 오류가 발생할 가능성이 있다.

 

가장 쉽게 사용할 수 있는 여러 오브젝트의 초기화 순서 제어 방법은 

MonoBehaviour의 라이프사이클에서의 초기화(Awake, OnEnable, Start)이지만

이것만으로는 초기화 순서를 제어하는 데에 부족할 수 있다.

 

C#과 유니티에서 제공하는 여러 방법을 사용하면 이를 해결할 수 있다.

 

 

 

DefaultExecutionOrder (Attribute)

[DefaultExecutionOrder(-100)]
public class MyClass : MonoBehaviour {}

 

코드에서 스크립트 호출 순서를 지정

 

-100 과 같이 정수값을 사용해 상대적인 순서를 지정할 수 있다.

MonoBehaviour인 클래스에만 적용할 수 있다.

 

 

 

Script Execution Order

Unity Editor에서 제공하는 UI며, 모든 MonoBehaviour를 상속받는 스크립트의 실행 순서를 관리할 수 있다.

 

Edit - Project Settings - ScriptExecutionOrder

 

 

드래그나 숫자를 직접 입력해 관리할 수 있으며

한 번에 스크립트를 관리, 확인할 수 있다는 장점이 있다.

 

하지만 코드에서 순서를 확인할 수 없으므로 유지보수가 어려워질 수 있으며

종속성이 숨겨지므로 오류가 발생할 수 있다.

또, Script Execution Order를 사용하는 스크립트가 많을수록 순서 충돌이나 누락 가능성이 커진다.

따라서 몇 개의 중요한 스크립트만 순서 지정이 필요할 때, 스크립트 간 의존성이 약할 경우에 사용하는 것이 좋다.

 

 

 

Manager 사용

초기화 순서를 매니저 스크립트에서 관리하도록 하는 방법

public class GameManager : MonoBehaviour
{
    public Player player;
    public Enemy enemy;

    void Awake()
    {
        player.Initialize();
        enemy.Initialize();
    }
}

 

 

 

Event, Observer 패턴

초기화가 완료되었다는 것을 Event나 Observer 패턴을 사용해 다른 오브젝트에 알릴 수 있다.

 

 

'취준 > 기술면접' 카테고리의 다른 글

Unity의 Scene Load  (0) 2024.11.26
Texture와 Sprite  (0) 2024.11.22
Find함수, 자제해야 하는 이유  (0) 2024.11.21
벡터 정규화(Nomarlized)  (0) 2024.11.20
Unity에서의 Coroutine (코루틴), IEnumerator  (0) 2024.11.19