반응형
게임 오브젝트 풀 제작을 위해 게임 오브젝트 활성화/비활성화시 참고할 사항들을 정리해보았습니다.
관련 동작은 모두 4.2기준으로 정리하였습니다.

1. 계층 구조를 가진 게임 오브젝트 그룹의 활성화/비활성화
- 4.0부터는 편리하지만 느렸던.. SetActiveRecursively 함수가 사라지고 SetActive함수로 대체되었습니다. 하지만 이 함수는 지정한 단일 게임 오브젝트만 활성화/비활성화됩니다.
- 계층구조를 가진 게임 오브젝트 그룹을 모두 비활성화시키는 것을 4.0에서 간단히 구현하려면 비활성화된 게임 오브젝트를 미리 하나 만들고, 그룹을 이 게임 오브젝트의 자식으로 등록하면 그룹내 모든 게임 오브젝트가 자동으로 비활성화됩니다. 
그룹.transform.parent = 비활성화게임오브젝트.transform;
- 반대로 비활성화된 그룹을 활성화된 게임 오브젝트의 자식으로 옮기면 그룹 모두가 자동으로 활성화됩니다.

2. 게임 오브젝트의 활성화 및 비활성화시 일어나는 일들
- OnEnable/OnDisable 이벤트 함수가 호출됩니다.
- 게임 오브젝트가 비활성화되면 GameObject.Find 및 GameObject.FindObjectWithTag 등의 함수로는 찾을 수 없게 됩니다. 이는 유니티 내부에서 활성화된 게임 오브젝트만 목록으로 관리하기 때문입니다.
- 게임 오브젝트가 비활성화되면 컴포넌트에서 동작하던 코루틴 함수들은 모두 자동으로 종료됩니다. 
- 물체가 비활성화되면, 컴포넌트들의 실행은 중지되지만 데이터는 언제든지 바꿀 수 있습니다.
- Invoke와 Destroy의 시간 지연 명령은 게임 오브젝트가 비활성화되어도 중지되지 않습니다.

3. OnEnable과 Awake, Start와의 차이점
- OnEnable 함수는 Awake함수 이후와 Start 함수 이전에 호출되며, Awake, Start 함수와 다르게 비활성화한 후 활성화하면 다시 호출됩니다.
- OnEnable함수를 활용하여 아래처럼 코루틴을 동작시키는 코드를 만들면 게임 오브젝트의 활성화, 비활성화 걱정 없이 이전 상태의 코루틴을 유지할 수 있습니다.

public string state = string.Empty;
void OnEnable()
{
if(string.IsNullOrEmpty(state))
state = "Idle";
StartCoroutine(state);
}

4. 코루틴의 수동 활성화/비활성화
- 코루틴의 호출은 StartCoroutine(코루틴함수) 와  StartCoroutine("코루틴함수이름") 이 있습니다. 
- 전자는 수동으로 종료시킬 방법이 없지만, 후자는 StopCoroutine("코루틴함수이름") 으로 멈출 수 있습니다.
 StartCoroutine("코루틴함수이름") 을 여러 번 호출하여 동일한 코루틴을 여러개 실행시켜도 StopCoroutine("코루틴함수이름") 함수 호출 한 번이면 모두 없어집니다. 

5.스크립트 컴포넌트의 활성화 비활성화
- 게임 오브젝트가 아닌 스크립트 컴포넌트를 활성화 비활성화하는 경우에도 동일하게 OnEnable/OnDisable 함수가 호출됩니다.
- 하지만 이상하게도 스크립트 컴포넌트를 비활성화하면 게임 오브젝트를 비활성화시키는 경우와 다르게 코루틴은 죽지않고 그대로 유지됩니다.
- 따라서 이 경우에는 특별히 OnDisable 함수에 StopCoroutine 함수를 명시해주어야 합니다.

void OnDisable()
{
StopCoroutine(state);
}

6. 유니티 렌더링 루프의 동작방식
- 렌더링 루프는 정해진 순서대로 각 컴포넌트의 관리자들이 자신들이 가지고 있는 컴포넌트 목록을 체크하면서 현재 프레임에서 해야할 일들을 진행합니다. 
- 예를 들어 render.enable = false; 구문은 게임 오브젝트의 렌더러 컴포넌트를 렌더링 관리자의 관리 목록에서 제거합니다.
- 렌더링 작업에 대한 부하만 고려한다면 이는 가장 가볍고 빠른 활성화/비활성화방법입니다.
- 하지만 게임 오브젝트 내에 컴포넌트가 많다면, 각 컴포넌트의 관리자들이 쓸데없는 체크를 하지 않게 게임 오브젝트를 모두 비활성화하는 것이 좋을 수도 있습니다.


출처 : http://goo.gl/tKdoUS


반응형

'개발 Tip > Unity3D' 카테고리의 다른 글

유니티 스크립트 컴파일 (번역)  (0) 2013.09.27
모노 iOS 제약사항 (번역글)  (0) 2013.09.27
유니티 Tips ver 2013-09-25  (0) 2013.09.27
Unity3D 상에서 선긋기(Line)  (2) 2013.04.30
Sprite Manager 2 vs. 2D Toolkit  (0) 2013.04.05

+ Recent posts