UE4 Gameplay Ability System で2Dコンボ攻撃（1/2）導入編

#この記事の完成イメージ
![GAS_Sprite_04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/e0642e52-c029-0c41-1ea1-0e86d96c8147.gif)
[GAS導入後の実装編はこちら≫UE4 Gameplay Ability System で2Dコンボ攻撃（2/2）実装編](https://qiita.com/O_Y_G/items/70ae6f353d06de54d1c1)

#はじめに
Paper2DのPaperCharacterに、Gameplay Ability System (以下GAS)を導入し、コンボ攻撃の作り方を記事にしようと思います。

- 内容は下記記事を足し算して、Paper2D用に改変。
    - [GameplayAbilitiesの使い方(セットアップ編) - おかわりのアンリアルなメモ](https://okawari-hakumai.hatenablog.com/entry/2018/07/22/165242)
    - [[UE4]GameplayAbilitySystemでコンボ攻撃を作る｜株式会社ヒストリア](https://historia.co.jp/archives/15422/)
    - [UE4 BPプロジェクトに Gameplay Ability System を導入する方法 - Qiita](https://qiita.com/O_Y_G/items/700e03f3b60564af4161)
    - +Paper2D

という内容です。[おかわりはくまい様](https://okawari-hakumai.hatenablog.com/)、[株式会社ヒストリア様](https://historia.co.jp/)。情報共有感謝致します。

[≪Gameplay Ability Systemが何かについては、前記事を参照ください。](https://qiita.com/O_Y_G/items/700e03f3b60564af4161#%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-gameplay-abilities-%E3%81%A8%E3%81%AF)


#環境
バージョン　UE4 4.25.4
プロジェクト名：GAS_Sprite
Microsoft Visual Studio Community 2019
ブループリントテンプレートで、2Dサイドスクロール を作成したところから始めます。
![qiita_gas_101.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/2f90403a-190a-28d4-a7f6-454867969c84.jpeg)

#1. プラグインをオン
![qiita_gas_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/933e24be-96f1-982e-7e82-1a46ed61452d.jpeg)
【設定】＞【プラグイン】＞【ビルトイン】＞【Gameplay】＞【Gameplay Abilities】
プラグインをオンにして、エディタを再起動します。

#2. 新規C++クラス
![qiita_gas_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/81473a6c-0dcc-df6c-2321-cbda3bd1daae.jpeg)
再起動が完了したら、
フォルダ内のどこでもいいので、右クリックから、【新規C++クラス】をクリック。

![qiita_gas_102_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/8d3d9a2d-fa49-d4b3-12d6-719b24163cc3.jpeg)
【全てのクラスを表示】のチェックを入れる。
paperと検索し、【PaperCharacter】を選択。【次へ】

![qiita_gas_103_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/8cc218de-d317-7a07-862a-5161cd61b7b0.jpeg)
ファイル名を【GAS_PaperCharacter（任意）】で作成します。

![qiita_gas_104.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/e53856df-0f59-d8cf-b397-aee102fc520a.jpeg)
Visual Studioのライセンスが通っていれば、立ち上がると思います。

一旦UE4のエディタに戻ります。
![qiita_gas_105.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/8702ca5f-36d4-61aa-444d-9c8d71d1a49d.jpeg)
【C++クラス】というフォルダが増えていて、【GAS_Sprite（プロジェクト名）】のフォルダの中に、
白い帯の【GAS_PaperCharacter】がいるのを確認しておきます。

![qiita_gas_009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/f31c0acc-f04a-3ac1-f99d-e578be5d87bd.jpeg)
ここで重要な点として、
ファイルから<font color="Red">**【Visual Studio プロジェクトを更新】**</font>を押しておく必要があります。
この更新をすることで、プラグイン関連などの標準以外のシステムの紐づけがされるようです。
最初からC++プロジェクトで作成してる場合は、おそらく必要ありません。

#3. Visual Studio 編集
##GAS_Sprite.Build.cs
![qiita_gas_106.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/5711e90e-0f82-85b8-c9e7-1e8efa60a9e9.jpeg)

PublicDependencyModuleNames.AddRange の行に
```, "GameplayAbilities", "GameplayTags", "GameplayTasks"　```を追加する。
【GAS_BP】の部分は、プロジェクト名なので、プロジェクトによって置き換える必要があります。

```cs:GAS_Sprite.Build.cs

using UnrealBuildTool;

public class GAS_Sprite : ModuleRules
{
	public GAS_Sprite(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "GameplayAbilities", "GameplayTags", "GameplayTasks" });

		PrivateDependencyModuleNames.AddRange(new string[] {  });

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}
```

##GAS_PaperCharacter.h
全文載せときます。 よくわからない人はコピペしてください。

```cpp:GAS_PaperCharacter.h

#pragma once

#include "CoreMinimal.h"
#include "PaperCharacter.h"
#include "AbilitySystemInterface.h"
#include "GAS_PaperCharacter.generated.h"

UCLASS(config = Game)
class AGAS_PaperCharacter : public APaperCharacter, public IAbilitySystemInterface
{
	GENERATED_BODY()

public:
	AGAS_PaperCharacter();

	/** 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;

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

};
```
【GAS_PaperCharacter】は、別の名前で作成している場合は、置き換える必要があります。
不要な文字列がある場合は、ご指摘いただければと思います。

##GAS_PaperCharacter.cpp
全文載せておきます。よくわからない人はコピペしてください。

```cpp:GAS_PaperCharacter.cpp

#include "GAS_PaperCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "AbilitySystemComponent.h"

AGAS_PaperCharacter::AGAS_PaperCharacter()
{
	// ability system component
	AbilitySystem = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystem"));
}

void AGAS_PaperCharacter::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 AGAS_PaperCharacter::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);

	AbilitySystem->RefreshAbilityActorInfo();
}
```
【GAS_Character】は、別の名前で作成している場合は、置き換える必要があります。
不要な文字列がある場合は、ご指摘いただければと思います。

##C++プロジェクトビルド
![qiita_gas_107.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/bb2b3d38-d760-3016-5ff6-575225a830ba.jpeg)
ビルドから、【GAS_Spriteのビルド】を選び、今までの処理が間違っていなければ、正常終了すると思います。

![qiita_gas_108.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/848e48f3-ff00-f0e6-27f4-3bf27a892d55.jpeg)
エラーなどが出る場合は、どこか間違ったことをしている可能性があるので、
再度工程を確認し直してください。

エラー文など、日本語環境の初期状態だと文字化けするようなので、
下記サイトの工程を確認して、文字化けしないようにした方が良いかと思います。
> [UE4開発におけるコンソールログの文字化け対処法 | | シリコンスタジオTECHブログ｜Ideas](https://blog.siliconstudio.co.jp/2021/02/606/)

#4. GAS_PaperCharacterを継承
![qiita_gas_109.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/b688a9a3-9989-3a17-89f1-c79900305557.jpeg)
ブループリントの2DSideSclollerCharacterをダブルクリックして、開きます。

![qiita_gas_110.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/8e82e460-de0c-59aa-6571-059dd5ba1a37.jpeg)
【クラス設定】をクリックし、詳細欄の親クラスに、【GAS_PaperCharacter】を指定します。

プレイボタンを押して、今まで通りグレイマンが動けば、
Gameplay Ability System の導入の基本は、完了です。

#つづく
少し縦に長くなってきたので、導入編として、ここで一旦区切ります。
次の記事から、実装編を、進めていきます。

[**つづき≫UE4 Gameplay Ability System で2Dコンボ攻撃（2/2）実装編**](https://qiita.com/O_Y_G/items/70ae6f353d06de54d1c1)