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

 

GA_Crouch 앉기 능력 C++ 클래스와 상속 받은 BP_GA_Crouch 블루프린트 클래스를 생성한다.

 


Ability Tags에 Ability.Movement.Crouch 태그를 설정한다.

  • 이 태그는 능력의 고유 태그이며, 액터의 Ability System 컴포넌트에서 능력을 실행하거나 취소할 때 사용된다.

 


앉기 상태를 나타내기 위해 적용할 GE_State_Crouch 이펙트를 생성한다.

 


단발성이 아니라, 태그를 통해 앉기 상태임를 나타내기 위한 이펙트이므로 Duration Policy를 Infinite로 설정한다.

  • 앉기가 끝날 때 이펙트를 제거한다.

 

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

 


캐릭터의 기본 이펙트, 기본 능력, 기본 애니메이션 데이터 에셋 등을 저장하는 BaseCharacter 데이터 에셋에 앉기 능력인 BP_GA_Crouch를 추가한다.

 


Enhanced Input에 사용될 Crouch 앉기 Input Action을 생성한다.

 

 

Enhanced Input에 사용되는 DefaultInputMappingContext에 Crouch Input Action을 매핑하고 키를 설정한다.

 


GA_Crouch 앉기 능력 C++ 클래스에 생성자를 선언하고 구현한다.

 

점프 능력에서는 Instancing Policy를 NonInstanced로 설정해 CDO를 통해 실행했지만, 이번에는 InstancedPerActor로 설정해 객체를 생성해 능력을 실행하도록 해본다.

  • 앉기 능력 자체에서 특별히 관리하는 상태나 값은 없으므로 NonInstanced로 해도 되지만, 연습삼아 InstancedPerActor로 설정해본다.

 


능력을 실행할 수 있는지 반환하는 CanActivateAbility() 함수를 오버라이드한다.

 


능력을 활성화하는 ActivateAbility() 함수를 오버라이드한다.

 


능력을 중지시킬 때 호출되는 EndAbility() 함수를 오버라이드한다.

 


캐릭터 클래스에서 Enhanced Input에 앉기를 바인딩하기 위해 Crouch Input Action의 참조와 콜백 함수들을 선언한다.

 

 

앉기 능력(BP_GA_Crouch)의 Ability Tags(Ability.Movement.Crouch)를 통해 앉기를 실행하기 위한 CrouchTags를 선언한다.

 

 

SetupPlayerInputComponent() 함수에서 Crouch Input Action에 콜백 함수를 바인딩한다.

 


Left Ctrl 키가 눌렸을 때 호출되는 OnCrouchActionStarted() 함수를 구현한다.

  • 점프에서 사용한 SendGameplayEventToActor() 함수는 액터에 이벤트 태그와 함께 이벤트를 보내, 해당 액터의 능력 중 전달된 이벤트 태그를 트리거 태그로 갖는 능력이 실행되는 방식이다.
    다른 액터에게 보내는 메시지의 개념이다.
  • TryActivateAbilitiesByTag() 함수는 Ability Tags를 통해 액터의 Ability System 컴포넌트에서 능력을 직접 실행하는 방식이다.
    자기 자신에게 내리는 명령의 개념이다.

 

 

Left Ctrl 키를 떼었을 때 호출되는 OnCrouchActionEnded() 함수를 구현한다.

  • 점프에서 사용한 RemoveActiveEffectsWithTags() 함수는 전달된 Gameplay Effect Asset Tag를 가진 이펙트를 제거하는 함수다.
  • CancelAbilities() 함수는 이펙트가 아니라, 전달된 Ability Tags를 가진 활성화 상태인 능력을 취소하는 함수다.

 

 

 

Character Movement 컴포넌트의 Crouch(), UnCrouch() 함수는 명령을 할 뿐, 직접 수행하지는 않는다.

  • 머리 바로 위에 천장이 있는 상황에서는 UnCrouch() 함수가 실행되어도 일어설 수 없기 때문이다.

 

