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

 

여러 능력들을 추가하기 전에, 베이스 능력을 만들어 이펙트 적용 같은 자주 쓰이는 기능들을 미리 구현해놓는 것이 좋다.

Non Instanced Ability

객체화되지 않은 능력은 읽기 전용(const) CDO(Class Default Object)를 통해 실행되므로, 값(기본 값)을 외부에서 변경할 수 없다.
그러므로, 값이나 상태를 저장할 수 없고 모든 액터는 전부 동일한 CDO를 통해 능력을 실행하게 된다.
CDO에 특별하게 관리되는 값이 있다면, 여러 액터가 동일한 CDO를 통해 능력을 실행할 경우 충돌이 생길 수 있다.

 

Instanced Per Actor Ability

따라서 액터나 실행 단위별로 상태나 값을 저장하기 위해서는 CDO가 아니라, 능력을 객체화시켜 사용해야 한다.

 

예를 들어, 단순히 점프하는 능력은 여러 액터가 같은 CDO를 통해 능력을 실행해도 문제가 없지만, 앉기의 경우 앉아 있는 상태라는 걸 능력에 저장하기 위해서는 각 액터별로 다른 객체를 통해 능력을 실행해야 한다.

 

능력의 베이스 클래스인 AG_GameplayAbility에 다음을 선언한다.

  • OngoingEffectsToJustApplyOnStart
    객체화되지 않은 능력에 사용될 이펙트이다.
  • OngoingEffectsToRemoveOnEnd
    객체화된 능력에 사용될 이펙트이다.
  • RemoveOnEndEffectHandles
    객체화된 능력에 사용된 이펙트를 EndAbility() 때 제거해주기 위한 핸들이다.

 

객체화 여부에 따라 이펙트를 나눠 놓은 이유는 다음과 같다.

  • CDO에서 실행되는 객체화되지 않은 능력의 이펙트는 능력에 상태를 저장할 수 없으므로, 이펙트의 소멸 시점을 신경 쓰지 않아도 된다.
  • 각 객체에서 실행되는 객체화된 능력의 이펙트는 능력에 상태를 저장할 수 있으므로, 이펙트의 소멸 시점을 신경 써주어야 한다.

 


엔진에 내장되어 있는 GameplayAbility.h 헤더에서 ActivateAbility() 함수를 복사해와 오버라이드한다.

 


헤더를 포함하고 ActivateAbility() 함수를 구현한다.

 

CDO에서 실행되는 능력은 이펙트의 소멸 시점을 고려하지 않아도 되고, 객체에서 실행되는 능력은 이펙트의 소멸 시점을 직접 관리하기 위해 핸들을 별도로 저장해준다.


Ability System 컴포넌트는 약 포인터라서 쓰기 전에 유효한지 검사해야 한다.

 

 

엔진에 내장되어 있는 GameplayAbility.h 헤더에서 EndAbility() 함수를 복사해와 오버라이드한다.


EndAbility() 함수를 구현한다.

 

객체에서 실행되는 능력의 이펙트가 능력과 함께 소멸하도록 한다.

 


능력에서 ActionGameCharacter 객체를 바로 가져오는 유용한 헬퍼 함수를 만든다.

 


BP_GA_Jump에서 GA_Jump 클래스에 직접 선언했던 Jump Effect 변수를 Clear하고, 베이스 클래스의 변수인 OngoingEffectsToJustApplyOnStart에 점프 상태를 설정하는 GE_State_Jump 이펙트를 추가한다.

 


GA_Jump에 직접 구현되어 있던 내용들은 주석 처리한다.

 

 

베이스 클래스에 구현한 기능으로 이펙트를 실행하는 데 성공했다.

 

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

달리기 능력  (0) 2023.05.12
앉기 능력  (0) 2023.05.11
점프 능력  (0) 2023.05.09
향상된 입력(Enhanced Input)  (0) 2023.05.08
발자국 소리 적용과 고급 디버깅  (0) 2023.05.07
profile

Make Unreal REAL.

@diesuki4

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

검색 태그