유니티는 C#을 바탕으로 사용하지만 여러 전용 함수를 가지고 있습니다.
대표적으로 많이 사용되는 이벤트 함수가 어떤 것이 있는지 하나씩 살펴보겠습니다!
그리고 참고로 유니티 이벤트 함수들은 각각 호출 순서가 있습니다.
상당히 방대한 개념이기도 하고 중요한 개념입니다.
이 내용은 Unity Documentation에서 더 자세히 나와있으니 참고삼아 보시면 도움되실 겁니다.
Unity Documentation : 이벤트 함수의 실행 순서 ← 링크 남겨두겠습니다.
Awake( )는 초기 설정과 내부 구조를 준비할 때 사용합니다.
보통 컴포넌트를 가져오거나 컴포넌트 간의 참조를 연결하는 경우 사용합니다.
void Awake()
{
rb = GetComponent<Rigidbody>();
animator = GetComponent<Animator>();
}
스크립트가 씬에 포함되었을 때 1번 호출하는 특징이 있으며,
게임 오브젝트가 비활성화 상태여도 스크립트만 활성화되어 있다면 호출됩니다.
Start( )는 게임 시작 직전 로직 처리를 하는 경우 사용합니다.
게임이 시작되고 첫 프레임 직전에 한 번 호출되고
오브젝트가 활성화되어 있어야 실행됩니다.
초기화를 하는 경우나 시작하면서 나와야 하는 경우에 사용합니다.
void Start()
{
hp = maxHp;
animator.Play("IntroFade");
}
두 함수다 초기화 시점에 사용되는 대표적인 함수인 것은 같으나
호출 순서와 스크립트 유무에 따른 차이가 있습니다.
| 비교 | Awake( ) | Start( ) |
|---|---|---|
| 호출 시점 | 오브젝트가 활성화될 때, 가장 먼저 호출 | Awake 이후, 프레임이 시작되기 전에 한 번 호출됨 |
| 호출 순서 | Awake( ) → Start( ) 순서로 호출 | Awake( )보다 나중에 실행 |
| 호출 조건 | 오브젝트가 비활성화 상태여도 스크립트만 활성화돼 있으면 실행 | 오브젝트가 활성 상태일 때만 실행 |
| 용도 | 다른 스크립트나 컴포넌트 참조 등 내부 설정용 | 게임 시작 시 초기화나 게임 시작 로직 실행용 |
OnEnable( )는 스크립트가 활성화될 때마다 자동으로 호출됩니다.
게임 오브젝트가 활성화되어 있고,
해당 컴포넌트가 enabled = true 상태가 될 때 호출됩니다.
private void OnEnable()
{
Debug.Log("OnEnable");
}
OnDisable( )은 스크립트가 비활성화될 때마다 호출됩니다.
게임 오브젝트가 비활성화되거나,
해당 컴포넌트가 enabled = false가 되면 호출됩니다.
private void OnDisable()
{
Debug.Log("OnDisable");
}
매 프레임마다 호출되는 함수입니다. 즉, 동작 중에 계속 호출되는거죠.
그래서 사용자 입력 처리나 게임 로직을 처리하는 경우 사용됩니다.
✅ 사용자 입력 처리 (Input.GetKey, Input.GetMouseButton 등)
✅ 게임 로직 처리 (적 AI, 상태 변화 등)
해당 프레임의 모든 Update( )가 끝난 뒤에 호출되는 함수입니다.
Update에서 모든 오브젝트가 위치를 바꾼 후 그 위치를 기준으로 연산 가능합니다.
게임프레임의 진행 결과가 필요한 동작이 있는 기능 구현허는 경우 사용합니다.
대표적으로 카메라 추적이 있겠네요.
(플레이어가 움직인 후에 카메라 위치를 따라가게 하고 싶을 때)
public float moveSpeed
public Transform cameraTransform;
private void LateUpdate()
{
if (cameraTransform != null)
{
cameraTransform.position = transform.position + new Vector3(0, 5, -10);
cameraTransform.LookAt(transform);
}
}
고정된 시간 간격마다 호출되는 함수입니다.
Update와 다르게 Time.fixedDeltaTime을 기준으로 동작하므로
프레임과 무관하게 일정합니다.
Time.fixedDeltaTime은 그냥 FixedUpdate가 호출되는 시간 간격입니다.
기본값 : 0.02초 (1초당 50번 호출 —> 50 FPS)
물리엔진과 같이 게임의 프레임과 무관하게 일정해야 하는 작업에 사용해야 합니다. Rigidbody 관련 로직이 여기에 해당되겠네요.
public float moveSpeed
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
Vector3 moveVelocity = moveInput.normalized * moveSpeed;
rb.velocity = moveVelocity;
}
게임 오브젝트가 파괴되거나, 씬이 언로드 되면서
해당 오브젝트가 제거될 때 1회 호출됩니다.
보통은 리소스 정리가 필요한 경우에 사용됩니다,
(이벤트 해제, 파일 닫기, 로그 출력 등)
void OnDestroy()
{
Debug.Log(gameObject.name + " 은/는 파괴되었다!");
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Destroy(gameObject);
}
}