ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 16일차 2일 기술면접 대비 ( 유니티 생명주기 )
    개발일지/스파르타 코딩클럽 부트캠프 2024. 8. 1. 09:59

     

    확인 문제

    💡 질문에 답해보고 직접 확인해보는 시간을 가집시다.

     

    1. Time.timeScale을 0으로 하면 Update와 FixedUpdate는 모두 호출이 되지 않을까요? 그 이유는 무엇일까요?
    2. Update의 호출주기에 영향을 주는 것은 무엇일까요?
    3. FixedUpdate의 호출주기에 영향을 주는 것은 무엇일까요?
    4. Awake와 Start, OnEnable의 호출 순서는 어떻게 될까요?

    1, 2, 3 공통 답변

    Update함수 : Update함수는 유니티의 메인 게임 루프에서 매 프레임마다 호출되는데, Time.timeScale을 0으로 하면

    게임의 진행 시간과 관련된 모든 계산이 중지된다. 그 결과 Update함수도 호출되지 않는다. 이는 Time.time과 Time.deltaTime이 0이 되기 때문에, 프레임 간 시간 차이가 없다고 인식이 되고, 프레임 간에 아무런 논리적 변화가

    없음을 의미한다.

     

    FixedUpdate 함수 : FixedUpdate 함수는 물리 연산이 수행되는 고정 시간 간격에 따라 호출된다.

    기본적으로 유니티에서는 물리 연산의 정확성을 위해서 Time.FixedDeltaTime에 설정된 고정 시간 간격에 따라서

    FixedUpdate가 호출된다. 그러나 Time.timeScale이 0이 되면, 물리 연산의 시간도 멈추게 되어서 FixedUpdate의

    함수 호출이 중지된다. FixedUpdate 함수는 Time.FixedDeltaTime과 Time.timeScale에 의해서 조정된 시간의 진행에 따라 호출이 되기 때문에, 시간 스케일이 0이면 호출되지 않게 된다.

     

    4 답변

    Awake가 가장먼저 실행되고 이후 OnEnable, Start 순으로 호출된다.

     

    설명 문제

    💡 질문을 직접 설명해보고, 모르는 부분이 있다면 알아보는 시간을 가집시다.

     

    1. Unity 생명주기(Unity Life Cycle)에 대해서 설명해주세요.
    2. MonoBehaviour 클래스의 주요 메서드와 그 기능에 대해 설명해주세요.
      • MonoBehaviour 클래스에서 Start와 Awake의 차이점은 무엇이며, 이를 적절히 사용하는 방법에 대해 설명해주세요.
    3. Update, FixedUpdate, LateUpdate의 차이점에 대해 설명해주세요.
    4. Time.deltaTime이란 무엇이며, 사용하는 이유에 대해 설명해주세요.

     

    1 답변

    유니티의 생명주기란 스크립트와 오브젝트가 다양한 상태에서 특정 이벤트를 발생시키는 순서를 의미한다.

    이 생명주기에 따라서 게임 오브젝트가 생성되고 파괴되는 과정에서 어떤 메서드가 언제 호출되는지 알 수 있으며, 적절한 시점에 로직을 추가할 수 있다.

     

    2 답변

    MonoBehaviour 클래스는 유니티의 다양한 이벤트 메소드를 사용가능하게 해주며, 게임 오브젝트의 생명주기와 상효작용할 수 있게 해준다. 주요 메서드로는 Awake, Start, Update, FixedUpdate, OnEnable, OnDisable, OnDestroy등이 있다.

    Awake : 스크립트가 처음 로드될 때 오브젝트의 활성 유무에 상관 없이 호출되며, 다른 모든 초기화 작업보다 먼저 호출되기 때문에, 종속성이 있는 데이터를 준비하거나, 다른 컴포넌트 또는 스크립트의 초기 설정에 유용하다.

    Start : Awake이후에 첫 프레임 전에 한 번 호출된다. 게임 오브젝트가 활성화 된 상태일 때만 호출된다. 게임 오브젝트의 초기화과 완료되고 수행해야 할 작업에 사용되며, 주로 다른 오브젝트와의 상호작용이나, 모든 Awake 메서드가 실행된 후에 처리해야하는 초기화를 수행한다.

    Update : 매 프레임마다 호출되며, 주로 게임 로직, 입력 처리, 애니메이션 업데이트 등에 사용된다. 프레임 단위로 계속해서 변해야하는 상태를 업데이트할 때 사용된다.

    FixedUpdate : 고정된 시간 간격 (Time.FixedDeltaTime)마다 호출되며, 물리 연산에 사용된다. 물리 연산의 정확성을 위해서 물리 관련 코드를 작성하곤한다.

    OnEnable : 게임 오브젝트가 활성화될 때 호출된다. 이벤트 리스너 등록 등 오브젝트가 활성화 될 때 필요한 작업에 사용된다.

    OnDisable : 게임 오브젝트가 비활성화 될 때 호출된다. 이벤트 리스너 해제 등 오브젝트가 비활성화 될 때 필요한 작업에 사용된다.

    OnDestroy : 게임 오브젝트가 파괴될 때 호출된다. 메모리 해제나 리소스 정리 등 오브젝트가 파괴될 때 필요한 작업에 사용된다.

     

    Awake와 Start의 차이점으로는 Awake는 모든 초기화 작업 중에 가장 먼저 호출된다. 이는 모든 컴포넌트가 초기화 되기전에 호출되므로, 다른 컴포넌트가 오브젝트에 접근하기에 제한이 있을 수 있다.

    Start는 모든 오브젝트의 Awake메서드가 실행된 후에 게임이 시작되기 직전에 호출된다. 따라서 Start에서는 다른 오브젝트와 상호작용이 보장된 상태에서 작업을 수행할 수 있다.

    Awake는 오브젝트 자체의 초기화 작업, 다른 오브젝트에 의존하지 않는 초기화 작업에 사용하고

    Start는 다른 오브젝트와 상호작용이 필요한 초기화 작업, 다른 오브젝트의 컴포넌트를 참조하거나 초기 설정을 할 때 사용한다.

     

    3 답변

    Update, FixedUpdate, LateUpdate는 각각 호출 타이밍에 차이가 있다.

    Update는 매 프레임마다, FixedUpdate는 Time.fixedDeataTime마다, LateUpdate는 모든 Update가 호출된 후 매 프레임마다 호출된다. 

     

    4 답변

    Time.deltaTime은 유니티에서 두 프레임 간의 시간 차이를 나타내는 프로퍼티이다. 이 값은 초 단위로 표현되며, 이전 프레임이 완료된 시점과 현재 프레임이 완료된 시점 사이에 경과한 시간을 의미한다.

     

    사용하는 이유

     

    프레임 레이트 독립성 : 

    다양한 이유로 게임의 프레임은 일정하지 않을것인데, Time.deltaTime을 사용하면, 프레임이 변화해도 게임 오브젝트의 움직임이나 애니메이션이 일정한 속도로 진행되도록 할 수 있고, 이는 프레임 간 시간 차이에 따라서 로직을 조정하기 때문에 프레임 레이트와 관계없이 일정한 게임 경험을 제공할 수 있다.

     

    일관된 속도 유지 :

    어떤 오브젝트를 매 프레임마다 일정한 속도로 움직이고자 할 때, 단순히 위치를 일정 값만큼 증가시키기보다는 Time.deltaTime을 곱해주어야 한다. 이를 통해서 프레임이 높든, 낮든 동일한 시간동안 동일한 거리를 이동한다.

     

    애니메이션 및 타이머 관리 :

    Time.deltaTime은 애니메이션의 프레임 간 보간, 지속 시간, 게임 내 타이머 관리 등에 사용된다. 예를 들어서 캐릭터가 일정 시간동안 특정 애니메이션을 재생해야 할 때, Time.deltaTime을 사용하여 애니메이션의 진행도를 정확히 제어할 수 있다.

     

     

     

     

Designed by Tistory.