본문 바로가기

[유니티] 게임 오브젝트의 생명 주기

Kwonriver 2023. 1. 4.
728x90

 

유니티에서 가장 기본이 되는 단위는 게임 오브젝트이다. 이 오브젝트는 일정한 생명주기를 가지는데 게임 오브젝트가 생성되고 파괴될 때까지의 주기와 그에 맞춰 실행되는 함수를 알아본다.

 

게임 오브젝트의 생명주기는 기본적으로 "탄생 -> 활성화 -> 시작 -> 고정 업데이트 -> 업데이트 -> 늦은 업데이트 -> 비활성화 -> 파괴" 순으로 순환한다. 또한 각 오브젝트는 자신의 현재 상태에 맞춰 특정 함수가 동작된다.

 


[ 생성 (Awake) ]

게임오브젝트가 생성될 때 최초 1회 Awake 함수가 호출된다. 이 함수는 객체의 삶의 시작을 알리는 함수로 오브젝트 내에서는 어떤 함수도 이보다 빨리 실행될 수는 없다. 오브젝트의 생명주기 동안 1회만 호출된다.

 

[ 활성화 (OnEnable) ]

메모리 풀링을 사용하거나 특정 객체를 원하는 타이밍에 껐다 킬 수 있다. 이를 활성화/비활성화라고 하는데 활성화를 시킬 때 OnEnable 함수가 호출된다. Awake 함수가 호출된 후 OnEnable 함수가 호출된다. 단, 활성화를 할 때마다 호출되기 때문에 껏다 켰다를 반복하면 계속 호출된다.

 

[ 시작 (Start) ] 

게임이 시작되었을 때 한 번 호출되는 함수이다. 게임이 시작될 때는 OnEnable보다 늦게 호출되지만 Disable 상태의 오브젝트를 OnEnable 했을 때에는 Start 함수가 호출되지 않는다.

 

[ 고정 업데이트 (FixedUpdate) ] 

유니티에서는 고정 프레임으로 업데이트 함수가 호출된다 FixedUpdate함수로 초당 50회의 고정된 프레임으로 업데이트 함수가 실행된다. 컴퓨터 사양과 관계없이 일정하게 호출되기 때문에 일정하게 동작해야하는 연산이나 물리 연산에 많이 사용된다.

 

[ 업데이트 (Update) ]

흔히 아는 업데이트이다. 언리얼 엔진의 Tick과 같은 함수로 기본적으로는 초당 60프레임의 속도로 업데이트되지만 원한다면 제한을 풀 수 있다. 컴퓨터 사양이 좋지 않으면 Update 함수의 호출 빈도가 60회 아래로 줄어들 수 있다. 일반적인 게임 로직은 전부 이 함수에 추가한다.

 

[ 늦은 업데이트 (LateUpdate) ]

일반 Update 함수가 실행되고 난 뒤 실행되는 LateUpdate 함수로 Update 함수에서 동작한 기능들의 후처리나 데이터 저장 등의 용도로 사용된다.

 

[ 비활성화 (OnDisable) ]

활성화의 반대 함수로 비활성화 될 때마다 OnDisable 함수가 호출된다. 게임오브젝트가 비활성화되면 객체의 렌더링을 하지 않지만 FixedUpdate, Update, LateUpdate 함수도 호출되지 않기 때문에 유의하여야 한다. 이동 관련 기능을 Update 에 넣어놓고 OnDisable 된 상태로 이동 기능을 동작시키면 이동되지 않는다.

 

[ 해제 (OnDestroy) ]

객체가 해제되지 직전에 1회 호출된다. OnDestroy 함수가 호출된 다음에는 오브젝트가 게임 내에서 제거되므로 더 이상의 연산은 할 수 없다.

 

{
    void Awake()
    {
        Debug.Log("Function : Awake");
    }

    void OnEnable()
    {
        Debug.Log("Function : OnEnable");
    }

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("Function : Start");
    }

    void FixedUpdate()
    {
        Debug.Log("Function : FixedUpdate");
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("Fnction : Update");
    }

    void LateUpdate()
    {
        Debug.Log("Function : LateUpdate");
    }

    void OnDisable()
    {
        Debug.Log("Function : OnDisable");

    }

    void OnDestroy()
    {
        Debug.Log("Function : OnDestroy");
    }
}

 

FixedUpdate는 고정된 프레임, Update, LateUpdate는 가변 프레임에 동작하기 때문에 FixedUpdate와 나머지 Update의 호출 횟수 차이가 극명하다. 이는 성능이 좋은 컴퓨터일수록 더 심하다.

728x90