Accessing
- 다른 오브젝트, 컴포넌트를 엑세스 하는 방법을 공부하였다.
-
GameObject.GetComponent
- 해당 게임 오브젝트의 컴포넌트 타입을 인자로 받아 반환하고, 없다면 null을 리턴한다.Rigidbody rb = this.gameObject.GetComponent (); -
GameObject.Find
- 게임 오브젝트의 이름을 파라미터로 받아 찾고, 그 오브젝트를 리턴한다. 없다면 null을 리턴한다. 이름에 "/"을 이용해서 주소처럼 오브젝트 안의 자식 오브젝트를 명시할 수 있다.(Parent_objcet /Child_ object)docs에선 성능에 저하를 야기하므로 매 프레임 마다 호출되는 경우를 최대한 피하고, startup에 사용하여 변수로 저장하는 것을 추천한다. 또, 가능하면 tag를 이용할 것을 추천한다.GameObject gameObjectA = GameObject.Find("A"); GameObject hand = GameObject.Find("/Monster/Arm/Hand"); -
GameObject.FindWithTag / GameObject.FindGameObjectsWithTag
- tag를 이용해서 게임 오브젝트를 access 한다. FindWithTag는 해당 tag를 갖는 오브젝트 중 처음 것, FindGameObjectsWithTag는 해당 tag를 갖는 오브젝트를 배열로 리턴한다.GameObject[] Enemies = GameObject.FindGameObjectsWithTag("Enemy"); -
child object _ Find, GetChild, GetComponentsInChildren
- 모든 오브젝트는 transform을 컴포넌트로 갖는다. transform의 Find / GetChild 메소드를 통해 자식 오브젝트를 엑세스 할 수 있다.transform.Find는 자식 오브젝트의 이름으로 해당 오브젝트를 엑세스 하고, transform.GetChild는 파라미터로 인덱스를 받아 몇 번째 자식 오브젝트를 엑세스 할 것 인가를 정한다.- transform.Find와 GameObject.Find는 다르다. docs에서 transform.Find 페이지의 "Find does not perform a recursive descend down a Transform hierarchy."으로 transform.Find로는 바로 한 세대 아래의 자식 오브젝트만을 찾을 수 있다는 것을 확인하였다. (transform.GetChild 역시 마찬가지다.)세대와 상관없이 전역에서 오브젝트 name을 통해 탐색하는 GameObject.Find를 이용하거나 "다음 세대의 오브젝트 / 그 자식 오브젝트"와 같이 하여 transform.Find를 이용할 수 도 있다.3rd_generation = transform.Find("2nd_generation/ 3rd_generation"); -
child object _ GetComponentsInChildren
- gameObject의 GetComponentsInChildren은 세대에 상관없이 모든 자손 오브젝트를 배열로 가져온다.아래는 GameObject.Find / transform.Find / transform.GetChild / gameObject.GetComponentsInChildren 을 연습하고 그 결과를 주석 처리 한 것이다."hierarchy" // Cube // - Cube1 // - Cube2 // -- Cube3 GameObject cube1_GameObjectFind = GameObject.Find("Cube1"); // Cube1 Debug.Log("cube1_GameObject Find "+cube1_GameObjectFind.name); GameObject cube1_transformFind = transform.Find("Cube1").gameObject; // Cube1 Debug.Log("cube1_transform Find "+cube1_transformFind.name); GameObject cube1_transformGetchild = transform.GetChild(0).gameObject; // Cube1 Debug.Log("cube1_transform Getchild " + cube1_transformGetchild.name); GameObject cube2_transformGetchild = transform.GetChild(1).gameObject; // Cube2 Debug.Log("cube2_transform Getchild "+cube2_transformGetchild.name); GameObject cube3_transformGetchild = transform.GetChild(2).gameObject; // NULL Debug.Log("cube3_transformGetchild "+cube3_transformGetchild.name); GameObject cube3_GameObjectFind = GameObject.Find("Cube3"); // Cube3 Debug.Log("cube3_GameObjectFind "+cube3_GameObjectFind.name); GameObject cube3_transformFind = transform.Find("Cube3").gameObject; //NULL Debug.Log("cube3_transformFind "+cube3_transformFind.name); GameObject cube3_transformFind__ = transform.Find("Cube2/Cube3").gameObject; //Cube3 Debug.Log("cube3_transformFind__ "+cube3_transformFind__.name); Transform[] gameObjects = gameObject.GetComponentsInChildren (); foreach(Transform i in gameObjects) { Debug.Log("GetComponentsInChildren "+i.name); // Cube1, Cube2, Cube3 }