Byn's Research Note

AI based Mixed Reality, Human-Computer Interaction

↓ My Web CV & Portfolio 자세히보기

Extended Reality/3D Engine Development

Unity Development [3] : 컴포넌트 기반 아키텍처

JaehyeonByun 2024. 10. 14. 16:26

 

프리팹 (Prefab)

 

태그와 레이어 (Tag and Layer)

유니티에서 사용하는 게임 오브젝트는 각각의 이름이 존재하고, 이를 분류하기 위해 Tag, Layer라는 두 가지 요소를 사용한다. 두 요소가 정확히 무슨 차이이고, 어떻게 사용되는지 알아보자.

 

아무 게임 오브젝트나 선택한 후 인스펙터 창에서 Tag나 Layer를 클릭하고 하단 [Add Tag] 또는 [Add Layer]를 클릭하면 Tag & Layers 창으로 이동되며, 이곳에서 태그와 레이어를 관리할 수 있다.

Tag

유니티에서 태그 (Tags)는 게임 오브젝트를 구분하고 분류하는 데 사용되는 간단한 문자열 레이블이다. 주요 기능은 다음과 같다. 

  1. 오브젝트 분류: 태그를 사용하여 오브젝트를 그룹화할 수 있다. 예를 들어, 모든 적 캐릭터에 "Enemy" 태그를 부여하면, 나중에 코드에서 이 태그를 기반으로 적을 쉽게 찾을 수 있다.
  2. 코드에서의 참조: GameObject.FindWithTag("TagName") 메서드를 사용하여 특정 태그를 가진 오브젝트를 찾을 수 있다. 이를 통해 특정 행동이나 이벤트를 태그에 따라 처리할 수 있다.
  3. 간단한 충돌 처리: 특정 태그를 가진 오브젝트 간의 충돌을 처리할 때 유용하다. 예를 들어, 플레이어가 "Player" 태그를 가진 오브젝트와 충돌할 때 특정 행동을 트리거할 수 있다.

태그를 설정하는 방법은 간단하다. 인스펙터에서 오브젝트를 선택하고 "Tag" 드롭다운 메뉴에서 기존 태그를 선택하거나 새 태그를 추가할 수 있다. 태그는 문자열이므로 대소문자를 구분하니 주의해야 한다.

 

대표적인 사용 예시로는 충돌을 검사하는 OnCollision 혹은 OnTrigger 계열의 함수에서 대상 게임 오브젝트와 충돌한 게임 오브젝트의 종류가 무엇인지에 따라 다르게 처리해주는 방법이 있다.

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.transform.CompareTag("PlayerAttack"))
    {
        OnDamage(collision.transform);
    }
}

 

게임 내 몬스터가 플레이어의 공격으로부터 대미지를 입게 하기 위해 위와 같이 충돌 처리를 해준다면 플레이어의 공격으로부터만 대미지를 입도록 설정해주어야 한다. 벽이나 기타 오브젝트에 충돌했을 때도 대미지를 입으면 게임에 치명적인 오류가 생길 것이다. 이럴 때 충돌한 게임 오브젝트의 태그로 검사하는 방식을 많이 사용한다. 이때 CompareTag라는 함수를 이용했는데, 다음과 같이 태그를 비교해줄 수도 있다.

// 1. 이름으로 비교
if (collision.tag == "PlayerAttack"){ ... }

if (collision.tag.Equals("PlayerAttack")){ ... }

// 2. CompareTag 메소드로 비교
if (gameObject.CompareTag("MyTag"))
{

}

 

더보기

중요 : 유니티에서 GameObject의 tagCompareTag() 메서드는 효율성과 안정성 면에서 중요한 차이를 보인다. 태그는 프로퍼티로 구현되어 있어 이를 호출할 때마다 문자열이 복사 생성되어 메모리 할당 및 GC(가비지 컬렉션)의 부하를 증가시킨다. 반면, CompareTag()는 문자열을 직접 비교하지 않고 내부적으로 해시 값을 사용하여 비교하므로 성능이 뛰어나며 동적 할당이 필요 없다. 이로 인해 CompareTag()는 성능 향상을 가져오고 존재하지 않는 태그를 확인하는 기능도 제공하여 코드의 안정성을 높인다. 따라서 태그 비교 시 CompareTag()를 사용하는 것이 더 바람직하며 Visual Studio의 리팩토링 기능을 활용하여 코드를 자동으로 변경하는 것도 좋은 방법이다.

Sorting Layer

· Layer

 

 

1. Layer

Layer 오브젝트들의 그룹을 만들고 관리하는 용도로 사용한다.

  • 게임 오브젝트의 기본 레이어는 Dafalut로 설정되어 있다.
  • 상위 오브젝트와 하위 오브젝트는 서로 다른 레이어를 가질 수 있다.
  • 0~7까지의 기본 레이어 외에 8~31까지의 커스텀 레이어를 제공한다.

 

1) 선택적 렌더링

씬 카메라로부터 특정 레이어만을 렌더링 하도록 할 수 있다.

 

Culling Mask

 

2) 레이어 충돌 매트릭스 (Layer Collision Matrix)

레이어를 기반으로 각 오브젝트 그룹 간의 충돌을 관리할 수 있다. 레이어 충돌 매트릭스 서로 충돌할 수 있는 레이어를 정의한다. 동일한 레이어끼리 충돌을 가능하게 하거나 다른 레이어와의 충돌을 감지하지 않도록 설정할 수 있다.

 

Layer Collision Matrix

 

게임 오브젝트들 간의 불필요한 연산을 하지 않도록 하며 물리 연산에 드는 자원 및 시간을 절약할 수 있다.

 

Physics와 Physics 2D는 서로 물리 연산을 하지 않는다. Project settings에는 Layer Collision Matrix가 Physics와 Physics 2D 두 개 존재한다. 각각은 Layers 설정을 기반으로 레이어 충돌 매트릭스가 설정되어 있지만, Physics에서 수정된 사항은 Physcis 2D 설정에 반영되지 않는다. 따라서 서로 다른 레이어 충돌 매트릭스이다.

 

3) 레이 캐스팅 충돌 (Raycasting Collision)

레이 캐스팅은 물리 연산을 사용하여 빔을 쏘아 모든 오브젝트에 대해 충돌을 판단한다. 그래서 특정 게임 오브젝트가 존재하는지 판단하는 것은 비효율적인 방식이 될 수 있다.

 

이때 Layer Mask를 설정하면 특정 레이어와의 충돌을 판정할 수 있다. 심지어 단일 레이어뿐만 아니라 여러 개의 레이어나 모든 레이어를 선택하여 관리할 수 있다.

 

4) Sorting Layer

정렬 레이어 게임 오브젝트 내에서 렌더링 순서를 정의한다.

 

주로 2D 시스템에서 스프라이트를 정렬하는데 아주 유용하다. 8개의 스프라이트로 구성된 캐릭터를 만들 때 8개의 스프라이트를 하나의 정렬 레이어로 설정하고 이후 정렬 레이어 안에서 추가적으로 정렬 순서를 정하여 캐릭터를 구현할 수 있다.

 

Sorting Layer