
Unity 프로젝트에서 스크립터블 오브젝트 기반 열거형 사용
이 페이지에서는 Unity 프로젝트에서 스크립터블 오브젝트 기반 열거형을 사용하는 방법을 설명합니다.
이 전자책과 함께 제공되는 Unity 개발자 데모를 지원하기 위해 제작된 6개의 미니 가이드 시리즈의 세 번째 가이드입니다. ScriptableObjects로 Unity에서 모듈식 게임 아키텍처 만들기.
이 데모는 고전적인 볼 및 패들 아케이드 게임 메카닉에서 영감을 얻었으며, 스크립터블 오브젝트를 사용하여 테스트 가능하고 확장 가능하며 디자이너 친화적인 컴포넌트를 제작하는 방법을 보여 줍니다.
전자책, 데모 프로젝트 및 이 미니 가이드는 Unity 프로젝트에서 ScriptableObject 클래스와 함께 프로그래밍 디자인 패턴을 사용하는 베스트 프랙티스를 제공합니다. 다음 팁을 통해 코드를 단순화하고, 메모리 사용량을 줄이고, 코드 재사용성을 높일 수 있습니다.
이 시리즈에는 다음과 같은 문서가 포함되어 있습니다.
시작하기 전에 중요한 참고 사항
스크립터블 오브젝트 데모 프로젝트와 이 시리즈의 미니 가이드를 살펴보기 전에 디자인 패턴은 단순히 아이디어라는 점을 기억하세요. 모든 상황에 적용되는 것은 아닙니다. 이 기술을 통해 Unity 및 스크립터블 오브젝트를 사용하는 새로운 방법을 배울 수 있습니다.
각 패턴에는 장단점이 있습니다. 특정 프로젝트에 유의미한 부분만 선택하세요. 디자이너가 Unity 에디터를 많이 사용하나요? 스크립터블 오브젝트 기반 패턴을 사용하면 개발자와 협업하는 데 도움이 될 수 있습니다.
궁극적으로 프로젝트와 팀에 가장 적합한 코드 아키텍처가 가장 좋습니다.

확장 가능한 열거형
열거형은 코드에서 고정된 명명 값을 관리하는 편리한 방법입니다. 하지만 몇 가지 제한 사항이 있습니다. 직렬화된 열거형 값은 상징적인 이름 대신 정수로 저장되므로 값을 제거하거나 순서를 변경하면 잘못되거나 예기치 않은 동작이 리드 수 있습니다. 이는 열거형이 많을 때 특히 Unity 개발 시 문제를 일으킬 수 있다는 의미입니다.
표준 접근 방식
일반적인 열거형은 다음과 같습니다.
[System.Serializable]
public 열거형 HandGestures
{
암석,
서류
자지
}
System.Serializable 속성을 사용하여 열거형을 직렬화하면 인스펙터에 표시됩니다.
문제점
값의 순서를 변경하거나 삭제하면 문제가 발생할 수 있습니다. 내부적으로 각 값은 정수이므로 표현하는 것이 다를 수 있습니다. 이 예시에서는 Paper 값을 삭제하면 Scissors가 값 1을 가정하게 됩니다.
아래 예시와 같이 값을 추가하면 됩니다
선택한 열거형 값은 삭제된 항목 이후에 나타나면 변경됩니다.
이로 인해 프로젝트를 유지 관리하고 업데이트할 때 문제가 발생할 수 있으며, 특히 열거형에 많은 값이 포함될 수 있습니다. 이 문제를 완화하려면 요소를 비어 있거나 사용되지 않게 두거나 정수 값을 명시적으로 설정하면 됩니다. 하지만 두 가지 솔루션 모두 이상적입니다.

