MonoBehaviour

Component란?

  • GameObject 에 부착되는(Attached) 모든 것들이 상속받는 기반 클래스.
  • MonoBehaviour 는 Unity 의 모든 스크립트가 상속받는 클래스
  • 사용자가 Unity 엔진의 작동 방식을 이해하지 못하더라도 코드를 작성할 수 있도록 미리 만들어 둔(built-in) Behaviour 클래스이자 스크립트 명령(scripting instruction) 들의 집합
  • 덕분에 모든 스크립트는 유니티 엔진에 의해 호출(invoke) 되는 콜백(callback) 함수들을 이용할 수 있게 된다

MonoBehaviour

  • 유니티에서 하나의 스크립트는 그 자체로 하나의 클래스
    • 속성(Properties), 메서드(Method) 들을 하나의 객체로 묶은 데이터 타입
  • 유니티에서 하나의 스크립트는 각각 속성(Properties), 변수(Variables), 명령(Instructions) 또는 기능(Functions)을 가지며 사용자는 원하는 순간에 해당 스크립트를 호출
  • 모든 스크립트는 또한 Behaviour Component
  • Behaviour 는 활성화(Enable), 비활성화(Disable) 할 수 있는 Component
  • Behaviour는 껐다켰다 할 수 있는 동작(behaviour) 이며, 이는 캐릭터의 동작이 될 수도 있고, 환경이 될 수도 있고, 게임 내 흐름을 제어하는 프로그램 자체가 될 수도 있음
  • MonoBehaviour 를 상속받은 스크립트 파일은 그 자체로 사용할 수 없음
  • GameObject 에 Component 형태로 등록
  • 또한 가장 중요한 특징 중 하나는 MonoBehaviour 를 상속받은 클래스는 new 로 동적 할당할 수 없음
  • GameObject.Instantiate 함수를 통해 해당 스크립트가 Component 로 추가된 오브젝트의 인스턴스를 생성
// 기존 호출은 아래와 같이 사용
gameObject.AddComponent<GameManager>();

Lifecycle

post_thumbnail

주요 함수 플로우

post_thumbnail

  1. Reset
    • 유니티 에디터에서 오브젝트 생성 후 인스펙터 뷰에서 리셋을 눌러줄 때 실행된다. 객체의 속성을 초기 값으로 설정
  2. Awake
    • 프리팹이 인스턴스화 한 직후, 스크립트가 호출되자마자 오브젝트가 활성화 되어 있어야 호출
    • 모든 오브젝트가 초기화 된 후 호출되기 때문에 GameObject.Find 같은 명령문을 안전하게 사용 가능
    • Awake 함수는 언제나 Start 함수 전에 랜덤 순서로 호출(StartCoroutine 을 사용할 수 없음)
  3. OnEnable
    • 다른 초기화 함수와 달리 하나의 라이프 사이클 내에서 여러번 호출 가능
    • 인스펙터뷰에서 체크 및 스크립트 내에서 SetActive 함수로 게임 오브젝트를 활성화 할 때마다 호출
  4. Start
    • Update 함수가 호출되기 전에 한번만 호출
    • 다른 스크립트의 모든 Awake가 모두 실행된 이후에 실행되며 컴포넌트가 활성화 되어 있어야 호출
    • Awake 실행 순서는 임의이므로, 동적 객체 생성은 Awake에서 하고 이에 접근하는 코드는 Start 또는 그 이후에 할 것
  5. FixedUpdate
    • 프레임과 상관없이 무조건 시간 기준(default 0.02초. 변경 가능)으로 호출 되는 Update 콜백이기 때문에 주로 물리 엔진을 사용하는 경우 일정 시간 간격으로 힘을 가하거나 체크할 때 사용
    • 프레임 속도가 기준 시간 속도보다 오래 걸릴 정도로 느려질 경우 한 프레임에서 여러 번 호출 가능
  6. Update
    • 매 프레임마다 호출되는 가장 일반적인 Update 함수
    • 오브젝트가 활성화 되어 있어야 호출 되며 프레임 단위이기에 호출 시간 간격은 프레임에 따라 변함
  7. LateUpdate
    • 모든 Update 계열 콜백들이 실행되고 나서 호출
    • Update 함수에서 캐릭터를 이동 시킨 후 LastUpdate에서 캐릭터의 좌표를 추적해 카메라의 좌표를 이동시키는 등의 경우에 사용
  8. OnDisable
    • 게임 오브젝트 또는 스크립트가 비 활성화 되었을 때 호출(StartCoroutine 사용 불가)
  9. OnDestroy
    • 해당 오브젝트가 파괴 되기 전 프레임의 Update 함수 실행 후 호출
    • 일반적으로 라이프 사이클 내에서 사용한 자원들을 돌려 놓는 작업을 이곳에서 수행
  10. OnApplicationQuit
    • 앱이 종료 되기 직전에 모든 오브젝트에서 호출
    • 에디터에서는 플레이 모드 중지할 때 호출

Awake vs. OnEnable vs. Start

class MyScript : MonoBehaviour
{
  // ...
  public void Func()
  {
    // 게임 오브젝트의 활성화 여부
    gameObject.SetActive(false);

    // ...

    // 이 스크립트의 활성화 여부
    this.enabled = false;
  }
  // ...
}
  게임 오브젝트 disabled   게임 오브젝트 enabled && 컴포넌트 disabled
Awake 호출되지 않음   호출
OnEnable   호출되지 않음  
Start   호출되지 않음  
  • OnEnable과 Start는 컴포넌트의 활성화 여부에 의해 호출
  • Awake는 오브젝트 활성화 여부에 의해 호출

출처

Categories: ,

Updated: