Unity/정보

[Unity] Awake()와 Start()의 차이점

달시_Dalsi 2024. 9. 16. 14:39

Unity에서 Awake()와 Start() 메서드는 게임 오브젝트와 컴포넌트의 초기화 과정에서 중요한 역할을 합니다. 이 두 메서드는 각각 고유한 시점에 호출되며, 각기 다른 용도로 사용됩니다. 

Awake()

Awake()는 Unity의 스크립트 생명주기 중 가장 먼저 호출되는 메서드입니다. 게임 오브젝트가 씬에 로드될 때, 모든 컴포넌트가 초기화되기 전에 호출됩니다. 

특징:

  • 호출 시점: 모든 컴포넌트가 초기화되기 전에 호출됩니다. 따라서 Awake()는 스크립트나 컴포넌트의 설정과 관련된 코드가 독립적으로 실행되도록 보장합니다.
  • 의존성 관리: Awake()에서는 다른 컴포넌트의 상태에 의존하지 않고, 필요한 초기화 작업을 수행합니다. 예를 들어, 게임 오브젝트의 상태나 설정을 기본값으로 초기화할 때 유용합니다.
  • 스태틱 초기화: Awake()는 스태틱 변수나 메서드의 초기화에 적합합니다. 이 메서드가 호출될 때 모든 스태틱 데이터가 준비되었음을 보장합니다.

예시:

void Awake()
{
    // 스크립트 초기화
    Debug.Log("Awake called.");
    // 스태틱 변수 초기화
    StaticData.Initialize();
}
 

사용 사례:

  • 싱글톤 패턴: 게임 오브젝트의 인스턴스가 하나만 존재하도록 보장할 때, Awake()를 사용하여 싱글톤 인스턴스를 초기화합니다.
  • 데이터 준비: 게임 시작 전에 필요한 데이터를 로드하거나 초기화하는 데 유용합니다.

 

Start()

Start()는 Awake() 메서드가 호출된 후, 첫 번째 프레임 업데이트 직전에 호출됩니다. 이 메서드는 모든 오브젝트와 컴포넌트가 초기화된 상태에서 호출되므로, 다른 컴포넌트와의 상호작용이 필요한 경우 적합합니다.

특징:

  • 호출 시점: 모든 Awake() 호출 후, 첫 번째 프레임 업데이트 전에 호출됩니다. 따라서, 오브젝트와 컴포넌트가 완전히 초기화된 후 호출됩니다.
  • 의존성 해결: Start()는 다른 컴포넌트나 스크립트의 상태를 확인하고, 이에 의존하는 초기화 작업을 수행하는 데 적합합니다. 예를 들어, 다른 컴포넌트나 스크립트의 상태를 기반으로 설정을 조정할 수 있습니다.
  • 게임 시작 준비: 게임 시작 전, 모든 오브젝트가 정상적으로 초기화된 상태에서 필요한 설정을 완료할 수 있습니다.

예시:

void Start()
{
    // 다른 컴포넌트와의 상호작용 준비
    Debug.Log("Start called.");
    // 필요한 경우 다른 스크립트의 상태 확인
    if (GameManager.Instance != null)
    {
        GameManager.Instance.SetupGame();
    }
}
 

 

사용 사례:

  • 상호작용 설정: 다른 컴포넌트나 게임 시스템과의 상호작용을 설정할 때, 예를 들어 UI 요소의 초기 상태를 설정하거나 게임 매니저와의 연동을 설정할 때 유용합니다.
  • 게임 로직 시작: 게임의 초기화가 완료된 후, 게임 로직을 시작하거나 씬 전환 후 초기 상태를 설정하는 데 사용됩니다.

 

함수 호출 순서 그래프

유니티의 함수 호출 순서를 시각적으로 표현한 그래프를 참고하면, 초기화 과정의 흐름을 명확히 이해할 수 있습니다. 아래 그래프는 스크립트의 라이프사이클에서 Awake()와 Start() 메서드가 호출되는 순서를 나타냅니다:

이 그래프를 통해 Awake()가 먼저 호출되고, 그 후 Start()가 호출되는 과정을 확인할 수 있습니다. 이를 통해 각각의 메서드가 수행되는 시점과 역할을 이해할 수 있습니다.

 

결론

Awake()는 게임 오브젝트와 컴포넌트의 초기화가 이루어지기 전 호출되어 초기화 작업을 수행합니다. 반면, Start()는 모든 초기화가 완료된 후, 첫 번째 프레임 업데이트 전에 호출되어 다른 컴포넌트와의 상호작용을 설정하거나 게임 로직을 시작하는 데 적합합니다.