Unreal/따라해보기

멀티플레이 RPG System 만들기 (1) - Unreal Engine

workbench34 2025. 3. 28. 17:33

 최근 유튜브를 돌아다니며 멀티플레이에 대한 정보를 모으고 있었다. 찾는 도중 엄청 좋은 강의를 찾게 되어 이를 적어놓고 공부하고자 따라해보기 시리즈를 시작하겠다. 코드는 여기에 올리지 않고 따로 내가 만들어놓은 Github 레포지트리에서 확인하면 된다. 아니면 이 유튜버의 강의를 따라 보며 확인해 보아도 좋다.

https://www.youtube.com/@uhr2842

 내 깃허브에서는 코드에 대한 주석이 달려있기는 하나 정확하진 않기에 이해가 안되는 부분은 잠시 멈추고 정보를 찾으면서 따라하자.

사용하는 플러그인

Gameplay Abilities System : 언리얼 에디터 플러그인 중 기본적으로 존재하는 플러그인이다. 에픽게임즈에서 지원해 주는 플러그인으로 GAS 라고 부르기도 한다.

이렇게 생긴 플러그인이다.

 이게 뭐하는 물건인가 하면 액터가 가질 수 있거나 트리거 할 수 있는 능력, 속성, 상호작용 에 대한 프레임 워크이다. 주로 RPG 나 MOBA 장르의 게임에 적용하며 속성이나 스킬을 가지는 여러 장르의 게임에서도 적용이 가능하다.

https://dev.epicgames.com/documentation/en-us/unreal-engine/gameplay-ability-system-for-unreal-engine

 위 링크에서 서 더 정확한 정보를 알아 볼 수 있다.

 

시작해보기

 이번 따라해보기 프로젝트는 아주 긴 여정이 될 것이다. 일단은 처음부터 시작하자. ThirdPerson C++ 프로젝트로 시작할 것이고 플러그인은 위의 플러그인을 다운 받아 준다.

 

 그 뒤 C++ 로 생성된 캐릭터 클래스의 주석을 정리해주고 PlayerState 를 상속받는 C++ 을 생성해준다. 이름은 RPGPlayerState 로 붙여주었다. (PlayerState 는 이제 PS 로 부르겠다.) 클래스 타입은 Public 으로 만들어주자.

 

 PS 에는 우리가 받은 플러그인인 GAS 에 대한 정보를 넣어야한다. AttributeSet 이라 부르며 이는 Gas 의 기본 구성 요소이다. 이 이유는 플레이어가 사망하여도 이 속성 정보는 좀더 남아있어야 하기 때문인데 이를 만약 Character 클래스에 넣는다면 캐릭터가 사망해서 액터가 파괴되면 이는 속성 정보또한 같이 파괴되기에 캐릭터가 사망해도 PS 는 잠시 남기때문에 멀티플레이어 버전에서는 PS 에 속성 정보를 넣어주도록 한다. 또한 기본적으로 PS 는 엔진에서 복제 (Replicated) 해주기 때문에 능력 시스템과 속성 세트를 여기에 넣는 것은 아주 효과적이다.

 

 그 뒤 AbilitySystemComponent 를 상속받는 C++ 클래스인 RPGAbilitySystemComponent 를 퍼블릭으로 만들어준다. 생소한 부모 클래스 일텐데 이것은 GAS 에 포함되어있는 클래스이다. 조금만 더 자세히 알아보자.

 

AbilitySystemComponent 

액터에 부착되어 GAS의 기능을 제공하는 컴포넌트이며, 다음과 같은 주요 역할을 수행한다.

 

  • 어빌리티 관리:
    • 액터가 사용할 수 있는 게임플레이 어빌리티를 관리하고 활성화한다.
    • 어빌리티의 활성화 조건, 비용, 쿨다운 등을 처리한다.
  • 속성 관리:
    • 액터의 속성(Attribute)과 속성 세트(Attribute Set)를 관리한다.
    • 속성 값의 변화를 추적하고 게임플레이 효과(Gameplay Effect)를 적용한다.
  • 게임플레이 효과 관리:
    • 액터에게 적용되는 게임플레이 효과를 관리한다.
    • 지속적인 효과, 즉시 효과, 버프, 디버프 등을 처리한다.
  • 네트워크 동기화:
    • 멀티플레이어 환경에서 어빌리티, 속성, 효과 등을 동기화한다.
    • 클라이언트 예측 및 서버 권한 관리를 지원한다.
  • 게임플레이 태그 관리:
    • 게임플레이 태그를 관리하여 어빌리티와 효과의 상호작용을 유연하게 처리한다.

 이중 가장 중요한 내용은 게임플레이 태그 관리인데 이는 다음에 알아보도록 하겠다. 우리는 이 ABS 를 통해서 캐릭터의 능력과 패시브를 초기화해줄 수 있게된다.

 

 이제 AttributeSet 을 상속받는 C++ 클래스인 RPGAttributeSet 을 퍼블릭으로 생성해준다. AttributeSet 은 말 그대로 속성 세트인데 이는 우리가 만들 속성 (체력 공격력 등)들의 저장소라고 생각하면 된다. 더 자세히 알아보자면 다음과 같다.

 

AttributeSet

 

 

  • 속성 저장:
    • 캐릭터의 생명력, 마나, 공격력, 방어력 등과 같은 게임플레이 관련 속성들을 저장한다.
    • FGameplayAttributeData 구조체를 사용하여 속성 값을 표현하고 관리한다.
  • 속성 관리:
    • 속성 값의 변화를 추적하고, 게임플레이 효과(Gameplay Effect)에 의한 속성 변화를 처리한다.
    • 속성 값의 최대/최소 제한을 설정하고, 속성 변화에 따른 이벤트를 발생시킬 수 있다.
  • 속성 그룹화:
    • 관련된 속성들을 하나의 AttributeSet으로 그룹화하여 관리한다.
    • 예를 들어, 캐릭터의 기본 능력치를 하나의 AttributeSet으로 묶고, 전투 관련 능력치를 다른 AttributeSet으로 묶을 수 있다.

 UObject 기반이며 리플리케이션을 지원하기에 멀티플레이 환경에서 속성 값을 동기화하기 편하다.

 

 이번 시간에는 이 세 가지 C++ 클래스를 만들어보고 코딩을 하겠다. 코딩의 내용은 위의 유튜브 강의 또는 아래의 내 레포지트리에 들어가 확인하면 된다.

https://github.com/nonecalculate/UE5-MultiplayRPGSystem/tree/main/FollowAlong_01