GUMI Dev
[유니티 게임 오브젝트 흐름] 초기화 - 프레임(물리, 로직) - 해제 본문
1. 초기화
1) 최초 Awake()
Awake 함수는 게임 오브젝트를 생성할 때 최초로 한번만 실행된다.

새로운 프로젝트 창에서 실린더 도형을 추가하고 C# 스크립트를 생성했다.
여기서 생성한 C# 파일의 이름은 "LifeCycle"이라고 설정했다.
그리고 이 파일을 실린더의 Inspector에 포함시켰다.
C# 스크립트에 아래와 같이 작성해보았다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LifeCycle : MonoBehaviour
{
private void Awake()
{
Debug.Log("플레이어의 데이터가 준비되었습니다. ");
}
}
정상적으로 작동한다.

2) 프레임시작 Start()
Start 함수는 업데이트 시작 직전에 최초로 한번만 실행한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LifeCycle : MonoBehaviour
{
// 초기화 영역
void Awake()
{
Debug.Log("플레이어의 데이터가 준비되었습니다. ");
}
void Start()
{
Debug.Log("장비를 챙겼습니다. ");
}
}
Awake와 Start 함수를 모두 포함하여 초기화 영역이라고 한다.
2. 프레임
1) 물리 FixedUpdate()
FixedUpdate()는 고정적으로 꾸준히 호출을 하는 고정된 실행주기를 가지며, CPU를 많이 사용한다.
1초에 약 50회 정도 호출을 한다.
함수를 하나씩 추가하면서 주석과 함께 코드를 정리해보았다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LifeCycle : MonoBehaviour
{
// 초기화 - 최초
void Awake()
{
Debug.Log("플레이어의 데이터가 준비되었습니다. ");
}
// 초기화 - 프레임 시작
void Start()
{
Debug.Log("장비를 챙겼습니다. ");
}
// 프레임 - 물리 연산
void FixedUpdate()
{
Debug.Log("이동");
}
}
2) 게임로직 Update()
Update 함수는 물리연산을 제외한 나머지, 즉 주기적으로 변하는 로직을 넣을 때 사용하는 함수다.
FixedUpdate()는 보통 초당 50프레임인 반면, Update()는 초당 60프레임으로 실행된다.
다만, Update()는 FixedUpdate()와는 달리 환경에 따라 실행 주기가 떨어질 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LifeCycle : MonoBehaviour
{
// 초기화 - 최초
void Awake()
{
Debug.Log("플레이어의 데이터가 준비되었습니다. ");
}
// 초기화 - 프레임 시작
void Start()
{
Debug.Log("장비를 챙겼습니다. ");
}
// 프레임 - 물리 연산
void FixedUpdate()
{
Debug.Log("이동");
}
// 프레임 - 로직
void Update()
{
Debug.Log("몬스터 사냥");
}
}
3) 후처리 LateUpdate()
LateUpdate 함수는 모든 업데이트가 끝난 후 마지막으로 호출된다.
예를들면 캐릭터를 따라가는 카메라 또는 후처리 등을 다룰 수 있는 부분이다.
Update()와 같이 초당 60프레임이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LifeCycle : MonoBehaviour
{
// 초기화 - 최초
void Awake()
{
Debug.Log("플레이어의 데이터가 준비되었습니다. ");
}
// 초기화 - 프레임 시작
void Start()
{
Debug.Log("장비를 챙겼습니다. ");
}
// 프레임 - 물리 연산
void FixedUpdate()
{
Debug.Log("이동");
}
// 프레임 - 로직
void Update()
{
Debug.Log("몬스터 사냥");
}
// 프레임 - 후처리
void LateUpdate()
{
Debug.Log("경험치 획득");
}
}
3. 해제 OnDestory()
OnDestroy 함수는 게임 오브젝트가 삭제되기 직전에 무언가를 남기고 삭제되는 의미로 사용된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LifeCycle : MonoBehaviour
{
// 초기화 - 최초
void Awake()
{
Debug.Log("플레이어의 데이터가 준비되었습니다. ");
}
// 초기화 - 프레임 시작
void Start()
{
Debug.Log("장비를 챙겼습니다. ");
}
// 프레임 - 물리 연산
void FixedUpdate()
{
Debug.Log("이동");
}
// 프레임 - 로직
void Update()
{
Debug.Log("몬스터 사냥");
}
// 프레임 - 후처리
void LateUpdate()
{
Debug.Log("경험치 획득");
}
// 해제
void OnDestroy()
{
Debug.Log("플레이어 데이터를 해제하였습니다. ");
}
}
위 C# 스크립트를 작성하고 게임을 플레이를 하면 스크립트가 작동된다.
여기서 게임이 플레이되는 도중에 게임 오브젝트(여기서는 실린더)를 삭제하면, C# 스크립트에서 OnDestroy 함수에 입력한 기능이 실행된다.

