A-Dyu의 개발 일기장

[유니티 최적화]태그 비교 최적화 본문

유니티/유니티 스크립팅

[유니티 최적화]태그 비교 최적화

ADyu 2024. 5. 22. 14:34

유니티에서 태그를 비교할 때 ==연산자를 많이 사용한다.

using UnityEngine;

public class Test : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
    	//플레이어랑 충돌할 시
        if (collision.gameObject.tag == "Player")
        {
            Debug.Log("플레이어랑 충돌하였습니다.");
        }
    }
}

하지만 이렇게 비교하면 tag는 변수가 아닌 프로퍼티이기 때문에 string을 복사,생성 후 메모리에 할당한다.

그렇기 때문에 비교 후 가비지가 발생하고,결국 GC에 의한 성능 저하가 발생한다.

 

하지만 CompareTag 메서드를 사용하면 메모리 할당 없이 태그를 비교할 수 있다.

using UnityEngine;

public class Test : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        //플레이어랑 충돌할 시
        if (collision.gameObject.CompareTag("Player"))
        {
            Debug.Log("플레이어랑 충돌하였습니다.");
        }
    }
}

이러면 메모리 할당 없이 태그를 비교하기 떄문에 가비지가 발생하지 않는다.

 

그 뿐만 아니라, CompareTag 메서드는 태그가 존재하는지 예외 수준으로 검사한다.

== 연산자는 검사하는 태그가 존재하지 않아도 검사 후 false를 반환한다.

using UnityEngine;

public class Test : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        //플레이어랑 충돌할 시
        //Player가 player로 오타가 나도 예외 처리 안 됨
        if (collision.gameObject.CompareTag("player"))
        {
            Debug.Log("플레이어랑 충돌하였습니다.");
        }
    }
}

하지만 CompareTag 메서드는 태그가 존재하지 않으면 "tag" is not defined. 예외를 발생시킨다.

using UnityEngine;

public class Test : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        //플레이어랑 충돌할 시
        //player태그가 존재하지 않아 예외 발생
        if (collision.gameObject.CompareTag("player"))
        {
            Debug.Log("플레이어랑 충돌하였습니다.");
        }
    }
}

CompareTag의 예외 처리

이처럼 CompareTag 메서드는 태그가 존재하지 않을 시 예외가 발생하기 때문에 태그 오타/오용 확인에도 사용할 수 있다.