2 분 소요

프로젝트 개요

  • 게임개요
    • 1인 개발 프로젝트
    • 개발기간 : 2024.10.13 ~ (실제 개발 약 2개월반)
    • 장르 : 백뷰 형식 3D RPG
    • Github
  • 기술스택
    • Unity 2021 LTS
    • C#, JSON
  • 프로젝트 주요 목표
    • RPG 게임의 핵심 기능 구현(재미, 게임성 고려X)
    • 최적화된 클라이언트 시스템 설계
    • 유지보수와 확장성을 고려한 객체지향적 설계
  • 플레이 영상


게임 플레이

게임 플로우는 다음과 같습니다.

image


  • PersistentScene

image

PersistentScene에는 “게임 전반에 걸쳐 유지되어야하는 오브젝트들”이 존재합니다.

이 씬은 게임을 플레이하는동안에 Unload 되지않으며, 다른 씬들을 Additive 모드로 로드하여 이 씬에 존재하는 객체들에 접근할 수 있도록 하였습니다.

플레이어, 카메라, 여러 UI와 매니저 클래스들이 해당되며, 초기화작업을 거친뒤 ViliageScene를 로드합니다.


  • ViliageScene

image

ViliageScene은 플레이어가 게임을 시작할 때 보게되는 가장 첫 씬입니다.

상점 NPC가 존재하며, 전투에 필요한 여러 아이템을 구매할 수 있습니다.

포탈을 통해 던전에 입장할 수 있습니다.


  • LoadingScene

image

LoadingScene은 플레이어가 다른맵으로 이동할 때 다음 씬이 로드되는동안 보여지는 로딩씬입니다.

현재 로딩상태를 보여주는 로딩바와, 게임팁을 출력합니다.


  • DungeonScene

image

DungeonScene은 플레이어가 몬스터와의 전투가 이루어지는 공간입니다.

잡몹을 모두 처치하면 보스몬스터가 소환되며, 모든 몬스터를 처치하게되면 보상과함께 마을로 돌아갈 수 있는 포탈이 생성됩니다.


주요 시스템

프로젝트에서 구현한 주요 시스템은 다음과같습니다.

  • 인벤토리
    • 아이템 설계
    • 퀵슬롯(인벤토리 연계)
    • 캐릭터 정보창(인벤토리 연계)
  • 전투 시스템
    • 몬스터 AI
    • 플레이어
  • 데이터 관리
    • JSON 데이터 Load & Save
    • 플레이어, 아이템, 인벤토리 등의 데이터 관리
  • 기타
    • UI
    • 게임의 성능 향상을 위한 최적화
    • 여러가지 매니저 클래스

인벤토리

인벤토리 시스템의 구조는 다음과 같습니다.

image


  • Inventory : 인벤토리내의 아이템 데이터를 배열로 관리하고, 인벤토리의 실질적인 동작을 처리합니다.
    • 아이템의 추가(습득), 스왑, 사용, 제거 등
    • Code
  • InventoryUI : 인벤토리내의 마우스 이벤트와 모든 아이템 슬롯을 관리합니다.
    • 인벤토리의 아이템 슬롯을 배치 및 생성합니다.
    • 마우스 클릭, 드래그 앤 드롭을 구현하여 인벤토리내 UI와 상호작용할 수 있도록 했습니다.
    • 인벤토리의 아이템 슬롯 정보들을 리스트로 관리합니다.
    • Code
  • ItemSlotUI : 각 아이템 슬롯의 데이터를 관리하고, 슬롯에서 발생하는 기능들을 구현합니다.
    • 슬롯의 인덱스, 아이템 이미지, 아이템 텍스트 등의 데이터
    • 아이템 이미지의 표시, 강조효과 등의 기능 구현
    • Code


인벤토리 시스템은 크게 위 3가지로 구성되어있습니다.

ItemSlotUIInventoryUI가 관리하며, InventoryInventoryUI와 상호작용합니다.

실제 아이템 객체 ItemInventory가 관리하고 있기때문에, Item 상태의 공유는 InventoryUI, Inventory에 의해 간접적으로 이루어집니다.


즉, 인벤토리내에서 이벤트(새로운 아이템이 추가되는등의)가 발생하면 InventoryUI를 참조해 UI를 갱신하고

UI에서 사용자 이벤트가 발생했을 때는 InventoryUIInventory를 참조하여 아이템 또는 아이템배열을 갱신합니다.


기타 부수적인 이벤트 UI들(툴팁, 확인 UI등)은 InventoryUI 의 마우스 이벤트 메서드에서 처리하도록 하였습니다.


아이템

RPG에서 아이템의 종류는 매우 다양하고, 아이템 마다의 특징이 존재합니다.

따라서 아이템을 설계할 때 쉽게 새로운 종류의 아이템을 추가하고 관리할 수 있도록

유지보수성과 확장을 고려한 객체지향적 아이템 구조를 설계하였습니다.

image

  • 아이템의 데이터를 공통적인 부분은 묶고, 세부적인 부분은 분리하여 상속을 통해 새로운 아이템 추가가 쉽도록 하였습니다.
    • ex. 포션아이템
      • Id, Name 등은 ItemData에 작성
      • 아이템 수량(Amount) 등은 CountableItemData에 작성
      • 회복량 등은 PortionItemData에 작성
  • 또한 데이터 부분과 기능 부분을 분리하여 유지보수가 쉽도록 하였습니다.
    • ItemData 계층은 데이터 구조
    • Item 계층은 게임 내 동작(로직)


프로젝트에서는 크게 두가지 종류의 아이템을 구현하였습니다.

  1. 장비아이템(EquipmentItem)
    • 장비아이템은 슬롯 한칸에 하나의 아이템만 존재할 수 있습니다.
    • 장비아이템에는 세부적으로 무기와 방어구 아이템이 있습니다.
  2. 수량이 있는 아이템(CountableItem)
    • 수량이 있는 아이템은 슬롯 한칸에 여러개의 아이템이 존재할 수 있습니다.
    • 수량이 있는 아이템은 몬스터의 전리품, 물약, 주문서 등이 있습니다.
    • 수량이 있는 아이템중에서도 사용이 가능한 아이템을 구분하기위해 “인터페이스”를 상속하여 사용이 가능한 아이템(PortionItem)을 구현하였습니다.

아이템 생성의 전체적인 흐름은 다음과 같습니다.

  1. JSON 파일로 작성되어있는 데이터를 “DataManager“가 Load 합니다.

  2. DTO 클래스는 JSON 데이터를 직/역직렬화할 때 사용됩니다.

  3. DataManager는 각 DTO로 ItemData 를 생성하고, 딕셔너리에 캐싱해둡니다.
    • 이후 추가적인 로딩없이 재사용할 수 있고, 게임 전역에서 데이터를 쉽게 참조할 수 있도록 하였습니다.
  4. 아이템이 생성되어야할 때, 캐싱되어있는 데이터를 가지고 아이템을 생성합니다.

이러한 설계방식을 통해 유지보수가 쉽고, 확장성이 높은 객체 지향 기반의 아이템 시스템을 구현하였습니다.

Item 관련 Code

ItemData 관련 Code


캐릭터정보창

전투 시스템

댓글남기기