Unity/정보

[Unity] transform.root - 최상위 객체 찾기

달시_Dalsi 2025. 3. 23. 03:53
728x90

Unity에서 충돌 감지를 할 때 하위 오브젝트가 부딪히더라도 최상위 부모 오브젝트(Player)를 찾아야 하는 경우가 있습니다. 예를 들어, PlayerControllerPlayer 오브젝트에 붙어 있고 플레이어의 손이나 발 같은 하위 오브젝트가 충돌을 감지할 때, 어떻게 최상위 PlayerController에 접근할 수 있을까요?

 


1. 기존 방식의 문제점

보통 GetComponentInParent<T>() 또는 FindObjectOfType<T>()를 사용해서 부모 오브젝트를 찾곤 합니다. 하지만 이러한 방식에는 몇 가지 단점이 있습니다.

  • FindObjectOfType<T>()씬 전체에서 오브젝트를 검색하므로 성능 저하가 발생할 수 있음.
  • GetComponentInParent<T>()부모 계층을 순차적으로 탐색하기 때문에 깊이가 깊어질수록 비효율적임.
  • 특정 계층 구조에 의존하기 때문에, 계층이 변경되면 코드 수정이 필요할 수 있음.

 


2. transform.root를 활용한 해결 방법

transform.root란?

transform.root는 현재 오브젝트의 최상위 부모(루트 오브젝트) 를 반환하는 속성입니다. 이를 활용하면 하위 오브젝트에서 최상위 오브젝트를 빠르게 찾을 수 있습니다.

 

transform.root를 활용한 PlayerController 찾기 (예시)

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.CompareTag("Player"))
    {
        PlayerController playerController = collision.transform.root.GetComponent<PlayerController>();
        if (playerController != null)
        {
            playerController.SetInteractable(this);
        }
    }
}

private void OnTriggerExit2D(Collider2D collision)
{
    if (collision.CompareTag("Player"))
    {
        PlayerController playerController = collision.transform.root.GetComponent<PlayerController>();
        if (playerController != null)
        {
            playerController.ClearInteractable();
        }
    }
}

 

코드 설명

  • collision.transform.root를 사용하면, 어떤 하위 오브젝트가 충돌하더라도 최상위 부모(=Player)를 찾을 수 있음.
  • GetComponent<PlayerController>()를 호출해 최상위 부모의 PlayerController를 바로 가져옴.
  • 하위 오브젝트가 충돌해도 항상 최상위 오브젝트(Player)의 PlayerController를 찾을 수 있음.

 


3. transform.root를 사용할 때의 장점과 주의할 점

장점

  • 하위 오브젝트에서 충돌해도 최상위 부모를 쉽게 찾을 수 있음
  • 불필요한 오브젝트 탐색을 줄여 성능이 최적화됨
  • 코드가 간결해지고 유지보수가 쉬움

 

주의할 점

루트 오브젝트의 계층이 변경되면 동작이 바뀔 수 있습니다.

  • transform.root는 현재 오브젝트의 최상위 부모를 반환하는데 부모 계층이 다르게 설정되면 예상과 다르게 동작할 수 있음.
  • 만약 PlayerController가 루트가 아닌 중간 계층에 있다면 transform.root.GetComponent<PlayerController>()null을 반환할 수 있음.

 


4. transform.root vs GetComponentInParent<T>() 비교

방법 장점 단점
transform.root 빠르게 최상위 부모를 찾음, 성능 최적화 루트 계층이 변경되면 의도치 않은 동작 가능
GetComponentInParent<T>() 중간 부모에서도 찾을 수 있음 부모 계층을 거슬러 올라가기 때문에 성능이 상대적으로 떨어질 수 있음

 


5. 결론

  • transform.root를 활용하면 하위 오브젝트 충돌 시 최상위 부모 객체를 쉽게 찾을 수 있음.
  • 성능 최적화와 코드 간결화에 도움이 되지만, 계층 구조 변경 시 영향을 받을 수 있음.
728x90