1. Ability Tasks
어빌리티 태스크는 어빌리티가 실행되는 동안 비동기 작업을 시행하기 위해 설계된 모듈이다. 비동기 작업의 대표적인 예로는 애니메이션 몽타주의 재생 완료 등이 있다.
어빌리티에서 몽타주 재생 함수를 가져오면 Latent라고 나온다. Latent는 비동기 실행 노드를 말한다.
노드에서 볼 수 있듯이 기본 출력핀은 즉시 다음 노드가 실행되지만 완료된 후, 블랜드 아웃 후 등등 다양한 비동기적으로 실행이 가능한 출력핀들이 있다.
이러한 기능은 어빌리티 태스크가 있어서 가능한 것인데 이제 더 많은 기능들을 넣기 위하여 커스텀 어빌리티 태스크 클래스를 만들어보자.
태스크에 존재하는 함수들은 스태틱 함수들이다. 우리가 만든 커스텀 태스크 클래스도 이를 따르도록 하자.
UCLASS()
class PRACTICE2_API UTargetDataUnderMouse : public UAbilityTask
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category="Ability|Tasks", meta=(HidePin = "OwningAbility", DefaultToSelf="OwningAbility", BlueprintInternalUseOnly = "true"))
static UTargetDataUnderMouse* CreateTargetDataUnderMouse(UGameplayAbility* OwningAbility);
};
매크로를 살펴보자.
HidePin = "OwningAbility"
해당 이름을 가진 매개변수를 블루프린트 노드에서 숨긴다는 것이다.
DefaultToSelf="OwningAbility"
해당 이름을 가진 변수의 디폴트 값을 self(c++에서는 this)로 설정한다는 것이다. 여기서 this 포인터는 어빌리티 클래스를 가르킬 것이다. (태스크를 어빌리티 클래스에서 사용할 것이기 때문에)
BlueprintInternalUseOnly = "true"
해당 지정자의 설명을 보면 아래와 같이 나와있다.
This function is an internal implementation detail, used to implement another function or node. It is never directly exposed in a graph.
블루프린트 그래프에서 바로 호출하지 못하고 다른 함수나 노드의 구현을 위해서만 사용하 수 있게 하는 지정자이다.
이제 함수를 정의하자.
UTargetDataUnderMouse* UTargetDataUnderMouse::CreateTargetDataUnderMouse(UGameplayAbility* OwningAbility)
{
UTargetDataUnderMouse* MyObg = NewAbilityTask<UTargetDataUnderMouse>(OwningAbility);
return MyObg;
}
단순히 어빌리티 태스크를 생성해서 반환하는 함수이다.
2. 태스크 구성하기
이제 이 어빌리티 태스크에 기능들을 추가하자. 여러 출력 핀을 만들어 다양한 기능을 추가할 것인데 이를 위에 델리게이트에 브로드 캐스트를 할 것이다.
델리게이트를 선언한다.
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMouseTargetDataSignature, const FVector&, Data);
클래스에 델리게이트 변수를 만들자.
UPROPERTY(BlueprintAssignable)
FMouseTargetDataSignature VaildData;
이 델리게이트는 출력핀이 될 것이다.
이제 어빌리티가 실행되면 실행할 함수를 구현하자.
private:
virtual void Activate() override;
void UTargetDataUnderMouse::Activate()
{
APlayerController* PC = Ability->GetCurrentActorInfo()->PlayerController.Get();
FHitResult CursorHit;
PC->GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);
VaildData.Broadcast(CursorHit.ImpactPoint);
}
마우스의 위치를 구해서 이 값을 브로드 캐스트한다.
이런식으로 태스크의 구성을 완료하였다.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습2] 46. 서버에서 타겟 데이터 수신하기 (0) | 2024.12.04 |
---|---|
[실습2] 45. 마우스 커서 데이터 서버로 보내기 (0) | 2024.12.04 |
[실습2] 43. 발사체 생성 능력 만들기 (0) | 2024.12.03 |
[실습2] 42. 마우스 클릭으로 움직이게 하기 (0) | 2024.12.03 |
[실습2] 41. 커스텀 인풋 컴포넌트 만들기 (0) | 2024.12.03 |