스크립터블 오브젝트 기반 열거형
스크립터블 오브젝트 기반 열거형은 기존 열거형과 동일한 기능을 제공하지만 개별 에셋으로 저장됩니다. 예를 들어 아래 예시에서 PaddleBallSO 프로젝트의 PlayerIDSO 스크립터블 오브젝트를 살펴보겠습니다.
기본적으로 빈 스크립터블 오브젝트입니다.
이를 사용하여 프로젝트에서 P1, P2 등 여러 스크립터블 오브젝트 에셋을 생성할 수 있습니다. 데이터가 없는 경우에도 스크립터블 오브젝트를 사용하여 비교할 수 있습니다. 프로젝트에서 새 스크립터블 오브젝트 에셋을 생성하고 이름을 지정하면 됩니다.
프로젝트 내에서 필요한 만큼의 플레이어 ID를 생성하고 간편하게 전환할 수 있습니다. GameDataSO 스크립트에서 할당된 에셋을 변경하면 됩니다.
평등을 확인하는 경우 열거형과 유사하게 작동합니다. 두 개의 변수가 동일한 스크립터블 오브젝트를 참조하나요? 해당하는 경우 동일한 항목 유형입니다. 그렇지 않으면 그렇지 않습니다.
추가 데이터가 없더라도 스크립터블 오브젝트는 카테고리나 아이템 유형을 나타냅니다.
PaddleBallSO의 플레이어 ID
PaddleBallSO에서 PlayerIDSO는 팀 명명으로 변합니다. GameDataSO에서 P1 및 P2 에셋을 사용하여 두 패들을 구분합니다.
GameSetup 스크립트는 각 패들에 플레이어 ID를 할당합니다. 게임플레이 중에 패들 스크립트는 플레이어 입력을 지정된 팀 ID와 비교합니다.
이 모든 유형의 Multiplayer 게임에 대한 응용 프로그램이 있습니다. 아니면 열거형에 도달률 모든 곳에서 이를 도입해 보세요.
스크립터블 오브젝트는 인스펙터에서 단순히 할당되기 때문에 이름 변경과 순서 변경과 같은 문제가 발생하지 않습니다.
식별자 이름을 각각 'Player1' 또는 'Player2'로 변경하고 싶으신가요? 그렇게 하면 모든 것이 계속 작동합니다. 스크립터블 오브젝트를 추가하고 싶으신가요? 인스펙터에서 에셋 할당은 그대로 유지됩니다.

