1.啟動項目,為項目添加gameplayability插件
2.添加abilitysystemcomponent的c++類
3.添加attributeset的c++類
4.往build.cs內添加模塊
5.進入CharacterBase內,添加gameplayasystem和attributbeset,覆寫PossessedBy()和GetAbilitysystemcomponent()
class ARPG_GRIVITY_API ACharacterBase : public ACharacter, public IAbilitySystemInterface
{GENERATED_BODY()public:ACharacterBase();//創建能力組件的獲取方法UXMBAbilitySystemComponent* GetXMBAbilitySystemComponent() const {return XMBAbilitySystemComponent;}//創建屬性集的獲取方法UXMBAttributeSet* GetXMBAttributeSet() const {return XMBAttributeSet;}//Begin IAbilitySystemInterface Interfacevirtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;//End IAbilitySystemInterface Interfaceprotected://創建能力組件UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "AbilitySystem")UXMBAbilitySystemComponent* XMBAbilitySystemComponent;//創建屬性集UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "AbilitySystem")UXMBAttributeSet* XMBAttributeSet;//Begin Apawn Interfacevirtual void PossessedBy(AController* NewController) override;//End Apawn Interface
};
6.在構造函數里創建,覆寫函數體內
#include "Character/CharacterBase.h"
#include "AbilitySystem/XMBAttributeSet.h"
#include "AbilitySystem/XMBAbilitySystemComponent.h"ACharacterBase::ACharacterBase()
{PrimaryActorTick.bCanEverTick = false;//初始禁用 Tick,適合需要手動控制更新的場景。PrimaryActorTick.bStartWithTickEnabled = false;//禁用貼花接收,適用于性能優化或特定視覺需求。GetMesh()->bReceivesDecals = false;XMBAbilitySystemComponent = CreateDefaultSubobject<UXMBAbilitySystemComponent>(TEXT("XMBAbilitySystemComponent"));XMBAttributeSet = CreateDefaultSubobject<UXMBAttributeSet>(TEXT("XMBAttributeSet"));
}UAbilitySystemComponent* ACharacterBase::GetAbilitySystemComponent() const
{return GetXMBAbilitySystemComponent();
}void ACharacterBase::PossessedBy(AController* NewController)
{Super::PossessedBy(NewController);if (XMBAbilitySystemComponent){XMBAbilitySystemComponent->InitAbilityActorInfo(this, this);}}
7.進入到玩家控制的角色內(XMBCharacter),對PossessedBy覆寫
//Begin Apawn Interfacevirtual void PossessedBy(AController* NewController) override;//End Apawn Interface
void AXMBCharacter::PossessedBy(AController* NewController)
{Super::PossessedBy(NewController);if (XMBAbilitySystemComponent && XMBAttributeSet){GEngine->AddOnScreenDebugMessage(-1,5.f, FColor::Red, FString::Printf(TEXT("Owner: %s, Avatar : %s"),*XMBAbilitySystemComponent->GetOwnerActor()->GetActorLabel(),*XMBAbilitySystemComponent->GetAvatarActor()->GetActorLabel()));}
}
8.啟動,能從日志里看到信息
9.我們需要給AbilitySystemComponent賦予Ability,當玩家嘗試激活Ability時,實際上是從ASC中激活能力。對于激活的這一部分,我們可以自定義Ability的激活方式。
繼續創建一個GameplayAbility的c++類,然后在其內創建一個激活策略的枚舉,覆寫兩個函數
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Abilities/GameplayAbility.h"
#include "XMBGameplayAbility.generated.h"//創建一個激活能力的策略枚舉
UENUM()
enum class EXMBAbilityActivationPolicy : uint8
{OnTriggered,OnGiven
};
/*** */
UCLASS()
class ARPG_GRIVITY_API UXMBGameplayAbility : public UGameplayAbility
{GENERATED_BODY()public:protected://設置激活策略UPROPERTY(EditDefaultsOnly, Category = "XMBAbility")EXMBAbilityActivationPolicy AbilityActivationPolicy = EXMBAbilityActivationPolicy::OnTriggered;//~ Begin UGameplayAbility Interfacevirtual void OnGiveAbility(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) override;virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled) override;//~ End UGameplayAbility Interface};
// Fill out your copyright notice in the Description page of Project Settings.#include "AbilitySystem/Abilities/XMBGameplayAbility.h"#include "AbilitySystem/XMBAbilitySystemComponent.h"//在Ability被分配給AbilitySystemComponent后立即調用
void UXMBGameplayAbility::OnGiveAbility(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec)
{Super::OnGiveAbility(ActorInfo, Spec);if (AbilityActivationPolicy == EXMBAbilityActivationPolicy::OnGiven){if (ActorInfo && !Spec.IsActive()){//Spec.Handle是FGameplayAbilitySpec對象的句柄,表示一個具體的能力實例ActorInfo->AbilitySystemComponent->TryActivateAbility(Spec.Handle);}}
}void UXMBGameplayAbility::EndAbility(const FGameplayAbilitySpecHandle Handle,const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,bool bReplicateEndAbility, bool bWasCancelled)
{Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);if (AbilityActivationPolicy == EXMBAbilityActivationPolicy::OnGiven){if (ActorInfo){//Handle是FGameplayAbilitySpec對象的句柄,表示要清除的能力實例。ActorInfo->AbilitySystemComponent->ClearAbility(Handle);}}
}
10.啟動引擎,右鍵即可創建一個剛才自己創建的gameplayability類,