Start(), Update()만 봐도 잘 돌아간다고 할 수 있지만
크고 복잡한 게임일수록 다른 이벤트함수들이 많이 필요하다.
그래서 다시 한 번 정리하는 느낌으로 하나씩 살펴보자.
**2020.3(LTS)버전이다. 이전 버전은 조금 다르게 생기긴 했다. 큰 틀은 안 바뀌었겠지만.
이게 바로 그 큰 그림이다.
Internal function보다 Uswer callback을 보면 더 좋다.
물론 우리가 사용할 수 있는 함수가 User callback이지만 큰 줄기를 이해하고 그 다음에 더 알아보는 것이 좋다.
순서대로 하나씩 살펴보자
첫 번째 씬 로드되면 아래 2가지 함수가 실행된다.
씬이 시작할 때(씬에서 오브젝트마다 한 번) 호출된다고 한다.
- Awake: 이 함수는 항상 Start 함수 전에 호출되며 프리팹이 인스턴스화 된 직후에 호출됩니다. 게임 오브젝트가 시작하는 동안 비활성 상태인 경우 Awake 함수는 활성화될 때까지 호출되지 않습니다.
-> 다시 말하면 프리팹이 이미 인스턴스화 되었으니 컴포넌트를 호출할 수 있다는 말이겠다?
-> 비활성(Acitve == false)이면 호출되지 않는다고 보면 되겠다.
-> 딱 1번 실행된다는 말이다. 이미 Start 함수가 호출되었다면 오브젝트의 활성 상태가 꺼졌다 켜져도 Awake는 실행되지 않는다.
-> 많은 사람들이 여기서 값을 초기화한다.
- OnEnable: (오브젝트가 활성화된 경우에만): 오브젝트 활성화 직후 이 함수를 호출합니다. 레벨이 로드되거나 스크립트 컴포넌트를 포함한 게임 오브젝트가 인스턴스화될 때와 같이 MonoBehaviour를 생성할 때 이렇게 할 수 있습니다.
-> 역시나 Active == true 일 때만 이 함수를 호출한다.
-> Awake 와는 다르게 활성상태가 비활성에서 활성으로 바뀔 때마다 실행된다.
-> 자주 쓰이는만큼 고려를 많이해서 짜야 할 부분이다.
-> 오브젝트 풀링, Object Pooling 시에 고려해야 할 부분인 것 같다.
그 다음으로는
- Reset은 개체가 처음 연결되었을 때 스크립트의 프로퍼티로 초기화하는 데 호출된다.
->따로 Reset 명령을 호출했을 때도 마찬가지다.
-> 개체가 처음 연결되었다는게 무엇일까? 오브젝트에 스크립트가 컴포넌트로 입력되었을 때인가?
첫 번째 프레임이 실행되기 전에는
- Start: 스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출된다.
-> 컴포넌트로 활성화 되어있다면 실행된다는 뜻이다.
-> 여기서도 마찬가지로 값을 초기화하는 작업이 진행될 수 있다.
그 다음에는 물리적인 계산부터 실행된다.
- FixedUpdate: FixedUpdate 는 종종 Update 보다 더 자주 호출된다.
모든 물리 계산 및 업데이트는 FixedUpdate 후 즉시 발생합니다.
-> 프레임 속도가 낮은 경우 프레임당 여러 번 호출될 수 있다.
-> 반대로프레임 속도가 높은 경우 프레임 사이에 호출되지 않을 수 있다는 얘기다.
** FixedUpdate 의 움직임 계산을 적용할 때 Time.deltaTime 만큼 값을 곱할 필요가 없다.
-> FixedUpdate 가 프레임 속도와 관계없이 신뢰할 수있는 타이머에서 호출되기 때문이다.
보면 OnTrigger가 OnCollision보다 먼저 실행된다.
실행순서만 봐도 왜 Trigger로 실행했을 때 물리적인 힘을 받지 않는지 이해가 된다.
입력을 받아들이고 그 다음에 Game Logic을 계산한다.
- Update: Update 는 프레임당 한 번 호출된다. 프레임 업데이트를 위한 주요 작업 함수다.
-> 우리가 런타임에서 일어나는 모든 일들은 Update의 덕분이라고 보면 된다.
- LateUpdate: LateUpdate 는 Update 가 끝난 후 프레임당 한 번 호출된다. Update 에서 수행된 모든 계산은 LateUpdate 가 시작할 때 완료된다.
-> LateUpdate 는 일반적으로 다음의 3인칭 카메라에 사용한다.
-> 즉, 캐릭터를 움직이고 Update 로 방향을 바꾸게 하는 경우 LateUpdate 에서 모든 카메라 움직임과 로테이션 계산을 수행할 수 있다.
-> 이렇게 하면 카메라가 포지션을 추적하기 전에 캐릭터가 완전히 움직였는지 확인할 수 있다.
-> 카메라에 정말 많이 쓴다.
나머지는 이러한 순서대로 일어난다.
- OnDestroy: 오브젝트 존재의 마지막 프레임에 대해 모든 프레임 업데이트를 마친 후 이 함수가 호출된다.
오브젝트는 씬 종료나 Destroy에 의해서 파괴된다고 말한다.
-> 이것 또한 많은 응용이 될 것 같다.
아래 함수들은 종료 시 모든 씬의 활성화된 오브젝트에서 실행된다.
- OnApplicationQuit: 이 함수는 애플리케이션 종료 전 모든 게임 오브젝트에서 호출된다. 에디터에서 사용자가 플레이 모드를 중지할 때 호출된다.
- OnDisable: 동작이 비활성화되거나 비활성 상태일 때 이 함수가 호출된다.
-> OnEnable과 관련이 깊은 관계다.
-> 즉, 이 함수 역시 Object Pooling과 관계가 있다.
마지막으로
프레임 사이
- OnApplicationPause: 이 함수는 일시 정지가 감지된 프레임의 끝, 실질적으로는 일반 프레임 업데이트 사이에 호출된다. 게임에 일시정지 상태를 가리키는 그래픽스를 표시하도록 OnApplicationPause 가 호출된 후에 한 프레임이 추가로 실행된다.
-> 일시 정지가 되었을 때 실행되는 함수이다.
-> 어플리케이션이 백그라운드로 갔을 때, 아마 호출되지 않을까 싶다.
이 외에도 애니메이션, 렌더링, 코루틴이 있지만 그것은 여기서 다루기 보다는 따로 다루는 것이 낫다.
참고링크
'Game Development, 게임개발 > 개발' 카테고리의 다른 글
Overriding, 덮어쓰기, 오버라이딩 [Unity] (0) | 2021.03.27 |
---|---|
Member hiding, 하이딩, 은닉 [Unity] (0) | 2021.03.27 |
Polymorphism, 다형성 [Unity] (0) | 2021.03.26 |
상속, Inheritance, C# [Unity] (0) | 2021.03.25 |
FSM,유한 상태 기계, Finite State Machines [Unity] (0) | 2021.03.25 |