#はじめに
C++プロジェクトに、Gameplay Ability System (以下GASと略します) を導入する方法は、
おかわりはくまいさんのブログを参照するのが、ベストな選択肢だと思います。
ブループリントで作成したプロジェクトに、
GASを導入したくなった時用の方法を、残しておこうと思います。(備忘録)
また、筆者はプログラミングの素人です。間違いを見つけたら、ご指摘ください。
#プラグイン Gameplay Abilities とは
詳しくは公式のドキュメントを確認していただければと思いますが、
自分の認識としては、**「オンラインゲームを作る上で、特に重要なシステムらしい」**という認識です。
実際に使っているプロのプログラマの方の講演で、
なぜGASを使うのかという内容の動画が、とても分かりやすいと思いました。
Using the Gameplay Ability System | Unreal Fest Europe 2019 | Unreal Engine
(字幕読むのがしんどい方には、「CaptionSpeaker」をお勧めします。chrome extension)
初心者が扱うには、少し難しいと思いますが、
オンラインゲームを作るつもりの方は、検討する必要があると思います。
フォートナイトでも使われているシステムです。
#環境
バージョン UE4 4.25.4
ブループリントでサードパーソンプロジェクトを作成したところから始めます。
プロジェクト名:GAS_BP
Microsoft Visual Studio Community 2019
#1. プラグインをオンに
【設定】>【プラグイン】>【ビルトイン】>【Gameplay】>【Gameplay Abilities】
プラグインをオンにして、エディタを再起動します。
#2. 新規C++クラス
再起動が完了したら、
フォルダ内のどこでもいいので、右クリックから、【新規C++クラス】をクリック。
ファイル名【GAS_Character(任意)】として、クラスを作成。
Microsoft Visual Studio がインストールしてあり、ライセンスが通っていれば、
Visual Studioが立ち上がると思います。
うまく立ち上がらない場合は、Visual Studio の Professional や Community や Code など種類がややこしいので、下記サイトでの説明を見ながら、よくわからない場合はCommunityを使う形が良いのかなと思います。
Visual Studioが立ち上がり、
GAS_Character.cpp と GAS_Character.h が開いたという前提で進めていきます。
一旦UE4のエディタに戻ると、
【C++クラス】というフォルダが増えていて、【GAS_BP(プロジェクト名)】のフォルダの中に、
白い帯の【GAS_Character】がいるのを確認しておきます。
ブループリントでプロジェクトを作った後でも、C++クラスを作成する事で、
後付けでC++プロジェクト(?)として扱えるようになります。
Visual Studioを閉じて、開き方が分からない場合は、
このGAS_Characterをダブルクリックで、開くこともできます。
プロジェクト作成時に、C++ではなく、ブループリントでプロジェクトを作った場合は、
ファイルから【Visual Studio プロジェクトを更新】を押しておく必要があります。
この更新をすることで、プラグイン関連などの標準以外のシステムの紐づけがされるようです。
#3. Visual Studio 編集
##GAS_BP.Build.cs
【GAS_BP.Build.cs】をダブルクリック。
PublicDependencyModuleNames.AddRange(new stringの行に , "GameplayAbilities" を追加する。
, "GameplayAbilities"
下記に追加後の中身を置いておきます。【GAS_BP】の部分は、プロジェクト名なので、プロジェクトによって置き換える必要があります。
using UnrealBuildTool;
public class GAS_BP : ModuleRules
{
public GAS_BP(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "GameplayAbilities" });
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_Character.h
部分的な修正のというわけにいかなかったので、全文載せときます。
よくわからない人はコピペしてください。
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "AbilitySystemInterface.h"
#include "GAS_Character.generated.h"
UCLASS(config = Game)
class AGAS_Character : public ACharacter, public IAbilitySystemInterface
{
GENERATED_BODY()
public:
AGAS_Character();
/** 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_Character】は、別の名前で作成している場合は、置き換える必要があります。
不要な文字列がある場合は、ご指摘いただければと思います。
##GAS_Character.cpp
こちらも、全文載せておきます。
よくわからない人はコピペしてください。
#include "GAS_Character.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "AbilitySystemComponent.h"
AGAS_Character::AGAS_Character()
{
// ability system component
AbilitySystem = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystem"));
}
void AGAS_Character::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_Character::PossessedBy(AController* NewController)
{
Super::PossessedBy(NewController);
AbilitySystem->RefreshAbilityActorInfo();
}
【GAS_Character】は、別の名前で作成している場合は、置き換える必要があります。
不要な文字列がある場合は、ご指摘いただければと思います。
##C++プロジェクトビルド
ビルドから、【GAS_BPのビルド】を選び、今までの処理が間違っていなければ、正常終了すると思います。
エラーなどが出る場合は、どこか間違ったことをしている可能性があるので、
再度工程を確認し直してください。
エラー文など、日本語環境の初期状態だと文字化けするようなので、
下記サイトの工程を確認して、文字化けしないようにした方が良いかと思います。
#4. グレイマンにGAS_Characterを継承
ブループリントのThirdPersonCharacterをダブルクリックして、開きます。
【クラス設定】をクリックし、詳細欄の親クラスに、【GAS_Character】を指定します。
プレイボタンを押して、今まで通りグレイマンが動けば、
Gameplay Ability System の導入としては、完了です。
で?
ここまで出来たら、
GameplayAbilitiesの使い方(アビリティ編) - おかわりのアンリアルなメモ
GameplayAbilitiesの使い方(アトリビュートセット・エフェクト編) - おかわりのアンリアルなメモ
GameplayAbilitiesの使い方(タスク編) - おかわりのアンリアルなメモ
[UE4]GameplayAbilitySystemでコンボ攻撃を作る|株式会社ヒストリア
[UE4]GameplayAbilitySystemで「スタミナ」を作る|株式会社ヒストリア
導入後の使い方の記事に目を通していくといいと思います。
#ソースファイル
GitHub上にこの記事の工程を済ませた、データを置いておくので、
どうしてもうまくいかない場合など、確認してみてください。
https://github.com/O-Y-G/GAS_BP
#参考資料まとめ
-
公式ドキュメント
-
YouTube Unreal Engine 公式
-
GAS情報まとめ
-
ブログ
-
YouTube
-
Udemy
-
Twitter
-
Sample Project
貴重な情報共有ありがとうございます!
#おわりに
Gameplay Ability System の記事や講演は、ことごとくC++プロジェクトでの作成になっていたため、
インプットやキャラクターの動作まで、C++で書かれると、なんもわからん自分向けに、
C++の部分を最小限にしたいと検証した結果になります。
昔に比べると、GASの情報が増えてきたと思いますが、初心者が扱うには、まだ難しい点が多いので、
なんとかうまく情報共有していければなと思います。
Qiita記事を書くに当たって、こちらの表記方法を参考にさせていただきました。
Qiita Markdown 書き方 まとめ @shizuma
ありがとうございます!
こちらに続きます。
UE4 Gameplay Ability System で2Dコンボ攻撃(1/2)導入編
UE4 Gameplay Ability System で2Dコンボ攻撃(2/2)実装編