본문 바로가기

내일배움캠프/꾸준CS과제

[TIL 24.07.15] 11.MonoBehaviour와 Unity 생명주기

.

 

목   차

     

    확인 문제

    1. Time.timeScale을 0으로 하면 Update와 FixedUpdate는 모두 호출이 되지 않을까요? 그 이유는 무엇일까요?

    timeScale을 0으로 설정하면 Update와 FixedUpdate 모두 호출되지 않는다.

    timeScale은 상대값으로, 프레임 속도이든 실제시간이든 Unity 프로그램 안의 모든 시간의 흐름에 관여한다.

     

    2. Update의 호출주기에 영향을 주는 것은 무엇일까요?

    1. 프레임 속도. 즉, 하드웨어의 성능이나 프로그램의 복잡성에 영향을 받는다.
    2. timeScale. 게임의 전체 시간의 흐름을 조절한다.

    3. FixedUpdate의 호출주기에 영향을 주는 것은 무엇일까요?

    1. 실제 시간.
    2. timeScale. 게임의 전체 시간의 흐름을 조절한다.

    4. Awake와 Start, OnEnable의 호출 순서는 어떻게 될까요?

    Awake > OnEnable > Start의 순으로 호출된다. 

    Awake는 게임 오브젝트가 생성/활성화될 때 가장 먼저 호출되며, 주로 객체의 초기화 작업이 이루어진다.

    OnEnable은 게임오브젝트가 활성화될 때마다 호출되지만, Awake 다음에 호출된다. 

    Start는 첫 번째 프레임 업데이트 전에 한 번만 호출된다. 주로 초기 설정 작업에 사용된다.


     

    설명 문제

    1. Unity 생명주기(Unity Life Cycle)에 대해서 설명해주세요.

    Unity 생명주기란, MonoBehaviour를 상속받는 스크립트들이 Unity Editor - Hiearchy창의 GameObject에 컴포넌트로 존재하다가 GameObject의 상태 또는 프로젝트의 상태에 따라 순차적으로 호출되거나 업데이트 되는 메서드들을 말한다.

    2. MonoBehaviour 클래스의 주요 메서드와 그 기능에 대해 설명해주세요. MonoBehaviour 클래스에서 Start와 Awake의 차이점은 무엇이며, 이를 적절히 사용하는 방법에 대해 설명해주세요.

    MonoBehaviour의 주요메서드에는 다음과 같은 것들이 있다:

    •  Awake
    • Start
    • Update
    • FixedUpdate
    • LateUpdate
    • OnEnable
    • OnDisable
    • OnDestroy
    • OnApplicationPause
    • OnApplicationExit
    • OnTrigger~
    • OnCollision~

    Awake 함수는 가장 먼저 호출되는 함수로, 초기화작업을 주로 실행시켜준다. 

    Start 함수는 Awake함수들이 작동한 후 호출되는 함수로, 주로 Awake를 통해 초기화되는 데이터 불러오기 등의 초기설정을 할 때 사용된다.

    3. Update, FixedUpdate, LateUpdate의 차이점에 대해 설명해주세요.

    • Update 함수
      매 프레임마다 호출되며, 주로 게임 로직이나 사용자 입력을 처리한다.
    • FixedUpdate 함수
      고정된 시간 간격으로 호출되며 물리 기반 오브젝트의 움직임을 업데이트한다.
    • LateUpdate 함수
      모든 Update() 호출이 완료된 후에 호출되며, 후처리 작업을 수행한다. 다른 오브젝트의 상태가 모두 업데이트된 후 위치나 상태를 조정할 때 사용한다.

    4. Time.deltaTime이란 무엇이며, 사용하는 이유에 대해 설명해주세요.

    Time.deltaTime은 이전 프레임과 현재 프레임 사이의 시간 간격이다. 프레임 속도와 무관하게 일정한 속도로 오브젝트를 움직이거나 애니메이션을 처리하기 위해 사용된다.


     

    실습 문제

    public static void AddEnemy(GameObject enemy)
    {
        // Awake가 호출되기 전에 함수가 호출된 경우 Job Queue에 추가하는 코드
        if (Instance == null)
        {
            jobQueue.Enqueue(() => Instance.AddEnemyInternal(enemy));
        }
        else
        {
            Instance.AddEnemyInternal(enemy);
        }
    }
    
    private void ProcessJobQueue()
    {
        // Job Queue를 처리하는 코드
        // JobQueue가 빌 때까지 JobQueue에 있는 작업을 빼내서 실행
        while (jobQueue.Count > 0)
        {
            jobQueue.Dequeue().Invoke();
        }
    }