따라서 이러한 상황에서도 OnCrouchActionEnded() 함수가 실행됨에 따라 Ability System은 앉기 능력을 취소할 것이지만, 실제로는 아직 앉아 있다는 것을 나타내기 위해 아까 상태를 나타내기 위해 적용하는 GE_State_Crouch 이펙트를 생성한 것이다.


앉기 상태를 나타내는 GrantedTags(State.Movement.Crouch)를 적용하기 위한 CrouchStateEffect(GE_State_Crouch) 이펙트를 통해 능력은 취소 되었어도 앉은 상태라는 걸 알 수 있도록 하기 위함이다.

 


앉기, 서기 시에 실행되는 OnStartCrouch(), OnEndCrouch() 함수를 오버라이드한다.

 


이 두 함수를 통해 GAS를 통해서가 아닌, 자신에게 직접 이펙트를 통해 태그를 적용해 앉기 상태임을 유지한다.

  • 그러면 능력이 취소되어도 실제로는 아직 앉은 상태라는 걸 알 수 있다.

 

앉기 시에 실행되는 OnStartCrouch() 함수를 구현한다.

 


서기 시에 실행되는 OnEndCrouch() 함수를 구현한다.

  • 이펙트는 태그를 통해서도, Source Effect를 통해서도 중지시킬 수 있다.

 


캐릭터 BP에서 다음을 설정한다.

  • Crouch Input Action: Crouch
  • Crouch Tags: Ability.Movement.Crouch (BP_GA_Crouch의 Ability Tags이다.)
  • Crouch State Effect: GE_State_Crouch (State.Movement.Crouch 태그를 적용하기 위함이다.)

 

 

Character Movement 컴포넌트에서 앉기 기능은 기본적으로 꺼져 있다.

  • Can Crouch 옵션을 켜준다.

 

Can Walk Off Ledges when Crouching 옵션도 켜준다.

  • 앉기 시에 절벽으로 떨어질 수 있는지 여부이다.

 


애니메이션을 데이터 에셋을 통해 관리하기 위한 ActionGameTypes.h의 FCharacterAnimationData 구조체에 앉기 애니메이션에 대한 참조도 추가해준다.

 


애니메이션 데이터 에셋에 대한 참조를 갖고 있는 애님 인스턴스에 앉기 애니메이션을 가져오기 위한 헬퍼 함수를 선언한다.

 

 

헬퍼 함수를 구현한다.

 


앉아 있는 상태에서 걷는 블렌드 스페이스를 생성한다.

 


BaseCharacterAnimData 데이터 에셋에서 앉은 상태에서 걷는 블렌드 스페이스와 앉은 Idel 상태 애니메이션을 설정해준다.

 


애니메이션 BP에 앉은 상태인지 나타내는 IsCrouched 변수를 생성하고 이벤트 그래프에서 업데이트 해준다.

 


Locomotion - Idle State를 다음과 같이 수정해준다.

 

 

Locomotion - Walk / Run State를 다음과 같이 수정해준다.

 


Anim Preview Editor에서 값들을 변경해 테스트 해본다.

 


앉기도 정상적으로 작동하고 태그도 잘 적용됐다.

 


이번에는 앉은 상태에서 일어날 수 없는 천장을 만들고 테스트 해본다.

 

 

천장 밑으로 들어가 Left Ctrl 키를 떼었으나, 여전히 앉은 태그가 유지되고 있다.

  • 능력은 취소되었으나 태그를 통해 여전히 앉은 상태라는 것을 알 수 있다.

 

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

뛰어넘기 능력  (0) 2023.05.13
달리기 능력  (0) 2023.05.12
베이스 능력  (0) 2023.05.10
점프 능력  (0) 2023.05.09
향상된 입력(Enhanced Input)  (0) 2023.05.08
profile

Make Unreal REAL.

@diesuki4

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

검색 태그