패턴 데모
이 동작은 게임플레이 제작에 유용합니다. 패턴 데모에서 Switch Enum 버튼을 클릭 수 팀을 변경합니다. DemoBall의 MonoBehaviour 그에 따라 SpriteRenderer를 업데이트합니다.
공이 충돌하면 블록에 대미지를 입히나요? 간단한 평등 테스트를 실행하여 알아보세요. 아래 코드 예시에서 비교할 수 있는 방법이 있습니다.
이 방법을 사용하면 두 게임 오브젝트가 동일한 팀에 있는지 확인할 수 있으며, 이는 친구와 적의 상호 작용 여부를 확인할 때 유용합니다. 이 간단한 비교는 아이템 픽업, 데미지 또는 '팀' 또는 '정렬'이 있는 다른 요소에도 적용할 수 있습니다.
동작 확장
재미있는 부분은 스크립터블 오브젝트에 로직을 추가할 때입니다. 기존 열거형과 달리 스크립터블 오브젝트는 데이터를 보유하는 것 외에도 필드와 메서드를 가질 수 있습니다.
이를 사용하면 각 스크립터블 오브젝트에 특수한 비교 로직을 적용할 수 있습니다. 예를 들어 냉기, 열, 전기, 마법 등 특수 대미지를 정의하는 스크립터블 오브젝트를 사용할 수 있습니다.
게임플레이 아이템을 장착하기 위해 애플리케이션에 인벤토리 / 광고 지면 시스템이 필요한 경우 스크립터블 오브젝트는 아이템 유형이나 무기 슬롯을 나타낼 수 있습니다. 특정 캐릭터가 특정 아이템을 들을 수 없나요? 마법 같은 아이템이 있거나 특수한 능력이 있나요? 스크립터블 오브젝트 기반 열거형은 이를 확인하기 위한 메서드를 추가할 수 있습니다.
이전 예시의 MonoBehaviour DemoBall에는 스크립터블 오브젝트를 비교하기 위한 AreEqual 메서드가 포함되어 있습니다. 동작을 확장할 때 스크립터블 오브젝트 자체에 비교 로직을 번들링할 수 있습니다.
패턴 데모에서는 오브젝트와 충돌할 때 더 선택적으로 공을 수정할 수 있습니다. 아래 코드 예시에서 충돌을 위한 범용 항목을 살펴보세요.
이는 현재 데모와 유사한 결과를 얻을 수 있지만 이제는 m_Weakness 필드가 있습니다. 이렇게 하면 각 스크립터블 오브젝트가 충돌 시 파괴할 다른 스크립터블 오브젝트를 정의할 수 있습니다.
각 스크립터블 오브젝트는 AreEqual 메서드를 호출하는 대신 자체 비교 로직을 관리합니다.
그 결과 더 유연하고 확장할 수 있습니다. 공이 다른 팀의 블록을 파괴하는 대신 구체적으로 표현할 수 있습니다. 씬의 여러 공은 개별 CollisionItem에 따라 서로 다른 블록을 파괴할 수 있습니다.
이렇게 하면 더 다양한 복잡한 상호 작용이 가능합니다. 바위 종이 자르기 시스템을 만들고 싶다면 다음 세 가지 스크립터블 오브젝트를 정의할 수 있습니다. 암석, 종이, 수레 각각 고유의 m_Weakness를 가질 수 있으며, IsWinner 메서드를 사용하여 상호 작용을 처리할 수 있습니다.
열거형과 달리 스크립터블 오브젝트는 이 프로세스를 모듈화하고 조정할 수 있도록 합니다. 별도의 데이터 세트와 동기화하려면 추가 데이터 구조나 로직을 추가할 필요가 없습니다. 로직을 처리할 필드나 메서드를 추가하기만 하면 됩니다.
스크립터블 오브젝트 기반 열거형의 이점
스크립터블 오브젝트 기반 열거형에 익숙해지면 특히 팀원들과 작업할 때 워크플로를 개선할 수 있습니다. 에셋이므로 업데이트하면 병합 충돌이 줄어들어 데이터 손실의 위험을 줄일 수 있습니다.
새로운 스크립터블 오브젝트 기반 열거형을 추가하는 것은 다른 에셋을 만드는 것과 같습니다. 기존 열거형과 달리 새 값을 추가하면 기존 코드가 손상되지 않습니다. 또한 Unity 다른 에셋과 마찬가지로 에셋을 검색, 필터링, 정리할 수 있는 빌트인 툴도 있습니다.
에디터의 드래그 앤 드롭 UI를 사용하면 디자이너가 소프트웨어 개발자 추가 지원 없이도 게임플레이 데이터를 확장할 수 있습니다. 처음에는 여전히 필드를 설정하는 방법을 조정해야 하지만, 디자이너는 해당 필드를 자체적으로 데이터로 채울 수 있습니다.

더 많은 스크립터블 오브젝트 리소스
스크립터블 오브젝트 기반 열거형은 팀에서 협업과 효율성을 개선하는 데 사용할 수 있는 또 다른 리소스입니다.
스크립터블 오브젝트를 사용한 디자인 패턴에 대한 자세한 내용은 기술 전자책인 Unity에서 스크립터블 오브젝트로 모듈식 게임 아키텍처 만들기에서 확인할 수 있습니다. 또한 일반적인 Unity 개발 디자인 패턴에 대한 자세한 내용은 게임 프로그래밍 패턴으로 코딩 업그레이드를 참조하세요.