ecsimsw

Accessing other gameobjects 본문

Accessing other gameobjects

JinHwan Kim 2019. 1. 27. 20:40

Accessing

- 다른 오브젝트, 컴포넌트를 엑세스 하는 방법을 공부하였다.
  • GameObject.GetComponent
    - 해당 게임 오브젝트의 컴포넌트 타입을 인자로 받아 반환하고, 없다면 null을 리턴한다.
    Rigidbody rb = this.gameObject.GetComponent<Rigidbody></Rigidbody>();
  • 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<Transform>(); foreach(Transform i in gameObjects) { Debug.Log("GetComponentsInChildren "+i.name); // Cube1, Cube2, Cube3 }


'Etc > Unity' 카테고리의 다른 글

Prefab  (0) 2019.01.30
Rigidbody / AddForce / AddTorque  (0) 2019.01.28
Rotate / Euler angle / Quaternion  (0) 2019.01.27
translate / position, Translate / Time.deltaTime  (0) 2019.01.26
Game object / Compoenets / Accessing /Tag  (0) 2019.01.17
Comments