Home Unity 동작방식1
Post
Cancel

Unity 동작방식1

유니티 이벤트 함수

함수설명
Awake씬이 시작 시점(프리팹 인스턴스화 된 직후)에 각 오브젝트마다 한번씩 호출.
게임 오브젝트가 비활성 상태라면 활성화 될 때까지 호출되지 않음.
OnEnable게임 오브젝트 활성화 직후 함수를 호출함. (반드시 오브젝트가 활성화 된 경우에만 수행)
Start스크립트 인스턴스가 활성화된 경우 첫번째 프레임 업데이트 전에 호출됨.
FixedUpdate프레임 속도와 관계없이 일정한 간격으로 두고 반복적으로 호출됨.
항상 빠른 속도로 호출하는 것을 보장하고 있음. 따라서 성능과 프레임 드랍에 영향을 받지 않아야 하는 물리적 처리와 같은 동작은 FixedUpdate에서 처리함.
호출 주기는 Project Settings에서 변경 가능함
Update프레임당 한 번 호출되며 프레임 업데이트를 위한 주요 작업을 하는 함수임
LateUpdateUpdate가 끝난 후 프레임당 한 번 호출됨. 주로 카메라와 같이 update 후 후속 처리가 필요한 경우에 활용함.
OnDisable동작이 비활성화 되거나 비활성 상태일 때 호출되는 함수
OnDestory오브젝트가 제거되기 직전 모든 프레임 업데이트를 마친 후 가장 마지막에 호출됨.

이벤트 실행 순서

Awake → OnEnable → Start → FixedUupdate → Update → LateUpdate → OnDisable → OnDestory

각 이벤트 호출 순서는 씬에 추가된 모든 오브젝트의 이벤트가 호출 된 후에 다음 이벤트로 넘어감. ⇒ 씬에 추가된 모든 오브젝트의 Awake, OnEnable 함수가 호출 된 후에 Start, Update 등의 이벤트가 호출됨.

Awake VS Start

  • Awake 함수는 무작위로 호출되기 때문에 다른 스크립트의 Awake에서 초기화하는 변수나 참조를 받아서 사용할 수 없다. (사용하려는 스크립트보다 먼저 초기화 될 경우 오류남) → start 이벤트는 awake와 update 사이에서 한번 호출되기 때문에 다른 스크립트에서 초기화 된 값을 받아서 사용이 가능하다.
  • 스크립트가 비활성화 된 상태에서 개체가 생성되면 Awake는 호출 되지만 Start는 호출되지 않는다. (게임 오브젝트가 비활성 상태면 Awake도 호출되지 않지만 스크립트 비활성 상태에서는 호출된다.)
    • 오브젝트 활성 여부 : GameObject.SetActive - 오브젝트 자체를 숨기는 용도로 사용 가능
    • 스크립트 활성 여부 : Behaviour.enabled - 컴포넌트만 비활성화 시켜 기능을 잠시 정지하는 용도로 사용 가능

Unity Documentation : 유니티 이벤트 함수 설명 참고

유니티 이벤트 함수 동작 방식

보통 함수를 상속받으면 오버라이드해서 메서드를 구현하지만 유티니 스크립트를 만들 때는 오버라이드를 사용하지 않고 만듦.
⇒ 유니티 이벤트 함수들은 특수 처리가 되어 있어 이벤트 함수가 있으면 동작하고, 없으면 동작하지 않는 방식을 사용하고 있기 때문임.

메시지 브로드 캐스팅 방식을 활용

유니티는 개발할 때 클래스를 만든다고 표현하지 않고 스크립트를 만든다고 표현함.
스크립트 탈부착형식을 중시하기 때문에 내부 동작도 탈부착이 가능하도록 만들어져 있음
유니티의 대부분의 컴포넌트는 실행하고 싶은 기능의 이름을 담아 게임 세상에 메시지를 날리는 형식으로 동작한다. ⇒ 브로드 캐스팅 방식

브로드 캐스팅 : 메시지를 무차별적으로 많이 보내는 것

메시지란?

  • 실행해야하 될 기능을 담고 있는 정보
  • 보내는 쪽은 누가 받는지 신경쓰지 않고, 받는 쪽도 누가 보냈는지 신경 쓰지 않는다. → 독립성을 유지할 수 있다.
  • 유니티의 통제를 받는다 → 유니티 이벤트 메시지를 감지할 수 있다.

유니티에서 컴포넌트로 동작하기 위해서는 (메시지를 받기 위해서는) MonoBehaviour 클래스를 상속받아야 함.

MonoBehaviour 클랙스란?

  • 유니티에서 미리 만들어 제공하는 클래스로 컴포넌트로서 동작하기 위한 모든 필요한 기초 기능을 모두 제공함
  • 컴포넌트로서 게임 오브젝트에게 추가될 수 있다.
  • 유니티의 통제를 받는다 → 유니티 이벤트 메시지를 감지할 수 있다.

따라서 유니티는 실행해야될 기능이 있다면 게임 세상에 있는 모든 오브젝트에게 메시지를 뿌림.

예를 들어 초기화를 위해 start 메서드를 가지고 있는 경우 유니티는 update 호출 전 start를 담은 메시지를 보냄. 메시지를 받은 오브젝트 중 start가 있는 컴포넌트는 start 메서드를 실행함. 이후에 게임 중간에 추가로 생성된 오브젝트가 있는 경우에는 start 메시지가 추가된 오브젝트와 그 자식의 오브젝트들에게 브로드캐스팅 되기 때문에 중간에 오브젝트가 생겨도 처음 활성화 되는 순간에 초기화가 가능함.

⇒ 유니티 이벤트 메서드는 이름만 맞춰 구현하면, 해당 타이밍에 자동으로 실행이 된다.

메시지/ 브로드 캐스팅을 사용하기 때문에 복잡한 참조 관계를 끊고 라이프 싸이클을 스스로 관리할 수 있게 함. → 게임 시작, 게임 중, 게임 종료 시점에 필요한 기능을 참조를 통해 직접 실행하지 않고, 게임 오브젝트에서 메시지를 발생시켜 원하는 타이밍에 실행이 가능함.

결론

  • 유니티의 모든 컴포넌트는 Monobehaviour 기반이다.
  • 컴포넌트는 메시지를 받을 수 있다.
  • 메시지에 해당하는 기능을 가지고 있으면 실행한다.
  • 이벤트 기반 메서드는 메시지를 통해, 실행되어야할 타이밍에 자동 실행 된다.
This post is licensed under CC BY 4.0 by the author.

자료구조 알고리즘 정리 목록

Unity 동작방식2 :게임 루프