RPG17.蓝图函数库与轻重攻击连击
1.创建蓝图函数库
2.
XMBWarriorFunctionLibrary.h
#pragma once#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "AbilitySystem/XMBAbilitySystemComponent.h"
#include "XMBWarriorFunctionLibrary.generated.h"UENUM()
enum class EXMBWarriorConfirmType : uint8
{Yes,No
};/*** */
UCLASS()
class ARPG_GRIVITY_API UXMBWarriorFunctionLibrary : public UBlueprintFunctionLibrary
{GENERATED_BODY()
public:static UXMBAbilitySystemComponent* NativeGetXMBPlayerASCFromActor(AActor* InActor);UFUNCTION(BlueprintCallable, Category = "XMBWorrior|FunctionLibrary")static void AddGameplayTagToActorIfNone(AActor* InActor, FGameplayTag TagToAdd);UFUNCTION(BlueprintCallable, Category = "XMBWorrior|FunctionLibrary")static void RemoveGameplayFromActorIfFound(AActor* InActor, FGameplayTag TagToRemove);static bool NativeDoesActorHaveTag(AActor* InActor, FGameplayTag TagToCheck);UFUNCTION(BlueprintCallable, Category = "XMBWorrior|FunctionLibrary", meta = (DisplayName = "Does Actor Have Tag", ExpandEnumAsExecs = "OutConfirmType"))static void BP_DoesActorHaveTag(AActor* InActor, FGameplayTag TagToCheck, EXMBWarriorConfirmType& OutConfirmType);
};
XMBWarriorFunctionLibrary.cpp
// Fill out your copyright notice in the Description page of Project Settings.#include "XMBWarriorFunctionLibrary.h"
#include "AbilitySystemBlueprintLibrary.h"
#include "AbilitySystem/XMBAbilitySystemComponent.h"UXMBAbilitySystemComponent* UXMBWarriorFunctionLibrary::NativeGetXMBPlayerASCFromActor(AActor* InActor)
{check(InActor);//从Actor中获取ASC//在内部检查是否实现了IAbilitySystemInterfacereturn Cast<UXMBAbilitySystemComponent>(UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(InActor));
}void UXMBWarriorFunctionLibrary::AddGameplayTagToActorfNone(AActor* InActor, FGameplayTag TagToAdd)
{UXMBAbilitySystemComponent* ASC = NativeGetXMBPlayerASCFromActor(InActor);if (ASC->HasMatchingGameplayTag(TagToAdd)){ASC->AddLooseGameplayTag(TagToAdd);}
}void UXMBWarriorFunctionLibrary::RemoveGameplayFromActorIfFound(AActor* InActor, FGameplayTag TagToRemove)
{UXMBAbilitySystemComponent* ASC = NativeGetXMBPlayerASCFromActor(InActor);if (ASC->HasMatchingGameplayTag(TagToRemove)){ASC->RemoveLooseGameplayTag(TagToRemove);}
}bool UXMBWarriorFunctionLibrary::NativeDoesActorHaveTag(AActor* InActor, FGameplayTag TagToCheck)
{UXMBAbilitySystemComponent* ASC = NativeGetXMBPlayerASCFromActor(InActor);return ASC->HasMatchingGameplayTag(TagToCheck);
}void UXMBWarriorFunctionLibrary::BP_DoesActorHaveTag(AActor* InActor, FGameplayTag TagToCheck,EXMBWarriorConfirmType& OutConfirmType)
{OutConfirmType = NativeDoesActorHaveTag(InActor, TagToCheck) ? EXMBWarriorConfirmType::Yes : EXMBWarriorConfirmType::No;
}
3.接下来轻重攻击,做成的效果是:当轻击第三下后,再点击重击,此时打出重击最后一下。
打开GA_LightAttack,三处改动位置
打开GA_HeavyAttack,三处改动位置
完成以上则能做到效果。
(将来会使用类似的方法添加更多攻击动画和函数库函数用于不同类型攻击间的搭配、转换、伤害计算等效果)