Make Unreal REAL.
article thumbnail
Advanced Unreal Engine 5 Multiplayer Gameplay Programming

 

점프는 이미 Chracter Movement 컴포넌트에 의해 이미 복제되고 있고, 심지어 점프 능력도 이미 존재한다.

 


이미 점프 능력이 있는데 커스텀 점프 능력을 만드는 이유는, GAS를 통해 다른 능력과 점프 능력과의 관계를 설정하기 위함이다.

 

새로운 Gameplay Ability C++ 베이스 클래스와, 그 클래스를 상속 받은 점프 능력 클래스를 생성한다.

 


점프 능력 C++ 클래스 GA_Jump를 상속 받은 블루프린트 클래스를 생성한다.

 


점프 능력 클래스에 생성자를 선언하고 구현한다.

 

EGameplayAbilityNetExecutionPolicy

  • LocalPredicted
    로컬에서 시작한 후 서버에서 실행된다.
  • LocalOnly
    로컬에서만 실행된다.
  • ServerInitiated
    서버에서만 시작한 후 클라이언트에서도 실행된다.
  • ServerOnly
    서버에서만 실행된다.

 

 

EGameplayAbilityInstancingPolicy

  • NonInstanced
    객체를 생성하지 않고 항상 CDO에서 실행된다.
  • InstancedPerActor
    액터별로 객체가 생성되고 상태를 저장할 수 있으며 리플리케이션이 가능하다.
  • InstancedPerExecution
    매 실행마다 객체가 생성되며 리플리케이션이 가능하지만 권장하지 않는다.

 


GameplayAbility 클래스에는 능력을 사용 가능한지 반환하는 CanActivateAbility() 함수와 능력을 실행하는 ActivateAbility() 함수가 있다.

 

 

헤더에서 두 함수의 선언부를 복사해와 오버라이드한다.

 


헤더를 포함한다.

 

 

CanActivateAbility() 함수와 ActivateAbility() 함수의 구현은 언리얼 엔진에 이미 내장되어 있는 GameplayAbility_CharacterJump 점프 능력에서 참고한다.

 

 

내용을 복사해와 함수를 구현한다.

  • CastChecked() 함수는 Cast() 함수의 C-Style 버전으로, 내부적으로 IsA() 검사를 하지 않기 때문에 좀 더 효율적이다.

 

ECastCheckedType

  • NullAllowed
    NULL을 허용한다.
  • NullChecked
    NULL이면 assert된다.

 


점프 능력 실행 시 함께 실행될 Gameplay Effect를 추가해본다.

 

 

헤더를 추가한다.

 


능력을 실행하는 ActivateAbility() 함수에 Gameplay Effect를 실행하는 부분을 추가한다.

  • 액터의 Ability System 컴포넌트를 가져와 Gameplay Effect를 실행하고, 실패했으면 로그를 띄운다.

 

 

BP_GA_Jump 능력을 열어서 태그를 작성한다.

  • 모든 능력이 각각 다른 태그를 갖도록 하는 것이 좋다.


Ability Tags의 Edit 버튼을 누르고 Name에 Ability.Movement.InAir.Jump를 입력한 후, Add New Tag 버튼을 눌러 태그를 추가한다.

  • X.Y.Z.W 형식으로 입력하면 알아서 X - Y - Z - W 순으로 하위 카테고리가 된다.

 

이제 Ability.Movement.InAir.Jump는 이 능력의 고유 태그가 되었다.

 

 

Trigger Tag에는 Event.Movement.Jump 이벤트 태그를 추가한다.

  • 이벤트 태그를 통해 액터에 이벤트를 전달하면 능력을 트리거할 수 있다.

 


캐릭터에 점프 상태임을 나타내기 위해 적용할 Gameplay Effect 에셋을 생성한다.

  • GA_Jump의 ActivateAbility() 함수에서 점프가 실행될 때 함께 실행된다.

 


Gameplay Effect의 고유 태그인 GameplayEffectAssetTag와 액터에게 적용되는 태그인 GrantedTags에 State.InAir.Jumping을 추가한다.

 

GrantedTags는 액터에 추가되므로, 이 태그를 통해 액터에서 활성화 상태인 이펙트를 중지시킬 수 있다.

 


BP_GA_Jump 점프 능력의 Jump Effect 변수에 태그를 통해 액터에 상태를 추가하는 GE_State_Jump 이펙트를 할당한다.

 


캐릭터의 기본 속성과 능력을 담는 BaseCharacter 데이터 에셋에 기본 능력으로 BP_GA_Jump 점프 능력을 추가한다.

 


이제 엑터에 이벤트 태그를 통해 이벤트를 보내 능력을 트리거할 수 있다.


캐릭터 클래스에 능력을 트리거할 이벤트 태그(Event.Movement.Jump), 점프 능력과 함께 실행된 이펙트를 중지시킬 때 사용할 태그(State.InAir)를 선언한다.

 


기존 코드는 주석 처리한다.

 

송신자를 설정하고 점프 이벤트 태그를 통해 수신 액터에 점프 이벤트를 보낸다.

  • 이벤트를 받은 액터의 능력 중에 이 이벤트 태그를 Trigger Tag로 갖고 있는 능력이 있다면, 그 능력이 실행된다.

 


캐릭터가 착지할 때 호출되는 Landed() 함수를 오버라이드한다.

 

 

점프를 하게 되면, GA_Jump 능력의 ActivateAbility() 함수에서 점프 상태임을 나타내기 위해 실행된 GE_State_Jump 이펙트를 통해 액터에 State.InAir.Jumping 태그가 추가된다.


착지하면 점프 상태를 제거하기 위해서, Ability System 컴포넌트를 통해 State.InAir 태그를 갖는 이펙트를 제거한다.

 


캐릭터 BP에서 능력을 트리거할 이벤트 태그와 이펙트를 중지시킬 때 사용할 태그를 설정해준다.

 


` 키를 눌러 콘솔을 연 후, showdebug abilitysystem 1을 입력해 디버깅 정보를 확인한다.


Gameplay Ability를 통해 점프를 구현하는 데 성공했으나, 점프 상태를 나타내는 태그가 뜨지 않는다.

 


상태를 나타내기 위해 적용하는 이펙트인 GE_State_Jump에서 Duration Policy를 Instant에서 Infinite로 변경한다.

  • 영원히 이펙트가 지속되어도 착지 시에 이펙트를 제거하므로 상관 없다.

 


이제 태그를 통해서도 점프 중임을 확인할 수 있다.

 

'Unreal Engine > Advanced UE5 Multiplayer Programming' 카테고리의 다른 글

앉기 능력  (0) 2023.05.11
베이스 능력  (0) 2023.05.10
향상된 입력(Enhanced Input)  (0) 2023.05.08
발자국 소리 적용과 고급 디버깅  (0) 2023.05.07
피지컬 머티리얼  (0) 2023.05.07
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그