A-Dyu의 개발 일기장
[유니티 최적화]태그 비교 최적화 본문
유니티에서 태그를 비교할 때 ==연산자를 많이 사용한다.
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 메서드는 태그가 존재하지 않을 시 예외가 발생하기 때문에 태그 오타/오용 확인에도 사용할 수 있다.