티스토리 뷰

반응형

Unity 에디터에서 인스펙터를 이용하여 컴포넌트 속성을 언제든 쉽게 변경할 수 있습니다. 하지만 코딩으로 직접 제어하기 위해서 필요한 컴포넌트의 접근이 필요합니다. 그렇지 않으면 미리 변수를 만들어서 에디터에서 미리 변수와 연결 시켜 놓아도 좋지만 변수가 너무 많아 질 수 있습니다.


그리고 오브젝트를 코딩으로 생성과 소멸을 할 수 있게끔 구성하여 만들 수 있을려면 코딩으로 어느 정도의 접근을 해야 합니다. 에디터 사용하지 않아도 코딩으로 다 할 수 있지만 적절하게 분리해서 사용하는 센스가 있어야 겠지요.


유니티에 있는 설명서를 참조해서 정리하도록 하겠습니다.



자신에 GetComponent 사용


가장 단순하고 자주 사용하는 경우, 클래스로 컨포너트를 인스터스한 경우에, 쉽게 사용할 수 있습니다.


void Start()
{
    Rigidbody rb = GetComponent<Rigidbody>();

    rb.mass = 10f;
}


위와 같이 간단하게 가져와서 제어할 수 있습니다. 동일한 오브젝트에 하나 이상의 사용자 정의 스크립트를 연결 할 수 있습니다. 만약에 다른 것을 접근하고자 한다. 컴포넌트 형식을 지정하는 스크립트 클래스 이름을 사용합니다.


만약에 게임 오브젝트에 추가되지 않은 컴포넌트를 가져오려고 하면 null 값을 받습니다. null 대한 처리를 한다든지 아니면 null 나오지 않게끔 해야 합니다. 보통은 컴포넌트 이름에 오타로 인한 실수를 주로 합니다.



다른 오브젝트에 접근


가장 쉬운 방법은 public 인 게임 오브젝트 변수를 스크립트에 추가하면 됩니다.


public class Enemy : MonoBehaviour
{
    public GameObject player;

    void Start()
    {
        transform.position = player.transform.position - Vector3.forward * 10f;
    }
}


또한, 스크립트에서 public 변수 선언하고 컴포넌트가 연결되면 쉽게 접근할 수 있습니다. 지속적으로 그 오브젝트를 사용하는 상황이라면 가장 실용적인 방법입니다. 동일한 유형의 오브젝트를 배열로 유지 할 수 있지만 그것은 런터임에서보다 Uniy 에디터상에서 수행해야 합니다.



자식 오브젝트 찾기


게임 씬에서 같은 형식의 오브젝트를 여러 개 사용하는 경우에 순회하면서 연결하는 방법을 해봅시다. 비슷한 자식이 상당히 많아서 일일이 Unity 에디터 상에서 만들기에 부담스러울때 사용하면 됩니다.


public class WaypointManager : MonoBehaviour
{
    public Transform[] waypoints;

    void Start()
    {
        waypoints = new Transform[transform.childCount];
        int i = 0;

        foreach (Transform t in transform)
        {
            waypoints[i++] = t;
        }
    }
}


자식 오브젝트가 부모 오브젝트의 Transform 컴포넌트를 통해 검색해서 변수에 넣었습니다. 하나의 부모 오브젝트에서 자식 오브젝트를 관리하는 것이 좋습니다.



이름이나 태그로 오브젝트 찾기


식별할 수 있는 정보가 있으면 오브젝트를 찾을 수 있습니다. 하지만 이 방법은 초기화 할 때 한번 정도 사용하고 빈번하게 접근하는 경우에는 피하는 것이 좋습니다.


GameObject player;


void Start()
{
    player = GameObject.Find("MainHeroCharacter");
}


이름으로 찾을때 Find 를 이용하면 됩니다.


GameObject player;
GameObject[] enemies;

void Start()
{
    player = GameObject.FindWithTag("Player");
    enemies = GameObject.FindGameObjectsWithTag("Enemy");
}


태그를 이용해서 찾을때는 FindWithTag 나 FindGameObjectWithTag  를 사용합니다.



실제 코딩 설명


var targetObject = GameObject.Find("EnemyList").transform.GetChild(enemyNumber-1).gameObject;
 풀어서 설명하자면 아래와 같은 순서로 얻어옵니다.
 
1. GameObject.Find("
EnemyList") 통하여 GameObject를 얻습니다.
2. transform으로 Transform을 얻습니다.
3. getChild(
enemyNumber - 1) 통하여 Transform을 얻습니다.
4. 마지막으로 gameObject를 통하여 해당 Enemy 번호의 GameObject를 얻었습니다.

여기서 getChild(
enemyNumber -1) 하는 이유는
getChild의 자식  번째(Hierarchy  기준) 0번째 자식이기 때문입니다.

자식이 추가 삭제가 일어나서 의도한 순서를 정확하게 찾기 힘들다면 GetChild보단 FindChild를 추천합니다.







728x90
반응형
댓글