유니티를 다시 시작하고자 해서
유니티를 복습하고 정리한 글 내용입니다.
<------- 생명주기 ------->
모든 상호작용과 반응은 순차적이고 구조화된 방식으로 이루어지는데, 생명주기를 바탕으로 이뤄진다.
이 생명주기에는 여러 이벤트 메서드가 존재하고, 게임 오브젝트의 동작을 제어할 수 있다.
아래 이미지는 유니티 생명 주기의 흐름도이다.
public class example : MonoBehaviour
{
//생성자란 클래스가 인스터스화 될 때 초기에 제일 먼저 불리는 함수같은 역할. 유니티에선 생성자 X
//자기 자신의 데이터를 초기화하는 용도
void Awake() {}
//컴포넌트가 켜졌을 때 호출된다. 당연히 생성시에 컴포넌트가 켜져있으면 함수 호출
void OnEnable() {}
//오브젝트가 Loop 매번 틱 마다 도는데 처음 Update함수가 불리기 직전에 불리는 함수
void Start() {}
//실제 time setting에 의해 셋팅된 값마다 불린다.
void FixedUpdate() {}
//매 틱마다 연산 수행
void Update() {}
//Update보단 느리지만 늦은 업데이트 하고 싶을 때 사용
void LateUpdate() {}
//컴포넌트 꺼졌을 때 호출
void OnDisble() {}
//컴포넌트 파괴
void OnDestroy() {}
}
가볍게 말하면 위과 같이 작동하는데, 좀 더 자세히 설명하도록 하겠습니당...
1.1) Awake()
Awake()는 게임 오브젝트가 비활성 상태에서도 호출된다. 씬(Scene)이 로드 될 때마다 모든 오브젝트에 대해 한 번만 호출.
그렇기에 컴포넌트에 의존하지 않는 초기화 작업을 수행하는 것이 좋다.
Awake를 통한 추천 작업
- 게임 오브젝트의 변수 초기화
- 컴포넌트 가져오기 및 초기화
- 게임 매니저나 싱글톤과 같은 다른 게임오브젝트에 대한 참조 설정
1.2) OnEnable()
OnEnable()는 게임 오브젝트가 비활성화되거나 스크립트가 비활성화된 후에 다시 활성화될 때마다 호출되기에, 재활성화시 필요한 작업을 수행하는데 적합하다.
OnEnable를 통한 추천 작업
- 이벤트 등록
- 이벤트 리스너 설정
- Coroutine시작
게임 오브젝트가 비활성화되거나 스크립트가 비활성화 제어 방법은 gameObject.SetActive(true), gameObject.SetActive(false)를 사용하면 된다.
1.3) Start()
Start()는 게임 오브젝트나 컴포넌트를 초기화하는데 사용. Awake와 달리 활성화 된 게임 오브젝트에서 한 번만 호출된다.
Start를 통한 추천 작업
- 초기화된 다른 스크립트나 컴포넌트에 의존하는 초기화 작업
2.1) FixedUpdate()
FixedUpdate()는 매 물리 프레임마다 호출, 주로 물리적인 연산(ex, Rigidbody)에 사용된다. Unity의 물리 시스템은 일정한 시간 간격에 따라 업데이트 되며, 이 함수가 그것에 맞춰 호출된다. Update와 달리 프레임 레이트에 영향을 받지 않기 때문에, 물리 시뮬레이션과 같이 일정한 업데이트 주기가 필요한 작업에 이상적이다.
FixedUpdate를 통한 추천 작업
- 일정한 업데이트 주기가 필요한 작업
- Rigidbody컴포넌트에 힘을 가는 작업
2.2) OnTrigger___()
OnTrigger는 Collider컴포넌트가 트리거 모드로 설정되어 있을 때 호출된다. 상호작용을 처리하는데 사용된다. 물리적인 힘이 작용하지 않는다. 매개변수로는 Collider혹은 Collider2D타입의 객체를 받는다.
OnTrigger를 통한 추천 작업
- 상호작용
2.2.1) OnTriggerEnter(Collider other)
OnTriggerEnter()는 다른 Collider가 처음 겹치기 시작할 때 한번 호출된다.
OnTriggerEnter를 통한 추천 작업
- 트리거에 진입하는 객체 감지
- 트리거에 진입하는 순간의 특정 동작 실행
2.2.2) OnTriggerStay(Collider other)
OnTriggerStay()는 트리거와 Collider가 계속 겹쳐있을 때 매 프레임마다 호출
OnTriggerStay를 통한 추천 작업
- 트리거 내에 객체가 계속 있을 때 실행해야 하는 동작 처리
2.2.3) OnTriggerExit(Collider other)
OnTriggerExit()는 트리거와 Collider가 계속 겹쳐있다가 벗어날 때 한 번 호출
OnTriggerExit를 통한 추천 작업
- 트리거 내에서 나가는 객체 감지
- 트리거 떠나는 순간의 특정 동작 실행
2.3) OnCollision___()
OnCollision___()는 물리적 충돌을 처리하는데 사용. Collider 컴포넌트가 트리거 모드로 설정되어 있지 않을 때 호출. 매개변수로는 Collider혹은 Collider2D타입의 객체를 받는다.
OnCollision를 통한 추천 작업
- 물리적 충돌 처리
2.3.1) OnCollisionEnter(Collision collision)
OnCollisionEnter()는 두 Collider가 처음 충돌할 때 한 번 호출
OnCollisionEnter를 통한 추천 작업
- 충돌 시작할 때 특정 동작 실행
- 충돌 객체 감지
2.3.2) OnCollisionStay(Collision collision)
OnCollisionStay()는 계속 충돌하고 있을 때 매 프레임 마다 호출
OnCollisionStay를 통한 추천 작업
- 두 객체가 계속 충돌하고 있을 때 실행해야하는 동작 처리
2.3.2) OnCollisionExit(Collision collision)
OnCollisionExit()는 더 이상 충돌하지 않게 될 때 한번 호출.
OnCollisionExit를 통한 추천 작업
- 충돌이 끝나는 순간에 특정 동작 실행
- 충돌 종료 감지
2.4) Update
Update()는 실행되는 동안 매프레임 마다 호출되며, 이 메서드 내에서 수행되는 작업은 가능한 한 가볍게 유지해야 한다. 그렇지 않으면 프레임 레이트에 부정적인 영향을 미칠 수 있다.
또한 Update는 프레임 레이트에 따라 호출 간격이 변할 수 있다. 따라서 프레임 레이트에 종속적이지 않은 부드러운 움직임을 구현하려면 Time.deltaTime을 사용하여 간격을 보정해야 한다.
Update를 통한 추천 작업
- 게임 로직
- 상태의 업데이트
- 사용자 입력의 처리
2.5) LateUpdate
LateUpdate()는 매프레임 마다 호출되지만, update가 모두 호출된 후에 호출된다. Update에서 발생한 변화에 따라 후처리하는데 사용
LateUpdate를 통한 추천 작업
- 캐릭터 이동에 따른 카메라 움직임
- 후처리
3.1) OnDisable()
OnDisable()는 해당 게임 오브젝트나 그에 연결된 스크립트가 비활성화될 때 호출. 게임 오브젝트나 스크립트가 비활성화로 전환될 때마다 호출되기에 비활성화 시 필요한 정리 작업을 수행하는 데 적합하다.
OnDisable를 통한 추천 작업
- 이벤트 해제
- 리스너 제거
- 코루틴 정지
게임 오브젝트가 비활성화되거나 스크립트가 비활성화 제어 방법은 gameObject.SetActive(true), gameObject.SetActive(false)를 사용하면 된다.
3.2) OnDestroy()
OnDistroy()는 해당 게임 오브젝트나 스크립트가 Destroy에 의해 제거되기 직전에 호출. 필요한 정리 작업을 수행하는 데 사용된다. 게임오브젝트가 파괴되는 시점에 특정 행동을 실행하기 위해 사용할 수 도 있다.
OnDistroy를 통한 추천 작업
- 리소스 해제
- 연결 해제
- 이벤트 핸들러의 제거
3.3) OnApplicationQuit()
OnApplicationQuit()는 유니티 애플리케이션이 종료될 때 호출된다. 애플리케이션 종료 전, 실행해야 할 코드를 정의하는데 사용
OnApplicationQuit를 통한 추천 작업
- 게임 진행 상황 저장
- 네트워크 연결 종료
- 사용한 리소스 정리
♠ 참고
OnApplicationQuit가 호출되는 시점은 유니티에디터와 실제 빌드된 애플리케이션에서 다르게 작동 할 수 있다.
특히 모바일 디바이스에서는 홈버튼을 눌러 애플리케이션을 백그라운드로 보내는 경우 호출되지 않을 수 있다.
이런 상황에서는 OnApplicationPause()를 함께 사용 해야 할 수 있다.
'IT > 공부 정리' 카테고리의 다른 글
[Git] 깃 던전 공략법 (2) | 2024.09.09 |
---|---|
[Unity] 복습: C#기본기 (0) | 2024.07.04 |
[Unity] HTTP 통신 (0) | 2023.06.16 |
MQTT, MQTT Protocol란 (0) | 2023.06.16 |
[UNITY/C#] Catmull-Rom 스플라인을 사용하여 곡선 및 텍스처에 적용하기 (1) | 2023.03.19 |