lifecycle

유니티의 라이프 사이클이란,,

스크립트를 실행하면 사용자가 호출하지 않아도 자동으로 동작하는 이벤트함수들의 호출 주기와 순서를 말한다..!

이러한 내부적인 사이클을 이해하는 것은 유니티의 동작과정을 이해하는 데 있어서 매우 중요한 요인이 된다.

이미지

출처 (유니티 공식 Documentation)

실제로 세세한 부분이 전부 표시된 라이프 사이클이지만 물론 유니티 개발자라면 전체적인 부분과 세세한 부분을 전부 알아야 한다.

크게 3가지 부분으로 나눌 수 있다.

  • 시작부분
    • Awake, OnEnable, start..
  • 업데이트 부분
    • FixedUpdate, Update, LateUpdate..
  • 삭제및 종료부분
    • OnDisable, OnDestroy..

크게는 이렇게 분류가 가능하지만.. 공식 문서에 나온 라이프 사이클을 한번 따라가보자!!
좀 더 자세히 알아보자!

Editor

  • Reset: 에디터에서 동작하는 방식으로 오브젝트 생성 후 리셋을 눌러줄 때 실행이 된다. 즉, 객체의 값을 초기값으로 줄때 사용
public class fkdl : MonoBehaviour
{
    public int hp;
    public int mp;

    void Reset() {
        hp = 10;
        mp = 20;
    }
}

위와 같이 작성 후 스크립트를 컴포넌트에 부착하게 되면 해당 값이 자동으로 설정된 모습을 볼 수 있다.

이후에도 값을 변경하고 에디터상에서 reset을 호출하게 되면 값이 해당 값으로 변경된다.

Initialization

  • Awake: 스크립트가 실행될 때 단 한번만 호출되는 함수(초기화 목적)이다.

Awake는 start보다 먼저 실행되기 때문에 초기화 순서를 고려할 수 있으며 비활성화 상태로 생성되더라도 호출되기 때문애 start와 구분된다.

따라서 비용이 큰 find관련 함수를 넣어주는 것이 적합하다.

private void Awake() {
    
}
  • OnEnable: 스크립트가 활성화되어 있을 때, 오브젝트가 활성화 될 때 마다 호출되는 함수이다. 즉, 처음에 한번 호출되고 활성화 될 때마다 호출된다는 소리..!

따라서 사용자가 유동적으로 비활성화와 활성화를 통해 다양한 기능을 선보일 수 있다.

private void OnEnable() {
    
}

Awake, OnEnable함수는 씬이 시작되면 호출된다. 씬의 오브젝트에 대해서 한 번씩

  • start: 초기화 단계에서 가장 마지막에 호출되는 함수로 위의 사진으로 보더라도 reset이후에 호출된다.

다시 말해서 실제 update함수들 전 마지막 초기화단계로 볼 수 있다.

하지만 해당 스크립트가 활성화되어 있어야 한다.

실제로 내부에서도 스크립트가 활성되고 첫 번째 프레임 업데이트 전에 start가 호출된다.

코루틴으로 호출 가능..!

private void Start() {
    
}

Physics

  • FixedUpdate: 일정한 주기로 호출되는 Update형식의 함수이다. 디폴트값은 0.02초지만 프로젝트 셋팅에서 수정이 가능하다.

Update와 다른점은 물리계산을 위해 주로 사용되며 환경에 따라 프레임이 달라질 수 있지만 정확한 물리계산은 달라지면 안되기 때문에 해당 값을 설정할 수 있는 FixedUpdate를 사용해야 한다.

private void FixedUpdate() {
    
}
  • OnTrigger함수

OnTriggerEnter, OnTriggerStay, OnTriggerExit (2D)

이는 뒤에서 콜라이더편에서 다루겠지만 해당 콜라이더의 isTrigger가 체크되어 있는 경우에 충돌이 발생하면 호출된다.

충돌 처리관련 함수들로 충돌되었을 때, 충돌이후 빠져나가기 전까지, 빠져나가고 나서..로 이루어져 있는 함수들이다.

private void OnTriggerEnter(Collider other) {
    // 충돌
}
private void OnTriggerStay(Collider other) {
    // 충돌 직후 부터 빠져나가기 전까지
}
private void OnTriggerExit(Collider other) {
    // 빠져나가고
}
  • OnCollision함수

OnCollisionEnter, OnCollisionStay, OnCollisionExit
(2D)