여기서 게임 오브젝트를 삭제하지 않고 활성화 또는 비활성화 할 수 있다.
이어지는 내용을 참고해보자.
4. 활성화 OnEnable()
활성화는 게임의 프로세스 (초기화 - 물리 - 게임로직 - 해체) 중 초기화와 물리 영역 사이에 위치한다.
따라서 C# 스크립트를 작성할 때 활성화를 하려면 초기화 함수와 물리 함수의 사이에 활성화 함수를 입력해야한다.
Awake 보다는 늦게, Start 보다는 빠르게 실행된다.
Awake와 Start와는 달리, OnEnable은 최초 1회 실행이 아니라 활성화나 비활성화를 할 때마다 실행된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LifeCycle : MonoBehaviour
{
// 초기화 - 최초
void Awake()
{
Debug.Log("플레이어의 데이터가 준비되었습니다. ");
}
// 초기화 - 프레임 시작
void Start()
{
Debug.Log("장비를 챙겼습니다. ");
}
// 활성화
void OnEnable()
{
Debug.Log("장비를 챙겼습니다. ");
}
// 프레임 - 물리 연산
void FixedUpdate()
{
Debug.Log("이동");
}
// 프레임 - 로직
void Update()
{
Debug.Log("몬스터 사냥");
}
// 프레임 - 후처리
void LateUpdate()
{
Debug.Log("경험치 획득");
}
// 비활성화
// 해제
void OnDestroy()
{
Debug.Log("플레이어 데이터를 해제하였습니다. ");
}
}
5. 비활성화 OnDisable()
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LifeCycle : MonoBehaviour
{
// 초기화 - 최초
void Awake()
{
Debug.Log("플레이어의 데이터가 준비되었습니다. ");
}
// 초기화 - 프레임 시작
void Start()
{
Debug.Log("장비를 챙겼습니다. ");
}
// 활성화
void OnEnable()
{
Debug.Log("장비를 챙겼습니다. ");
}
// 프레임 - 물리 연산
void FixedUpdate()
{
Debug.Log("이동");
}
// 프레임 - 로직
void Update()
{
Debug.Log("몬스터 사냥");
}
// 프레임 - 후처리
void LateUpdate()
{
Debug.Log("경험치 획득");
}
// 비활성화
void OnDisable()
{
Debug.Log("플레이어가 로그아웃 했습니다. ");
}
// 해제
void OnDestroy()
{
Debug.Log("플레이어 데이터를 해제하였습니다. ");
}
}
게임 오브젝트를 활성 또는 비활성화하기 위해서는, Inspector에서 게임 오브젝트의 스크립트를 체크하거나 체크 취소 하면 된다.
아래 사진은 게임 오브젝트가 비활성화된 상태다.

★ 유니티 공식 문서: https://docs.unity3d.com/kr/530/Manual/ExecutionOrder.html
유니티 - 매뉴얼: 이벤트 함수의 실행 순서
자동 메모리 관리를 이해하기 이벤트 함수의 실행 순서 Unity 스크립팅시, 미리 정의된 순서대로 실행되는 많은 이벤트 함수가 있습니다. 아래에서는, 실행 순서를 설명합니다. 에디터 __ Reset : __
docs.unity3d.com
'Unity' 카테고리의 다른 글
[유니티 Input] 마우스 입력 (0) | 2021.11.17 |
---|---|
[유니티 Input] 키보드 입력 (0) | 2021.11.17 |
[유니티 C# 함수 기초] 그룹형 변수 (0) | 2021.11.14 |
[유니티 C# 함수 기초] 변수 (0) | 2021.11.14 |
[유니티 C# 시작하기] (1) | 2021.11.13 |