- やあ
- 前回
- GameplayAbilityについて
- GameplayAbilityをAbilitySystemComponentに登録する
- 登録したGameplayAbilityを実行する方法
- 次回
やあ
今回から今まで散々出てきたGameplayAbility
について勉強していくよ。
間違いなどあれば教えてくださると助かります!
前回
GameplayAbilityについて
・アクターがゲーム内でできるアクションやスキルのこと!
例えば、銃を撃つや魔法を使う、全力疾走など。
・複数のGameplayAbility
を一度にアクティブにすることができる!
・BlueprintでもC++でも作れる!
GameplayAbilityの処理の流れ
Actor->AbilitySystemComponent->TryActivateAbility
: 指定されたアビリティのコストと要件をチェックして起動できるかどうか判定する。GameplayAbility->CanActivateAbility
: このアビリティがすぐに起動できるかチェック。
true -> 3
false -> 6GameplayAbility->ActivateAbility
: 実際にアビリティを起動する。GameplayAbility->CommitAbility
:GameplayEffect
を適用する前の最後のチェック。コストやクールダウンをチェックする。
true -> 5
false -> 6GameplayAbility->ApplyGameplayEffect
:GameplayEffect
を適用GameplayAbility->EndAbility
:OnEndAbility
を呼ぶ終了時の処理GameplayAbility->OnEndAbility
: BPイベントグラフで書かれた終了時の処理を呼び出す。- 終了。
実際には、任意の処理の間でAbility Task
を呼び出せるよ。
Tags
GameplayAbility
に付属する、ロジックが組み込まれたGamepalyTagContainers
GameplayTagContainer |
説明 |
---|---|
Ability Tags |
GameplayAbility 自体が持つGameplayTags 、これらのタグ自体が何かをするのではなくて、どのタグを持つかを説明するためにある。 |
Cancel Abilities With Tag |
このGameplayAbility を起動したとき、これらのタグがAbility Tags に含まれる他のGameplayAbility はキャンセルされる。 |
Block Abilities with Tag |
このGameplayAbility が実行中、これらのタグがAbility Tags に含まれる他のGameplayAbility の実行をブロックする。 |
Activation Owned Tags |
このGameplayAbility が実行中、これらのタグをGameplayAbility のオーナーに与えられます。 |
Activation Required Tags |
これらのGameplayTags をこのGameplayAbility のオーナーがすべて持っているなら起動できる。 |
Activation Blocked Tags |
これらのGameplayTags をこのGameplayAbility のオーナーがひとつも持っていないなら起動できる。 |
Source Required Tags |
(Activation Required Tags と何が違うのかわかってません。) |
Source Blocked Tags |
(Activation Blocked Tags と何が違うのかわかってません。) |
Target Required Tags |
(Activation Required Tags と何が違うのかわかってません。) |
Target Blocked Tags |
(Activation Blocked Tags と何が違うのかわかってません。) |
Input
よくわかってません。
Replicate Input Directory
: 入力のPress
とRelease
イベントが常にサーバーに複製される。(?)
Advanced
Replication Policy
・よくわからない。
・将来的にこのオプションは削除されるらしい。
Instancing Policy
Instancing Policy |
説明 |
---|---|
Non-Instanced |
GameplayAbility はClassDefaultObject 上で動作します。インスタンスは作成されません。 |
Instanced Per Actor |
各アクターがこのGameplayAbility のインスタンスを一つ持つ。 |
Instanced Per Execution |
このGameplayAbility が起動するたびに、新しいインスタンスが作成される。 |
Server Respects Remote Ability Cancellation
よくわからないけど、無効にしておいたほうがいいらしい。
Retrigger Instanced Ability
もしtrueの場合、すでにアクティブになっているインスタンスのアビリティを起動しようとしている場合は、それを終了して再起動します。
Net Execute Policy
Net Execute Policy |
説明 |
---|---|
Local Predicted |
最初にクライアントで起動し、次にサーバーで起動する。 |
Local Only |
クライアント上でのみ起動される。マルチプレイヤーゲームで使用する。 |
Server Initiated |
最初にサーバーで起動し、次にクライアントで起動する。 |
Server Only |
サーバー上でのみ起動される。シングルプレイヤーで使用する。 |
Net Security Policy
Net Security Policy |
説明 |
---|---|
Client Or Server |
セキュリティなし。クライアントまたはサーバーは、この能力の実行と終了を自由にトリガーすることができます。 |
Server Only Execution |
クライアントからのアビリティ実行のリクエストは無視される。キャンセルまたは終了のリクエストのみ認められる。 |
Server Only Termination |
クライアントからのアビリティ実行のリクエストのみ認められる。 |
Server Only |
サーバーでのみ処理される。クライアントからのリクエストはすべて無視される。 |
GameplayAbilityをAbilitySystemComponentに登録する
登録されたGameplayAbility
は自由に実行できるよ
実際にGameplayAbilityを登録してみる
このあたりの詳細な説明はPart.1でやっているので、Part.1を読んだ方は飛ばしてね。
また、読んでいない方もPart.1から見ることをおすすめするよ。
AbilitySystemComponentについて
・GameplayAbilitySystem
を使う上で、なくてはならないコンポーネント!
・GameplayAbilities
を使用したり、Attributes
を持っていたり、GameplayEffect
を受け取ったりしたいアクターは必ず、AbilitySystemComponent
を持っていないといけないよ。
・これを使うアクターはAbilitySystemInteracter
を継承する必要があるよ。
AbilitySystemComponentを持ったキャラクターの作成
CharacterBase.h
に追加
// Copyright(C)write by pto8913. 2020. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "AbilitySystemInterface.h" #include "CharacterBase.generated.h" class UAbilitySystemComponent; UCLASS() class ABILITYTEST_API ACharacterBase : public ACharacter, public IAbilitySystemInterface { GENERATED_UCLASS_BODY() public: // Begin Init UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Ability") UAbilitySystemComponent* AbilitySystemComp; /* Implement IAbilitySystemInterface */ UAbilitySystemComponent* GetAbilitySystemComponent() const override; // End Init };
CharacterBase.cpp
に追加
// Copyright(C)write by pto8913. 2020. All Rights Reserved. #include "Abilities/Characters/Bases/CharacterBase.h" #include "AbilitySystemComponent.h" ///////////////////////////////////////// // Init ACharacterBase::ACharacterBase(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { AbilitySystemComp = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilityComp")); } UAbilitySystemComponent* ACharacterBase::GetAbilitySystemComponent() const { return AbilitySystemComp; }
アビリティをキャラクターに持たせる
どのアビリティを持たせるかは、Blueprint上で設定する。
CharacterBase.h
に追加
class UGameplayAbility; public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ability") TArray<TSubclassOf<UGameplayAbility>> GameplayAbilities;
AbillitySystemComponentに登録する
CharacterBase.h
に追加
public: virtual void PossessedBy(AController* NewController) override; void AddStartupGameplayAbilities(); protected: UPROPERTY(EditAnywhere, Replicated, Category = "Ability") int32 ExistsLevel = 1; UPROPERTY() int32 bAbilitiesInitialzied;
CharacterBase.cpp
に追加
void ACharacterBase::PossessedBy(AController* NewController) { Super::PossessedBy(NewController); if (IsValid(AbilitySystemComp) == true) { AbilitySystemComp->InitAbilityActorInfo(this, this); AddStartupGameplayAbilities(); } } void ACharacterBase::AddStartupGameplayAbilities() { if (IsValid(AbilitySystemComp) == true) { for (TSubclassOf<UGameplayAbility>& StartupAbility : GameplayAbilities) { AbilitySystemComp->GiveAbility(FGameplayAbilitySpec(StartupAbility, ExistsLevel, INDEX_NONE, this)); } bAbilitiesInitialized = true; } }
登録したGameplayAbilityを実行する方法
アビリティを実行する方法は、4つあります。
・GameplayTag
を使う方法。
・GameplayAbilityClass
を使う方法。
・GameplayAbilitySpecHandle
を使う方法。(C++)
・イベント。
イベントによってアビリティを実行するとイベントと一緒にたくさんの情報を渡すことができる!
GameplayTagを使って実行してみる
もしかしたらPart2~3.5を読んでいない方がいるかもしれないので、
GameplayAbility
を呼び出したら画面に文字を表示するだけにするよ。
適当なGameplayAbilityを作成(GA_CalledByTag)
AbilitySystemComponentに登録しないで実行してみる
詳細タブのGameplayAbilities
にGA_CalledByTag
を設定していないね。
登録していない状態でのテスト(GameplayTag)
アビリティを実行しようとしても、AbilitySystemComponent
に登録していないから実行できないね。
登録してテスト(GameplayTag)
できてるね。
アビリティを登録することの大事さが分かったかな。
(ところでなぜ二回呼ばれているのでしょうか...)
GameplayAbilityClassを使って実行してみる
・一番使われるんじゃないかな?
知らんけど。
・もしかしたらPart2~3.5を読んでいない方がいるかもしれないので、
GameplayAbility
を呼び出したら画面に文字を表示するだけにするよ。
適当なGameplayAbilityを作成
GameplayAbilityの登録
テスト(GameplayAbilityClass)
GameplayAbilitySpecHandleを使って実行してみる
・GameplayAbility
をAbilitySystemComponent
に登録するときに、そのアクターに適用したいバフ(HPリジェネとか)があるときに使うのがよさそう。
・もしかしたらPart2~3.5を読んでいない方がいるかもしれないので、
GameplayAbility
を呼び出したら画面に文字を表示するだけにするよ。
CharacterBase.h
に追加
public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Ability") TArray<TSubclassOf<UGameplayAbility>> PassiveGameplayAbilities;
CharacterBase.cpp
に追加
void ACharacterBase::AddStartupGameplayAbilities() { if (IsValid(AbilitySystemComp) == true) { for (TSubclassOf<UGameplayAbility>& PassiveAbility : PassiveGameplayAbilities) { FGameplayAbilitySpec Spec = FGameplayAbilitySpec(PassiveAbility, ExistsLevel, INDEX_NONE, this); AbilitySystemComp->GiveAbilityAndActivateOnce(Spec); } bAbilitiesInitialized = true; } }
適当なGameplayAbilityを作成
GameplayAbilityの登録
テスト(GameplayAbilitySpecHandle)
ゲーム開始時に文字が表示されてるね。
イベントで実行してみる
・AbilitySystemBlueprintLibrary::SendGameplayEventToActor(AActor* Actor, FGameplayTag EventTag, FGameplayEventData Payload)
を使う。
BPからでもC++からでも使えるよ。
注意:アクターはIAbilitySystemInterface
を実装している必要があります。
今回は、敵にプレイヤーが敵にぶつかったら、ぶつかった敵の名前を表示するだけにするよ。
BPから使う場合
敵を作る
CharacterBase
のサブクラスBP_Enemy
を作成。
とくにやることはないよ。
GameplayEventを受け取るGameplayAbility(GA_GetEventData)を作成
赤枠のタグでイベントを受け取るかを決めるので、超大事。
最初の呼び出し
これであってるのかわからない。。
ヒット時にイベントデータを送る
赤枠のタグでイベントを送るので、受け取り側と同じにする必要があるよ。超大事
テスト(イベント、BP版)
ちょっと見づらいけどうまくいってるね。
C++から使う方法
について書こうと思ったんだけど、C++で同じ処理を書いても呼び出されないから諦めたよ。
分かる方いたら教えてください。
今回はここまで、ありがとうございました。