유니티에서 C# 스크립트를 생성하면 자동으로 MonoBehavior를 상속받은 스크립트가 생성이 됩니다.
이렇게 생성된 스크립트 안에는 내용이 비어있는 Start() 함수와 Update() 함수가 존재하는데 이와 같은 함수를 이벤트 함수라고 합니다. 이벤트 함수는 이외에도 Awake, FixedUpdate, OnEnable 등 다양한 함수가 존재합니다.
초기화를 위한 이벤트 함수에는 Awake와 Start가 있고, 업데이트를 위한 이벤트 함수에는 Update, FixedUpdate, LateUpdate가 있습니다. 이 함수들의 차이점에 대해서 알아보도록 하겠습니다.
Awake vs Start
Awake
- Start 함수보다 먼저 호출이 된다.
- 씬이 시작할 때 오브젝트마다 한 번만 호출된다.
- 스크립트가 비활성화 상태여도 호출이 된다.
- 게임 오브젝트가 비활성화 상태면 호출이 되지 않는다.
- 씬의 모든 오브젝트가 인스턴스화가 된 직후에 호출이 된다.
- 코루틴을 사용하여 호출할 수 없다.
Start
- Awake 함수의 호출이 끝난 직후에 호출이 된다.
- 씬이 시작할 때 오브젝트마다 한 번만 호출된다.
- 스크립트가 비활성화 상태면 호출이 되지 않는다.
- 게임 오브젝트가 비활성화 상태면 호출이 되지 않는다.
- 코루틴을 사용하여 호출할 수 있다.
정리하자면 Awake는 씬에 존재하는 활성화된 모든 오브젝트의 인스턴스화가 진행된 직후에 호출이 됩니다. 하이어라키 창에 있는 활성화된 모든 오브젝트가 생성된 다음에 Awake 함수를 호출하는 것입니다. 그리고 활성화된 모든 오브젝트의 Awake 함수 호출이 종료가 되면 Start 함수를 호출하게 됩니다. 1000개의 오브젝트가 하이어라키 창에 존재한다고 하면 1000개의 오브젝트의 Awake 함수가 호출되고 종료될 때까지 Start 함수는 호출되지 않습니다.
다만 여기서 주의해야 할 점은 오브젝트들의 Awake 호출 순서가 매번 다를 수 있다는 점입니다.
예를 들어서 A 오브젝트와 B 오브젝트가 있다고 할 때, A 오브젝트의 awake가 먼저 실행이 될 수도 있고 B 오브젝트의 awake가 먼저 실행이 될 수도 있습니다.
이러한 호출 순서의 불확실성은 아래와 같은 경우에 참조 오류를 만들어낼 가능성이 높습니다.
public class ClassA : MonoBehaviour
{
public BoxCollider collider;
void Awake()
{
collider = GetComponent<BoxCollider>();
}
public class ClassB : MonoBehaviour
{
public ClassA obj;
public BoxCollider collider;
void Awake()
{
obj = GameObject.Find("ObjectA").GetComponent<ClassA>;
// 참조 오류 발생 가능
collider = obj.collider;
}
ClassB 스크립트가 부착된 오브젝트의 Awake가 먼저 실행된다면, collider = obj.collider; 부분에서 참조 오류가 발생할 수 있습니다.
이와 같은 상황을 방지하기 위해 초기화를 위한 함수가 Awake, Start 두개가 존재하는 것이며, 변수 및 참조의 초기화는 Awake 함수 내부에서 진행하고 다른 스크립트의 내용을 참조하는 경우에는 Start 함수 내부에서 진행하면 안전하게 사용이 가능합니다.
Update vs FixedUpdate vs LateUpdate
Update
- 매 프레임마다 한 번씩 호출 됩니다.
- 호출간격이 매번 호출할 때마다 달라질 수 있습니다.
FixedUpdate
- 일정 시간마다 한 번씩 호출됩니다.
- 기본적으로 0.02초에 한 번씩 호출되는 것이 기본값이며, 프로젝트 세팅에서 변경이 가능합니다.
- 안정적인 물리연산을 위해 사용할 수 있습니다.
LateUpdate
- Update 함수가 끝난 직후 호출됩니다.
- Update 함수에서 플레이어의 이동을 처리하고 LateUpdate 함수에서 카메라의 이동을 처리하는 등의 경우에 사용할 수 있습니다.
각 이벤트 함수의 차이는 상당히 중요한 내용이므로 꼭 알아가시길 바랍니다. 😊
'Engine > Unity' 카테고리의 다른 글
[Unity] 유니티 생명주기 (Life Cycle) (0) | 2024.05.20 |
---|---|
[Unity] TMP 사용방법 / 한글 폰트 깨질 때 (0) | 2024.05.06 |
[Unity] 오브젝트 이동시키는 방법 (0) | 2024.04.04 |
[Unity] Ray / Raycast / RaycastHit (레이캐스트) (2) | 2024.03.26 |
[Unity] 싱글톤 패턴 (Singleton) (2) | 2024.03.20 |