[ProjectXZ] 모듈러 캐릭터 개발일지 2. 모듈러 시스템 구조 설계

KWONYEONGMIN·2024년 10월 7일

언리얼

목록 보기
5/15
post-thumbnail

모듈러 시스템 구현 분석

모듈러 캐릭터를 구현하기 위하여, 일단 제가 개발해야 하는 것이 어떤 것인지 적어봤습니다.

구현해야 하는 내용

  • 모듈 시스템

    • 캐릭터에 Moudle을 Attach, Dettach 하는 기능
  • 커스터마이징 기능

    • 커스터 마이징 UI
  • Moudle과 관련된 데이터를 로드하는 유틸리티 기능 => Datamanager DataManager 링크

크게 Module을 관리하는 시스템, 원하는 Module을 선택하는 UI시스템 이렇게 두 가지 기능으로 나눠봤습니다.

Module을 관리하는 시스템 -> ModularComponent
Module 커스터마이징 UI 시스템 -> CustomizingLayer UI 시스템 링크




Module 시스템 설계

모듈을 관리하는 기능은 한 번에 설계된 것이 아니라 여러 번의 과정을 거쳐 개선되었습니다.

  • 획득해야 하는 모듈 (백팩, 조끼, 헬멧 등) : 파밍 가능한 아이템 모듈들
  • 가지고 있는 모듈 : 커스터 마이징 기능


첫번째 설계

클래스 설계

AXZModularComponent

  • 모듈들을 중앙에서 관리
  • 각 모듈(AXZSkeletalMeshModuleComponent 객체)을 TMap으로 관리
  • 각 모듈의 상태와 동작을 조정

BaseModuleComponent

  • 모듈의 Attach와 Detach 기능을 수행

SkeletalMeshModuleComponent

  • BaseModuleComponent의 파생 클래스
    SkeletalMesh 기반 모듈을 담당
  • 각 모듈의 상태와 동작을 조정함

BaseItem

  • 모듈을 포함한 모든 아이템의 베이스 클래스
  • ItemID를 가지고 있다.

고민한 부분

  • ModuleComponent에서 상태를 관리하기 위해 FSM(상태 머신)을 도입할 필요가 있을까?
  • SkeletalMeshComponent를 확장한 클래스를 만들어야 할 필요가 있는가?
  • Module에 해당하는 클래스를 Component로 만들어야 하는가 ? actor로 만들어야 하는가 ?

구현



두번째 설계

첫 번째 설계에서 모듈별로 별도의 컴포넌트를 만들어 관리했으나, 두 번째 설계에서는 모듈 타입에 따라 캐릭터의 SkeletalMeshComponent를 ModualrComponent에서 직접 관리하는 방식으로 변경되었습니다.

클래스 설계

ModularComponent

  • 모듈을 관리하는 메인 컴포넌트
  • 모듈 타입에 맞춰 모듈에 대한 관리는 직접적으로 SkeletalMeshComponent와 연결하여 수행한다.
  • 모듈 이름을 EModularMeshType의 enum 값을 바탕으로 동적으로 처리한다.

이전 설계와 달라진 점

  • ModuleHandlerMap 제거: 각 모듈별로 별도의 컴포넌트를 생성하는 방식에서, 캐릭터의 SkeletalMeshComponent를 직접 관리하는 방식으로 변경되었습니다.
  • 모듈 이름은 EModularMeshType enum 값을 바탕으로 결정되며, GetSkeletalMeshComponent를 통해 해당 모듈의 SkeletalMeshComponent를 찾아서 Detach 및 Attach를 처리합니다.

구현



첫번째 설계와 두번째 설계 차이점

첫 번째 설계에서는 TMap을 통해 EModularMeshType에 따른 모듈을 각각 핸들러로 관리하며, 각 모듈을 하드코딩으로 추가했습니다. 반면, 새로운 설계에서는 TMap을 제거하고, SkeletalMeshComponent와 직접 연결하여 enum 기반으로 모듈을 동적으로 처리합니다. 이를 통해 코드의 유연성과 확장성이 증가했습니다.

결론

두번째 설계가 관리가 간소화되기 때문에 현재 프로젝트에 더 적합한 방식이라고 판단했습니다 !!
새로운 설계를 적용하니 동적 처리, 확장성, 코드의 단순성 측면에서 개선되었고 enum을 통한 동적 관리로 확장성이 높아졌습니다 !!

profile
Hello World

0개의 댓글