0. 개요
적을 클릭해 파이어볼트를 발사할 때 투사체가 적을 향해서 움직이도록 하고 싶다.
커서 트레이스의 정보를 가져와서 파이어볼트의 이동을 제어할 수 있도록 커스텀 게임플레이 태스크를 생성한다.
1. 커스텀 게임플레이 태스크 - TargetDataUnderMouse
(1) 클래스 생성
어빌리티 태스크를 상속받는 TargetDataUnderMouse C++ 클래스를 생성한다.
#include "CoreMinimal.h"
#include "Abilities/Tasks/AbilityTask.h"
#include "TargetDataUnderMouse.generated.h"
UCLASS()
class AURA_API UTargetDataUnderMouse : public UAbilityTask
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category="Ability|Tasks", meta = (DisplayName = "TargetDataUnderMouse", HidePin = "OwningAbility", DefaultToSelf = "OwningAbility", BlueprintInternalUseOnly = "true"))
static UTargetDataUnderMouse* CreateTargetDataUnderMouse(UGameplayAbility* OwningAbility);
};
UFUNCTION 매크로를 이용해 블루프린트 노드를 생성할 수 있게 된다.
- meta 매개 변수
(1) DisplayName : 노드의 이름
(2) HidePin : 숨길 핀
(3) DefaultToSelf : 함수의 매개변수(여기에서는 OwningAbility)를 this(블루프린트에서 self)로 지정
(4) BlueprintInternalUseOnly : 블루프린트에서만 사용가능
(2) CreateTargetDataUnderMouse 함수
이 함수를 이용하여 마우스 아래의 타겟의 데이터를 생성한다.
UTargetDataUnderMouse* UTargetDataUnderMouse::CreateTargetDataUnderMouse(UGameplayAbility* OwningAbility)
{
UTargetDataUnderMouse* MyObj = NewAbilityTask<UTargetDataUnderMouse>(OwningAbility);
return MyObj;
}
(3) 출력 핀 생성
#include "CoreMinimal.h"
#include "Abilities/Tasks/AbilityTask.h"
#include "TargetDataUnderMouse.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMouseTargetDataSignature, const FVector&, Data);
UCLASS()
class AURA_API UTargetDataUnderMouse : public UAbilityTask
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category="Ability|Tasks", meta = (DisplayName = "TargetDataUnderMouse", HidePin = "OwningAbility", DefaultToSelf = "OwningAbility", BlueprintInternalUseOnly = "true"))
static UTargetDataUnderMouse* CreateTargetDataUnderMouse(UGameplayAbility* OwningAbility);
UPROPERTY(BlueprintAssignable)
FMouseTargetDataSignature ValidData;
};
델리게이트를 통해 타겟의 데이터를 전달받기 위해 FMouseTargetDataSignature 델리게이트를 생성한다.
해당 델리게이트로 전달받을 매개변수는 FVector 타입의 Data 이다.
이를 통해 출력 핀이 두 개가 생성된다.
(4) Activate 함수 오버라이드
이제 유효한 데이터인 Valid Data에 커서의 위치를 넘겨줄 것이다.
실제 함수가 수행하는 역할은 Activate 함수를 오버라이드하여 사용하게 된다.
void UTargetDataUnderMouse::Activate()
{
// Super는 로그만 출력함
APlayerController* PC = Ability->GetCurrentActorInfo()->PlayerController.Get();
FHitResult CursorHit;
PC->GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);
// 브로드캐스트
ValidData.Broadcast(CursorHit.Location);
}
Gameplay Tasks의 멤버변수인 Ability에 접근하여 어빌리티의 액터 정보에 접근하여 컨트롤러의 포인터를 얻는다.
(5) 디버그 - GA_FireBolt
디버깅을 위해 노드를 위와 같이 배치한다.
리슨 서버 상태에서 디버깅을 하면 클라이언트가 적을 클릭하면 서버에서 디버그 구체가 (0, 0, 0)에 그려지는 것을 알 수 있다.
이는 클라이언트에서 커서 트레이스가 발동하지만 서버는 알 방법이 없기 때문이다.
다음 포스트에서는 이 문제를 해결한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
9-5. 예측(Prediction) (0) | 2024.12.11 |
---|---|
9-4. 커스텀 어빌리티 태스크 - (2) 타겟 데이터(Target Data) 서버로 전송하기 (0) | 2024.12.09 |
9-2. 게임플레이 이벤트(Gameplay Events) (0) | 2024.12.09 |
9-1. 어빌리티 태스크(Ability Tasks) (0) | 2024.12.09 |
8-10. 게임플레이 어빌리티 - (3) 투사체 생성 및 발사 (0) | 2024.12.05 |