위와 다른 점은 isTrigger부분이고 자세한 부분은 콜라이더 편에서…!

    private void OnCollisionEnter(Collision other) {
        
    }
    private void OnCollisionStay(Collision other) {
        
    }
    private void OnCollisionExit(Collision other) {
        
    }

이외에도 Physics부분에 애니메이션 처리부분이 있지만 이후 애니메이션을 다루면서 내부에서 어떤 방식으로 동작하는지 알아보자..!

Input event

  • OnMouse함수

OnMouseButtonDown, OnMouseButtonUp, OnMouseButton

마우스 입력으로 호출되는 함수이다.

마우스 버튼을 눌렀을 때, 마우스 버튼을 눌렀다가 뗏을 때, 마우스 버튼을 누르면(계속 호출된다.)

Gamelogic

  • Update: 스크립트가 활성화 되어 있을 때 프레임마다 호출된다.

실질적인 게임 로직처리를 이 부분에서 하게된다.

하지만 위에서 말한대로 환경에 따라 성능차이로 프레임이 오차가 발생하기 때문에 물리적인 부분은 FixedUpdate에서 해결해야 한다.

코루틴을 사용하는 방법도 있다.

private void Update() {
    
}
  • yield null: Update함수가 호출된 후에 실행되며 코루틴 함수에서 한 프레임 대기할 때 사용된다.

  • yield WaitForSeconds: Update함수가 호출된 후 지정된 시간 만큼 지연 후 실행된다.

  • yield WWW: www를 이용하여 다운로드 후 실행된다.

  • yield StartCoroutine: 해당 코루틴을 실행하고 완료까지 대기

  • LateUpdate: Update함수 후 프레임마다 호출된다.

LateUpdate의 경우 왜 사용하지..?라는 의문이 들 수 있지만 오브젝트를 따라가는 카메라의 경우에는 추적할 수 있도록 LateUpdate에서 실행하는 것이 유용하다..!

private void LateUpdate() {
    
}

Scene rendering

이 부분 또한 렌더링 시스템을 다룰 때 이어서 설명,,!

Gizmo randering

  • OnDrawGizmos: 씬 뷰에 기즈모를 그린다.

GUI rendering

  • OnGUI: 설정된 GUI이벤트를 따라서 프레임마다 호출된다.

End of Frame

  • yield WaitForEndOfFrame: 하나의 프레임이 완전하게 종료가 되면 호출되게 된다.

Update, 렌더링(기즈모, GUI..등)이 끝나게 되면 호출

Pausing

  • OnApplicationPause: 해당 어플리케이션이 pause당했을 경우 호출되며 0,1의 값을 리턴한다.

++ OnDisable

아래에 Decommissioning에서 호츌되지만 이전에 비활성화 될 경우에 호출된다.

코루틴 사용 불가

Decommissioning

  • OnApplicationQuit: 해당 어플리케이션이 종료될 경우 호출된다.

에디터의 경우 종료(start종료)

  • OnDisable: 종료되는 시점에도 마찬가지로 호출

  • OnDestroy: 오브젝트가 파괴되는 경우 호출되게 된다.

마찬가지로 종료 시에 호출

마무리

위의 라이프 사이클을 이해하고 전체적인 흐름을 파악했다면 원하는 곳에서 원하는 작동을 만들어 낼 수 있다.

(22.02.27 추가)

이해가 빠르게 되기 위해서 스크립트 상으로 흐름을 표시했다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{

    void Awake()
    {
        // 가장 처음 호출, 한번 호출, 초기화 목적
        // 비활성의 경우에도 호출된다.
    }

    void OnEnable()
    {
        // 두번째로 호출되며 활성화 되어 있을때, 활성화 될때 마다     
    }

    void Start()
    {
        // 세번째로 호출되며 update함수전 마지막 초기화 단계
        // 활성화 되어야 함
        // 코루틴으로 호출될 수 있음
    }

    void Update()
    {
        // 프레임마다 호출되는 함수
        // 대부분의 로직처리를 담당함
        // 랜더링도 프레임단위로 이루어지기 때문에 랜더링과 주기가 같음
    }

    void LateUpdate()
    {   
        // Update함수가 종료되고 호출되는 함수
    }

    void FixedUpdate()
    {
        // 일정한 간격으로 호출되며 물리쪽을 담당
    }
}

태그: ,

카테고리:

업데이트:

댓글남기기