GAS는 시스템적으로 완벽하다고 생각하지만, 구조가 무겁고 복잡하다. 우리 프로젝트는 GAS 전체 기능이 필요 없고,
가볍고 빠른 스킬 실행 흐름만 필요했기 때문에,
GAS의 핵심 구조만 참고하여 우리 프로젝트에 맞춘 Skill System을 설계했다.
우리 프로젝트는 RPG 장르의 게임으로 일반적인 스킬뿐 아니라, 설치형 / 지속형 / 즉발형 등 다양한 스킬을 지원해야 했다. 또한 스킬마다 네트워크 실행 정책이 다를 수 있었다. 이를 위해 GAS 시스템을 참고하여 스킬마다 InstancingPolicy와 NetExecutionPolicy를 개별 설정 가능하도록 했다.
스킬 흐름을 Activation → Commit → End로 통일해 일관성 있는 로직을 구성했다. 설치형 등 복잡한 스킬은 ActivateSkill()을 오버라이드하여 별도 상태 머신(FSM)으로 확장할 수 있게 설계했다. 서버-클라이언트 동기화는 SkillControlComponent가 전담하고, 스킬 클래스 자체는 최대한 독립적으로 유지했다.
Skill은 UObject 기반이기 때문에 기본적으로 Replication을 지원하지 않는다. GAS를 분석하며, GAS 사용하는 동기화 방식을 참고하였다.
GAS처럼 SkillSpec 구조체를 만들고,Skill 인스턴스는 서버/클라이언트가 따로 관리하며, SkillSpec만 FastArraySerializer를 통해 복제하는 구조로 설계했다. 스킬 자체를 복제하는 대신, 스킬의 상태와 메타데이터만 복제하고,클라이언트는 SkillSpec을 받아 필요한 경우 Skill 인스턴스를 새로 생성하거나 상태를 맞췄다.
Skill을 직접 복제하지 않고, 구조체(SkillSpec) 기반으로 동기화하는 구조
Skill의 라이프사이클 (Activation → Commit → End)
스킬 인스턴싱/동기화 정책을 분리 관리 (InstancingPolicy, ESkillReplicationPolicy, NetExecutionPolicy)
GAS의 ActivationBlockedTags 및 CancelAbilitiesWithTags 시스템을 참고하여,
스킬마다 BlockIfActiveTags / CancelIfActiveTags를 설정할 수 있도록 구현