스킬 시스템 1. GAS를 참고한 설계와 고민

KWONYEONGMIN·2025년 4월 26일

Project DreamScape

목록 보기
2/5

시스템 개요


  • Unreal Engine 기반 커스텀 Skill System 개발
  • GAS(Gameplay Ability System)를 분석하고, 프로젝트에 최적화된 경량화 구조로 설계
  • 네트워크 복제, 인스턴스 관리, 스킬 생명주기 제어, 스킬 활성화/취소/종료를 모두 지원
  • 다양한 스킬 흐름 (즉시 발동, 지속형, 설치형 등)에 유연하게 대응 가능



개발 목표


  • 경량화: GAS보다 가볍고 빠른 흐름을 갖는 구조
  • 확장성: 설치형/조작형/즉발형 스킬 모두 대응 가능한 기본 뼈대 제공
  • 네트워크 안정성: 서버-클라이언트간 스킬 동기화 및 예측 처리
  • 세분화된 컨트롤: 스킬 실행, 취소, 쿨타임 적용 시점을 세밀하게 제어
  • 유연한 Instancing: 스킬별로 인스턴스 생성/공유 방식 선택 가능



고민한 부분


1. GAS를 그대로 사용하지 않고 커스텀 Skill System을 만드는 이유

GAS는 시스템적으로 완벽하다고 생각하지만, 구조가 무겁고 복잡하다. 우리 프로젝트는 GAS 전체 기능이 필요 없고,
가볍고 빠른 스킬 실행 흐름만 필요했기 때문에,
GAS의 핵심 구조만 참고하여 우리 프로젝트에 맞춘 Skill System을 설계했다.

2. 프로젝트 특성에 맞춘 개발

우리 프로젝트는 RPG 장르의 게임으로 일반적인 스킬뿐 아니라, 설치형 / 지속형 / 즉발형 등 다양한 스킬을 지원해야 했다. 또한 스킬마다 네트워크 실행 정책이 다를 수 있었다. 이를 위해 GAS 시스템을 참고하여 스킬마다 InstancingPolicy와 NetExecutionPolicy를 개별 설정 가능하도록 했다.
스킬 흐름을 Activation → Commit → End로 통일해 일관성 있는 로직을 구성했다. 설치형 등 복잡한 스킬은 ActivateSkill()을 오버라이드하여 별도 상태 머신(FSM)으로 확장할 수 있게 설계했다. 서버-클라이언트 동기화는 SkillControlComponent가 전담하고, 스킬 클래스 자체는 최대한 독립적으로 유지했다.

3. UObject 기반 Skill의 동기화 문제 해결

Skill은 UObject 기반이기 때문에 기본적으로 Replication을 지원하지 않는다. GAS를 분석하며, GAS 사용하는 동기화 방식을 참고하였다.
GAS처럼 SkillSpec 구조체를 만들고,Skill 인스턴스는 서버/클라이언트가 따로 관리하며, SkillSpec만 FastArraySerializer를 통해 복제하는 구조로 설계했다. 스킬 자체를 복제하는 대신, 스킬의 상태와 메타데이터만 복제하고,클라이언트는 SkillSpec을 받아 필요한 경우 Skill 인스턴스를 새로 생성하거나 상태를 맞췄다.



GAS에서 참고한 부분

  • Skill을 직접 복제하지 않고, 구조체(SkillSpec) 기반으로 동기화하는 구조

  • Skill의 라이프사이클 (Activation → Commit → End)

  • 스킬 인스턴싱/동기화 정책을 분리 관리 (InstancingPolicy, ESkillReplicationPolicy, NetExecutionPolicy)

  • GAS의 ActivationBlockedTags 및 CancelAbilitiesWithTags 시스템을 참고하여,
    스킬마다 BlockIfActiveTags / CancelIfActiveTags를 설정할 수 있도록 구현


커스터마이징 하거나 새롭게 구현한 부분

  • GAS를 참고하여 Skill 생명주기를 세분화
  • Skill 별 Tick 처리 지원
  • Duration이 있는 Skill인 경우, Duration 후에 EndSkill 호출되도록 함.
  • Skill 별 Cooldown 구조 다양화 (쿨다운 정책 선택 가능: None / AfterActive / AfterEnd)
  • Skill별 공통 데이터(DataTable 기반) 기반 데이터 초기화
profile
Hello World

0개의 댓글