티스토리 뷰

## `GameObject.SetActive`와 `Behaviour.enabled`

- GameObject 활성여부 vs 컴포넌트의 활성여부

- Scene내 객체(GameObject)의 활성여부 vs 객체내 부품(Component)의 활성여부(동작가능 : e.g. Update)

- 참고로 Transform의 경우 Bahaviour가 아닌 Component에서 바로 상속하기에 enabled가 없음. 즉, 항상 동작.

 

## MonoBehaviour 파생 클래스의 생성자

- Unity Engine 및 직렬화 시스템에 의해 생성자가 여러번 호출될 수 있으니 pure C# API class에만 사용하고 Unity API class에는 사용금지

- 참고로 `RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)` 호출전에 빌드된 모든 MonoBehaviour script의 생성자가 호출되는듯(Subsystem에 Scripting이 있음)

 

## Awake()

- 해당 Script lifetime 동안 정확히 한번만 호출

- Script 인스턴스가 로드될 때 호출(e.g. `Object.Instantiate`, Scene로드)

  - Scene의 모든 활성 GameObject가 초기화된 후 호출됨. 따라서 해당 메서드내에서 `GameObject.FindWithTag` 등으로 쿼리 가능하지만 쿼리된 객체의 Awake()가 먼저 호출되었는지는 보장되지 않으므로 참조하는 객체 속성 할당 또는 사용에는 주의가 필요함

  - 비활성화(`SetActive(false)`) 상태로 인스턴스가 로드되면 최초 활성화 이전까지 Awake호출이 지연됨에 주의

- 해당 Component의 활성화(enabled) 여부와 상관없이 초기화시 호출됨

- 객체 초기화에 사용 (Coroutine으로 정의 불가)

 

## OnEnable()

- 객체가 enabled 되거나 active될 때 호출

- 활성화 될때마다 초기화가 필요한 로직은 해당 메서드에서 구현

 

## Start()

- 해당 Script lifetime 동안 정확히 한번만 호출

- 해당 객체의 최초 Update() 호출 직전에 호출됨

- 비활성화(Disabled) 상태인 경우 Awake()와 동일한 frame에서 호출되지 않을 수 있음

- "Where objects are instantiated during gameplay, their Awake function is called after the Start functions of Scene objects have already completed." (공식문서에 뭔소린지? 왜케 일관성이 없지?? 이미 Scene및 Update들이 열나게 돌아가는중에는 중간에 인스턴스화되는 객체들의 Awake 호출 순서는 보장되지 않는다는건가?? 차후 테스트 필요)

- 객체 상태 시작에 사용 (Coroutine으로 정의 가능 - Unity Engine에서 비동기로 호출함)

 

## Update()

- MonoBehaviour가 enabled된 경우 모든 frame에서 호출됨

 

## OnApplicationPause()

- 일시정지가 감지된 frame의 끝에 호출됨

- 일시정지 그래픽 표시를 위해 호출이후 frame이 1회 추가 실행됨

 

## OnApplicationQuit()

- 앱 종료전 모든 GameObject에서 호출

 

## OnDisable()

- 객체(부착된 Behaviour)가 disabled 되거나 destroy될 때 호출

 

## OnDestroy()

- 객체(부착된 Behaviour)가 파괴될 때 호출(e.g. 오브젝트 소멸)

- 마지막 프레임까지 Update를 마친 뒤 호출됨

 

기타 다른것들은 아래 링크 참조

 

 

## References

https://docs.unity3d.com/kr/2021.3/Manual/ExecutionOrder.html

 

이벤트 함수의 실행 순서 - Unity 매뉴얼

Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.

docs.unity3d.com

https://docs.unity3d.com/ScriptReference/MonoBehaviour.Awake.html

 

Unity - Scripting API: MonoBehaviour.Awake()

Awake is called either when an active GameObject that contains the script is initialized when a Scene loads, or when a previously inactive GameObject is set to active, or after a GameObject created with Object.Instantiate is initialized. Use Awake to initi

docs.unity3d.com

https://docs.unity3d.com/ScriptReference/MonoBehaviour.Start.html

 

Unity - Scripting API: MonoBehaviour.Start()

Like the Awake function, Start is called exactly once in the lifetime of the script. However, Awake is called when the script object is initialised, regardless of whether or not the script is enabled. Start may not be called on the same frame as Awake if t

docs.unity3d.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함