이 페이지에서는 Unity 프로젝트에서 스크립터블 오브젝트 기반 열거형을 사용하는 방법을 설명합니다.
이 가이드는 전자책과 함께 제공되는 데모를 통해 Unity 개발자를 지원하기 위해 제작된 6개의 미니 가이드 시리즈 중 세 번째입니다, 스크립터블 오브젝트를 사용하여 Unity에서 모듈식 게임 아키텍처 만들기.
이 데모는 고전적인 공과 패들 아케이드 게임 메커니즘에서 영감을 얻은 것으로, 스크립터블 오브젝트가 테스트 가능하고 확장 가능하며 디자이너 친화적인 컴포넌트를 만드는 데 어떻게 도움이 되는지 보여줍니다.
전자책, 데모 프로젝트, 이 미니 가이드는 Unity 프로젝트에서 스크립터블 오브젝트 클래스와 함께 프로그래밍 디자인 패턴을 사용하기 위한 모범 사례를 제공합니다. 이러한 팁은 코드를 간소화하고 메모리 사용량을 줄이며 코드 재사용성을 높이는 데 도움이 될 수 있습니다.
이 시리즈에는 다음 문서가 포함되어 있습니다:
스크립터블 오브젝트 데모 프로젝트와 이 미니 가이드 시리즈를 살펴보기 전에 디자인 패턴의 핵심은 아이디어에 불과하다는 점을 기억하세요. 모든 상황에 적용되지는 않습니다. 이러한 기술을 통해 Unity 및 스크립터블 오브젝트로 작업하는 새로운 방법을 배울 수 있습니다.
각 패턴에는 장단점이 있습니다. 특정 프로젝트에 의미 있게 도움이 되는 것만 선택하세요. 디자이너가 Unity 에디터에 크게 의존하고 있나요? 스크립터블오브젝트 기반 패턴은 개발자와의 협업을 돕는 좋은 선택이 될 수 있습니다.
궁극적으로 가장 좋은 코드 아키텍처는 프로젝트와 팀에 맞는 아키텍처입니다.
열거형은 코드에서 고정된 명명된 값 집합을 관리할 수 있는 편리한 방법입니다. 하지만 여기에는 몇 가지 제한 사항이 있습니다. 직렬화된 열거형 값은 기호 이름이 아닌 정수로 저장되므로 값을 제거하거나 순서를 바꾸면 올바르지 않거나 예기치 않은 동작이 발생할 수 있습니다. 즉, 열거형, 특히 열거형이 많을 경우 Unity 개발에서 골칫거리가 될 수 있습니다.
표준 접근 방식
일반적인 열거형은 다음과 같습니다:
[System.Serializable]
public enum HandGestures
{
Rock,
Paper,
가위
}
System.Serializable 속성을 사용하여 열거형을 직렬화하면 인스펙터에 열거형이 표시됩니다.
문제
값을 재정렬하거나 삭제하면 문제가 발생할 수 있습니다. 각 값은 내부적으로 정수가 되기 때문에, 그 값이 나타내는 것은 다른 것이 될 수 있습니다. 주어진 예제에서 Paper 값을 삭제하면 가위는 1 값을 가정하게 됩니다.
또는 아래 예시와 같이 값을 추가한 경우입니다.
선택한 열거형 값은 삭제된 항목 뒤에 오는 경우 변경됩니다.
특히 열거형에 많은 값이 포함된 경우 프로젝트를 유지 관리하고 업데이트할 때 문제가 발생할 수 있습니다. 비어 있거나 사용하지 않는 요소를 남겨두거나 정수 값을 명시적으로 설정하여 이 문제를 완화할 수 있습니다. 하지만 어느 솔루션도 이상적이지 않습니다.
스크립터블 객체 기반 열거형은 기존 열거형의 기능을 제공하지만 개별 에셋으로 저장됩니다. 예를 들어, 아래 예시에서 PaddleBallSO 프로젝트의 PlayerIDSO 스크립터블 오브젝트를 살펴보세요.
기본적으로 이것은 빈 스크립터블 오브젝트입니다.
이를 사용하여 프로젝트에서 P1, P2 등과 같은 스크립터블 오브젝트 에셋을 여러 개 생성할 수 있습니다. 데이터가 포함되어 있지 않은 경우에도 스크립터블 오브젝트를 사용하여 비교할 수 있습니다. 프로젝트에서 새 스크립터블 오브젝트 에셋을 생성하고 이름을 지정하기만 하면 됩니다.
프로젝트 내에서 필요한 만큼의 플레이어 ID를 생성하고 쉽게 전환할 수 있습니다. GameDataSO 스크립트에서 할당된 에셋을 변경하기만 하면 됩니다.
동일성을 확인하는 경우 열거형과 유사하게 작동합니다. 두 변수가 동일한 스크립터블 오브젝트를 참조하나요? 그렇다면 동일한 항목 유형입니다. 그렇지 않으면 그렇지 않습니다.
추가 데이터가 없어도 스크립터블 오브젝트는 카테고리 또는 항목 유형을 나타냅니다.
패들볼소에서는 플레이어IDSO가 팀 명칭이 됩니다. 게임데이터소에서는 두 패들을 구분하기 위해 P1과 P2 에셋을 사용합니다.
GameSetup 스크립트는 각 패들에 플레이어 ID를 할당합니다. 게임 플레이 중에 패들 스크립트는 플레이어 입력과 지정된 팀 ID를 비교합니다.
모든 유형의 멀티플레이어 게임에 적용할 수 있습니다. 또는 열거형을 사용하는 다른 모든 곳에서 열거형을 채택하는 것도 고려해 보세요.
스크립터블 오브젝트는 인스펙터에서 단순히 할당이므로 이름 변경 및 순서 변경과 관련된 동일한 문제가 발생하지 않습니다.
식별자 이름을 각각 "Player1" 또는 "Player2"로 변경하고 싶으신가요? 그렇게 하면 모든 것이 계속 작동합니다. 스크립터블 오브젝트를 더 추가하시나요? 인스펙터의 자산 할당은 동일하게 유지됩니다.
이 동작은 게임플레이를 제작할 때 유용합니다. 패턴 데모에서 열거형 전환 버튼을 클릭하여 팀을 변경합니다. 데모볼의 모노비헤이비어는 그에 따라 스프라이트 렌더러를 업데이트합니다.
공이 충돌할 때 블록에 피해를 주나요? 간단한 동등성 테스트를 실행하여 알아보세요. 아래 코드 예시에서 이를 비교하는 한 가지 방법을 살펴보세요.
이 메서드는 두 게임 오브젝트가 같은 팀에 있는지 확인할 수 있으므로 아군 대 적군 상호작용을 확인할 때 유용합니다. 이 간단한 비교는 아이템 픽업, 피해 또는 "팀" 또는 "정렬"이 있는 모든 것에 적용될 수 있습니다.
재미있는 부분은 스크립터블 오브젝트에 로직을 추가할 때 발생합니다. 기존 열거형과 달리 스크립터블 객체는 데이터를 보유하는 것 외에도 필드와 메서드를 가질 수 있습니다.
이를 사용하여 각 스크립터블 객체가 특수 비교 로직을 가질 수 있도록 합니다. 예를 들어 특수 대미지 효과(예: 냉기, 열, 전기, 마법 등)를 정의하는 스크립터블 오브젝트가 있을 수 있습니다.
애플리케이션에 게임플레이 아이템을 장착하기 위한 인벤토리 시스템이 필요한 경우 스크립터블 오브젝트는 아이템 유형 또는 무기 슬롯을 나타낼 수 있습니다. 특정 캐릭터는 특정 아이템을 보유할 수 없나요? 어떤 아이템은 마법이 있거나 특별한 능력이 있나요? 스크립터블 객체 기반 열거형은 이를 확인하는 메서드를 추가할 수 있습니다.
이전 예제의 MonoBehaviour 데모볼에는 스크립터블 오브젝트를 비교하는 AreEqual 메서드가 포함되어 있습니다. 동작을 확장할 때 스크립터블 객체 자체에 비교 로직을 번들로 묶을 수 있습니다.
패턴 데모에서는 공이 물체와 충돌할 때 더 선택적으로 충돌하도록 수정할 수 있습니다. 아래 코드 예시에서 충돌에 대한 범용 항목을 살펴보세요.
이렇게 하면 현재 데모와 비슷한 결과를 얻을 수 있지만 이제 m_Weakness 필드가 있습니다. 이를 통해 각 스크립터블 객체는 충돌 시 파괴할 다른 스크립터블 객체를 정의할 수 있습니다.
각 스크립터블 객체는 AreEqual 메서드를 호출하는 대신 자체 비교 로직을 관리하기만 하면 됩니다.
그 결과 유연성과 확장성이 향상됩니다. 공이 다른 팀의 블록을 파괴하는 대신 구체적으로 지정할 수 있습니다. 씬에 있는 여러 개의 공은 개별 콜리전 아이템에 따라 서로 다른 블록을 파괴할 수 있습니다.
이는 더 다양하고 복잡한 상호작용을 위한 무대를 마련합니다. 가위바위보 시스템을 만들고 싶다면 스크립터블 오브젝트 세 개를 정의할 수 있습니다: 가위바위보. 각각 고유한 m_Weakness를 가질 수 있으며, 상호작용을 처리하기 위해 IsWinner 메서드를 사용할 수 있습니다.
열거형과 달리 스크립터블 오브젝트는 이 프로세스를 모듈식으로 조정할 수 있습니다. 별도의 데이터 구조에 의존하거나 별도의 데이터 세트와 동기화하기 위해 추가 로직을 추가할 필요가 없습니다. 로직을 처리할 필드 및/또는 메서드를 추가하기만 하면 됩니다.
스크립터블 객체 기반 열거형에 익숙해지면 특히 팀원들과 함께 작업할 때 워크플로를 개선할 수 있다는 것을 알게 될 것입니다. 자산이므로 업데이트하면 병합 충돌이 줄어들어 데이터 손실 위험이 줄어듭니다.
새 스크립터블 오브젝트 기반 열거형을 추가하는 것은 다른 에셋을 만드는 것과 같습니다. 기존 열거형과 달리 새 값을 추가해도 기존 코드가 손상되지 않습니다. 또한 유니티에는 다른 에셋과 마찬가지로 검색, 필터링, 정리할 수 있는 툴이 이미 내장되어 있습니다.
에디터의 드래그 앤 드롭 UI를 사용하면 소프트웨어 개발자의 추가 지원 없이도 디자이너가 게임플레이 데이터를 확장할 수 있습니다. 처음에 필드를 설정하는 방법을 조정해야 하지만 디자이너가 직접 필드를 데이터로 채울 수 있습니다.
스크립터블 객체 기반 열거형은 팀이 협업과 효율성을 개선하는 데 사용할 수 있는 또 하나의 리소스입니다.
기술 전자책에서 스크립터블 오브젝트를 사용한 디자인 패턴에 대해 자세히 알아보세요. 스크립터블 오브젝트로 Unity에서 모듈식 게임 아키텍처 제작하기. 다음에서 일반적인 Unity 개발 디자인 패턴에 대해 자세히 알아볼 수도 있습니다. 게임 프로그래밍 패턴으로 코드 수준 높이기.