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)에 그려지는 것을 알 수 있다.

이는 클라이언트에서 커서 트레이스가 발동하지만 서버는 알 방법이 없기 때문이다.

다음 포스트에서는 이 문제를 해결한다.