[TPS프로젝트] (2) 캐릭터와 아이템 상호작용을 위한 설계와 추상화

개발자 김선호·2024년 6월 3일
0

TPSProject

목록 보기
3/8
post-thumbnail

모든 소스코드는 수정될 확률이 있습니다. 기획변경에 의해서 수정될 수 있고, 버그 픽스를 위해 수정될 수도 있고, 무슨 이유에든 한 번 작성된 소스코드가 프로젝트 끝까지 절대불변한다고 확신할 수 있는 사람은 없을 것입니다. 그렇다면 한번 코드를 작성할 때, 변경이 용이하고 버그가 덜 발생하게 작성하는 것이 중요할 것입니다. 또한, 여러 사람이 보는 소스코드라면 누가 보더라도 잘 이해할 수 있도록 작성하는 것도 중요합니다.

설계단계에서 추상화는 앞서 말한 내용을 만족시키기 위해 아주 중요한 단계라고 할 수 있습니다. 내가 개발하고자 하는 내용을 단순화 시키고, 공통된 부분을 찾음으로써 개발 대상에 대한 이해도를 높이고 이후 소스코드 작성/수정에 대한 비용을 줄일 수 있기 때문입니다.

설계 단계


캐릭터와 아이템 간의 상호작용을 구현하기 앞서 제 나름대로의 추상화를 통해 설계해보았습니다. 앞으로 아이템의 종류도 많아질 것이고, 캐릭터의 종류도 많아질 것이기 때문에 해당 다이어그램처럼 설계를 해보았습니다.

TGObject: 해당 프로젝트에서 생성되는 게임 관련 오브젝트의 최상위 클래스입니다.
TGItem: 필드에 드랍되거나 장착될 수 있는 아이템들을 정의하기 위한 클래스입니다. 주로 아이템 상호작용에 대한 기능이 작성되어 있습니다.
TGItemWeapon: 무기로 사용되는 아이템들을 정의하기 위한 클래스입니다. 공격 명령에 의해 수행되는 내용들이 작성될 예정입니다.
TGCharacter: 사람 형태의 유닛들이 가지는 오브젝트들을 정의하기 위한 클래스입니다. 현재는 아이템 습득 및 소지 같은 공통적인 내용들이 작성되어 있습니다.
MCharacterStats: 캐릭터들의 수치 데이터를 보관, 참조를 용이하게 위해 만들어진 클래스입니다.
TGPlayerCharacter: 플레이어가 직접 조종하는 유닛에 대한 클래스입니다. 캐릭터의 수치 데이터 인스턴스 등을 소지하고 있고, 컨트롤러 등에 의해 호출되는 메소드등을 작성합니다.
TGPlayerAnimation: 플레이어가 직접 조종하는 유닛의 애니메이션을 관리하기 위한 클래스입니다. 가독성을 위해 따로 관리하고 있습니다. "TGPlayerCharacter"에 종속적입니다.
TGPlayerCharacterController: 플레이어의 Input을 받아 플레이어 캐릭터를 조종하는 기능이 작성되는 클래스입니다. "TGPlayerCharacter"에 종속적입니다.
TGEnemyCharacter: 플레이어의 적 진영을 위한 클래스입니다.

UMonoSingleton<T>: Singleton 패턴을 구현하기 위한 제너릭클래스입니다.
TGGameManager: 게임 규칙에 필요한 내용들이 작성되는 클래스입니다.
TGPlayerKeyManager: 플레이어가 입력하는 키를 정의하기 위한 클래스입니다. Dictionary를 통해 키를 맵핑할 수 있기 때문에 나중에 유저가 키를 커스텀하기 용이하게 만들어줍니다.

캐릭터-아이템 상호작용

좋은 결과물을 내기 위해 기획은 빈번하게 수정되고 새로운 컨텐츠들이 추가될 것입니다. 하지만 기획이 수정될 때 마다 그것에 맞춰 광범위한 소스코드를 수정해야 한다면 예상보다 더 많은 비용을 소모하게 될 것입니다. 그래서 해당 기능을 구현할 때 여러 종류의 아이템이 추가되고 종류가 세분화되더라도 쉽게 추가할 수 있도록 신경써서 소스코드를 작성하였습니다.

https://github.com/devsensational/3DGameProject/blob/main/3DProject/Assets/Scripts/Game/Item/TGItem.cs

해당 소스코드는 아이템의 공통적인 기능을 구현하기 위한 소스코드입니다. enum class인 "ItemType"을 통해 아이템의 종류를 결정할 수 있게 하였습니다. 아이템이 버려질 때와 주워졌을 때 실행되는 메소드가 구현되어 있습니다. 다른 종류의 아이템을 구현할 때 해당 클래스를 상속받아 사용하게 될 것입니다.

https://github.com/devsensational/3DGameProject/blob/main/3DProject/Assets/Scripts/Game/Unit/TGCharacter.cs

해당 소스코드는 캐릭터의 공통적인 기능을 구현하기 위한 소스코드입니다. 캐릭터 유닛이 아이템에 상호작용할 수 있는 소스코드들이 현재 시점에서 작성되었습니다.
장비할 수 있는 아이템은 주무기나 근접무기, 투척무기 등 여러 종류의 아이템이 활용될 수 있고, 앞서 말씀드린 것 처럼 기획이 변경, 수정될 수 있기 때문에 Dictionary를 활용하여 유연하게 대처할 수 있게 작성하였습니다.

업로드중..
떨어져 있는 무기에 플레이어 캐릭터가 상호작용하여 아이템을 줍는 모습입니다. 상호작용하는 방식은 앞으로 더 개선될 예정입니다. 초기에는 로봇 형태의 캐릭터를 사용했지만 여러 아이템을 표기하기 어려워서 인간 형태의 캐릭터로 변경하였습니다. 더 퀄리티있는 리소스를 구매해서 사용할 수 있었으면 좋았을텐데 많이 아쉽습니다.

profile
프로젝트 진행 과정을 주로 업로드합니다

0개의 댓글