UE5でFPSゲーム制作 Part5-GameplayAbilitySystem

Gameplay Ability System (以下GAS)は多機能な反面、複雑でとっつきにくい印象があります。少なくとも自分はそうでした。

個人制作レベルであまり使う必要はないのかもしれませんが、GASの機能の一つである挙動の排他的処理が非常に優秀なので実装していきたいと思います。

ダッシュ中にエイムするとダッシュがキャンセルされる。ジャンプ中はエイムができない。リロード中に他の動作をするとリロードキャンセルされる。などのフラグ管理を非常に楽にしてくれます)

 

参考にしたブログ様

GameplayAbilitiesの使い方(セットアップ編) - おかわりはくまいのアンリアルなメモ (hatenablog.com)

この方はアビリティをリスト形式で登録する方法を採用しており、後の実装を非常に楽になるのでおすすめです。

GASの準備

まずはC++で使用できるようにします。C++のSource→TutorialFPS(自分のフォルダ)の中になるTutorialFPS.Build.csを開いてModuleに

"GameplayAbilities", "GameplayTags", "GameplayTasks"

の3つを追加します。

using UnrealBuildTool;

public class MultiFPS : ModuleRules
{
	public MultiFPS(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "GameplayAbilities", "GameplayTags", "GameplayTasks" });
	}
}

次にCharacterBaseクラスにアビリティを実装します。

CharacterBase.h

#include "AbilitySystemInterface.h"

public IAbilitySystemInterfaceを追加します。

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "AbilitySystemInterface.h"
#include "CharacterBase.generated.h"

UCLASS()
class MULTIFPS_API ACharacterBase : public ACharacter, public IAbilitySystemInterface
{
	GENERATED_BODY()

public:
	// Sets default values for this character's properties
	ACharacterBase();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

	// BeginPlay, PossessedBy override
	virtual void PossessedBy(AController* NewController) override;

public:
	/** Ability system */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Abilities, meta = (AllowPrivateAccess = "true"))
	class UAbilitySystemComponent* AbilitySystem;
	UAbilitySystemComponent* GetAbilitySystemComponent() const
	{
		return AbilitySystem;
	};
	/** Ability list */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Abilities)
	TArray<TSubclassOf<class UGameplayAbility>> AbilityList;
};
CharacterBase.cpp
#include "AbilitySystemComponent.h"
#include "CharacterBase.h"

// Sets default values
ACharacterBase::ACharacterBase()
{
	// Ability system component
	AbilitySystem = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystem"));
}

// Called when the game starts or when spawned
void ACharacterBase::BeginPlay()
{
	Super::BeginPlay();
	if (AbilitySystem)
	{
		int32 inputID(0);
		if (HasAuthority() && AbilityList.Num() > 0)
		{
			for (auto Ability : AbilityList) {
				if (Ability)
				{
					AbilitySystem->GiveAbility(FGameplayAbilitySpec(Ability.GetDefaultObject(), 1, inputID++));
				}
			}
		}
		AbilitySystem->InitAbilityActorInfo(this, this);
	}
}

void ACharacterBase::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);

	AbilitySystem->RefreshAbilityActorInfo();
}

include時にエラーが出るときはbuild.csが間違っているか、問題ないときは一度uprojectを右クリックしてGenerate Visual Studio project filesを試してください。

次はGASを使用したジャンプを実装していきます。