愛をもってゲームをつくるゴリラのブログ

UE4初心者のゴリラがいろいろ頑張ります。

GameplayAbility - GameplayAbility と コンポーネント の準備編

こんばんは、ごりです。
今日は、こちらの記事の続きからです。
goolee.hatenablog.com

今回は、実際に使う GameplayAbility と Component のクラスを作っていきます。

f:id:m-goolee-y:20181129224335p:plain

コンテンツブラウザの 新規C++クラスをクリック。
全てのクラスを表示にチェックし、 GameplayAbility と打ちます。

f:id:m-goolee-y:20181201182725p:plain

GameplayAbility を選択し、次へ。
ファイル名は 「GameplayAbilityBase」 とします。

続いて、新規C++クラスから 「AbilitySystemComponent」と打ちます。
ファイル名は 「AbilitySystemComponentBase 」とします。

f:id:m-goolee-y:20181201183413p:plain

作成が終わったら、
Component に処理を追加していきます。
今回もソースコードを記述します。

まず AbilitySystemComponentBase.h

/**
*@file	 AbilitySystemComponentBase.h
*@brief  GameplayAbility を用いるためのComponent
*@author goolee
*@date	 2018/12/01
*/
#pragma once

#include "CoreMinimal.h"
#include "AbilitySystemComponent.h"
#include "GameplayTagContainer.h"
#include "AbilitySystemComponentBase.generated.h"

class UGameplayAbilityBase;

/**
 * GameplayAbility を扱う Component 
 * ゲーム中に指定したデータを扱うために、AbilitySystemComponent を拡張
 */
UCLASS()
class GPASTUDY_API UAbilitySystemComponentBase : public UAbilitySystemComponent
{
	GENERATED_BODY()
	
public:

	/**
	 *@fn
	 *コンストラクタ
	 */
	UAbilitySystemComponentBase();

	/**
         *@fn
         *現在実行中の Ability の中から指定した GameplayTag と一致するものすべて取得
         *@param  (GameplayTagContainer) 指定するGameplayTagの集まり
         *@return (ActiveAbilities) 指定したタグと一致したAbility
         */
	void GetActiveAbilitiesWithTags( const FGameplayTagContainer& GameplayTagContainer, TArray<UGameplayAbilityBase*>& ActiveAbilities );
	
	
};

つづいて AbilitySystemComponent.cpp

#include "AbilitySystemComponentBase.h"
#include "GameplayAbilityBase.h"

UAbilitySystemComponentBase::UAbilitySystemComponentBase() {}

void UAbilitySystemComponentBase::GetActiveAbilitiesWithTags(const FGameplayTagContainer& GameplayTagContainer, TArray<UGameplayAbilityBase*>& ActiveAbilities) {

	TArray<FGameplayAbilitySpec*> AbilitiesToActivate;
	GetActivatableGameplayAbilitySpecsByAllMatchingTags( GameplayTagContainer, AbilitiesToActivate, false );

	// Iterate the list of all ability specs
	for (FGameplayAbilitySpec* Spec : AbilitiesToActivate)
	{
		// Iterate all instances on this ability spec
		TArray<UGameplayAbility*> AbilityInstances = Spec->GetAbilityInstances();

		for (UGameplayAbility* ActiveAbility : AbilityInstances)
		{
			ActiveAbilities.Add(Cast<UGameplayAbilityBase>(ActiveAbility));
		}
	}
}

GameplayAbilityBase には今回は処理を追加しません。

ではこのComponentとAbility をキャラクターに持たせて、
GameplayAbilityを使えるようにしていきます。

CharacterBase.h と CharacterBase.cpp です。

/**
*@file	 CharacterBase.h
*@brief  GameplayAbility を用いる キャラクターの基底クラス
*@author goolee
*@date	 2018/12/01
*/
#pragma once

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

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

public:
	
	/**
	 * @fn
	 * コンストラクタ
	 */
	ACharacterBase();

  /**
	 *@fn
	 *コントローラ所有された際の処理
	 *@param このキャラクターを所有するコントローラ
	 *
	 *前回、この処理書いてなかったです、すみません。
	 */
	virtual void PossessedBy(AController* NewController) override;

protected:

	/**
	 * GameplayAbilityを扱うコンポーネント
	 */
	UPROPERTY()
	UAbilitySystemComponentBase* AbilitySystem;

	/**
	 * キャラクターのステータス 
	 * ブループリントから呼び出しはできないが、
	 * ガベージコレクションに追加するため UPROPERTY() を記述
	 */
	UPROPERTY()
	UAttributeSetBase* AttributeSet;

	/**
	 *キャラクター生成時から実行可能なAbility
	 */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Abilities")
	TArray<TSubclassOf<UGameplayAbilityBase>> Abilities;

	/**
	 * @fn
	 * ゲーム開始時や、生成時に呼ばれる処理
	 */
	virtual void BeginPlay() override;

	/**
	 * @fn
	 * キャラクターの体力を取得
	 * @return キャラクターの体力
	 */
	UFUNCTION(BlueprintCallable)
	virtual float GetHealth() const;

public:	

	/**
	 * @fn
	 * 毎フレーム呼ばれる処理
	 */
	virtual void Tick(float DeltaTime) override;

	/**
	 *@fn
	 *AbilitySystemComponentを取得
	 *@return AbilitySystemComponent
	 */
	UAbilitySystemComponent* GetAbilitySystemComponent() const override;

	/**
	 *@fn
	 *指定したタグと一致するAbilityを実行
	 *@param  (AbilityTags)				実行するAilityがもつGameplayTag
	 *@param  (bAllowRemoteActivation)	true...ローカル/サーバーで実行 false...ローカルでのみ実行
	 *@return true...実行に成功 false...失敗
	 */
	UFUNCTION(BlueprintCallable, Category = "Abilities")
	bool ActivateAbilitiesWithTags(FGameplayTagContainer AbilityTags, bool bAllowRemoteActivation = true);

	/**
	*@fn
	*キャラクターが現在実行中の Ability の中から指定した GameplayTag と一致するものすべて取得
	*@param  (AbilityTags)     指定するGameplayTagの集まり
	*@return (ActiveAbilities) 指定したタグと一致したAbility
	*/
	UFUNCTION(BlueprintCallable, Category = "Abilities")
	void GetActivateAbilitiesWithTags( FGameplayTagContainer AbilityTags, TArray<UGameplayAbilityBase*>& ActiveAbilities);

};
#include "CharacterBase.h"
#include "GameplayAbilityBase.h"


ACharacterBase::ACharacterBase(){
    //trueにすると毎フレームTick関数を呼び出す設定
	PrimaryActorTick.bCanEverTick = true;
	
	//AbilitySystemConponentの生成
	AbilitySystem = CreateDefaultSubobject<UAbilitySystemComponentBase>(TEXT("AbilitySystem"));
	//マルチプレイヤー用の設定
	AbilitySystem->SetIsReplicated(true);

	//AttributeSet の生成
	AttributeSet = CreateDefaultSubobject<UAttributeSetBase>(TEXT("AttributeSet"));
}

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

	if (AbilitySystem) {
		//AbilitySytemを持つ Actor情報と このAbilitySystemで動く Actor情報の初期化 
		AbilitySystem->InitAbilityActorInfo(this, this);
	}
}

void ACharacterBase::BeginPlay() {

	Super::BeginPlay();
	
	/**
	 * AbilitySytemに使えるAbilityを登録
	 * これをしないとTagでAbilityを指定しても実行されない。
	 */
	if (AbilitySystem) {
		for (auto Ability : Abilities) {
			AbilitySystem->GiveAbility(FGameplayAbilitySpec(Ability, 1, INDEX_NONE, this));
		}
	}

}

void ACharacterBase::Tick(float DeltaTime){

	Super::Tick(DeltaTime);

}

float ACharacterBase::GetHealth() const {
	return AttributeSet->GetHealth();
}

UAbilitySystemComponent* ACharacterBase::GetAbilitySystemComponent() const {
	return AbilitySystem;
}

bool ACharacterBase::ActivateAbilitiesWithTags(FGameplayTagContainer AbilityTags, bool bAllowRemoteActivation) {

	if (AbilitySystem) {
		return AbilitySystem->TryActivateAbilitiesByTag( AbilityTags, bAllowRemoteActivation );
	}
	return false;

}

void ACharacterBase::GetActivateAbilitiesWithTags(FGameplayTagContainer AbilityTags, TArray<UGameplayAbilityBase*>& ActiveAbilities) {
	
	if (AbilitySystem) {
		AbilitySystem->GetActiveAbilitiesWithTags( AbilityTags, ActiveAbilities );
	}

}

ここまで出来たら、ビルドして BP_CharacterBase を見てみましょう。
コンポーネントに AbilitySystemが追加され、
f:id:m-goolee-y:20181201195815p:plain

デフォルトの詳細に、Abilitiesが増えているのがわかりますね。
f:id:m-goolee-y:20181201200113p:plain

これで GameplayAbilityを使う準備は整いました。

次回から使い方を書いていきたいと思います。
その都度、機能拡張をしていきます。

ソースコードのコメントに、説明書きましたが、
不明な点があれば、ご連絡ください。

ではでは。




GameplayAbility - AttributeSet の準備編

こんばんは、ごりです。

今日はこちらの記事の続きからです。
goolee.hatenablog.com


今回は GameplayAbility を使う上で必要となってくるパラメータをまとめたクラスの準備をしていきます。
UE4サンプルの ActionRPG では キャラクターのステータスとして使っています。

前回作成した GPAStudy プロジェクトを起動して、 新規C++クラスを追加します。
f:id:m-goolee-y:20181129224335p:plain

右上の 全てのクラスを表示にチェックをして AttributeSet と検索します。

f:id:m-goolee-y:20181201000909p:plain

「AttributeSet」を選択して次へをクリック。

ファイル名は 「AttributeSetBase」 とします。
今回はソースコードを記述していきます。
説明はコメントで省略いたします。
まず AttributeSetBase.h です。

/**
*@file	 AttributeSetBase.h
*@brief  GameplayAbility で用いるパラメータの集合
*@author goolee
*@date	 2018/12/01
*/
#pragma once

#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "AttributeSetBase.generated.h"

/** 
 *  @def
 *  AttributeSet.h で定義されている
 *  Attribute への Setter, Getter を定義するためのマクロ
 */
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)

/**
 * @class
 * GameplayAbilityで用いるキャラクターのパラメータをまとめたクラス
 */
UCLASS()
class GPASTUDY_API UAttributeSetBase : public UAttributeSet
{
	GENERATED_BODY()
	
public:

	/**
	 * @fn
	 * コンストラクタ
	 */
	UAttributeSetBase();

	/**
	 * Blueprintから読み取り可能な キャラクターの体力を表す変数
	 * マクロで Setter,Getterを定義しているので、 SetHealth(), GetHealth()が呼び出し可能
	 */
	UPROPERTY(BlueprintReadOnly, Category="Health", ReplicatedUsing = OnRep_Health)
	FGameplayAttributeData Health;
	ATTRIBUTE_ACCESSORS( UAttributeSetBase, Health )

	/**
	 * @fn
	 * レプリケートされるAttributeSetの変数を取得する
	 * @brief  この関数の中で DOREPLIFTIME マクロを用いてレプリケートされた変数として追加する
	 * @return (OutLifeTimeProps) 
	 */
	virtual void GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps ) const override;

protected:

	/**
	 * @fn
	 * Healthの値が変更された際に呼び出される処理
	 */
	UFUNCTION()
	virtual void OnRep_Health();
};

つづいて、 AttributSet.cpp です。

#include "AttributeSetBase.h"
#include "Net/UnrealNetwork.h"

UAttributeSetBase::UAttributeSetBase() : Health(10.0f){
}

void UAttributeSetBase::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const {
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	DOREPLIFETIME( UAttributeSetBase, Health );
}

void UAttributeSetBase::OnRep_Health() {
	GAMEPLAYATTRIBUTE_REPNOTIFY(UAttributeSetBase, Health);
}

GetLifetimeReplicatedProps() と OnRepHealth() は マルチプレイヤーゲームを
作る際に必要となる処理です。
ブログを読んでいる方でマルチプレイヤーゲームを作りたい方は
こちらを記述してください。
そうでない方は、この二つの関数を記述していなくても大丈夫です。
間違ってたら連絡ください...

ではこのAttributeSetをキャラクターに持たせていきます。
前回作成した CharacterBase クラスに書いていきます。
まず CharacterBase.h です。

/**
*@file	 CharacterBase.h
*@brief  GameplayAbility を用いる キャラクターの基底クラス
*@author goolee
*@date	 2018/12/01
*/
#pragma once

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

UCLASS()
class GPASTUDY_API ACharacterBase : public ACharacter
{
	GENERATED_BODY()

public:
	
	/**
	 * @fn
	 * コンストラクタ
	 */
	ACharacterBase();

protected:

	/**
	 * キャラクターのステータス 
	 * ブループリントから呼び出しはできないが、
	 * ガベージコレクションに追加するため UPROPERTY() を記述
	 */
	UPROPERTY()
	UAttributeSetBase* AttributeSet;

	/**
	 * @fn
	 * ゲーム開始時や、生成時に呼ばれる処理
	 */
	virtual void BeginPlay() override;

	/**
	 * @fn
	 * キャラクターの体力を取得
	 *@return キャラクターの体力
	 */
  UFUNCTION(BlueprintCallable)
	virtual float GetHealth() const;

public:	

	/**
	 * @fn
	 * 毎フレーム呼ばれる処理
	 */
	virtual void Tick(float DeltaTime) override;

};

キャラクターに AttributeSetBase 型の変数と 
AttributeSet内の体力を取得する関数を宣言しました。

つづいて CharacterBase.cpp です。

#include "CharacterBase.h"

ACharacterBase::ACharacterBase()
{
    //trueにすると毎フレームTick関数を呼び出す設定
	PrimaryActorTick.bCanEverTick = true;

	//AttributeSet の生成
	AttributeSet = CreateDefaultSubobject<UAttributeSetBase>(TEXT("AttributeSet"));
}

void ACharacterBase::BeginPlay()
{
	Super::BeginPlay();
	
}

void ACharacterBase::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

float ACharacterBase::GetHealth() const {
	return AttributeSet->GetHealth();
}

今回ソースコードに追加するのはここまでです。
ここまで書いたらビルドしてプロジェクトに戻ってください。

コンテンツブラウザの C++クラスフォルダ内の CharacterBase を右クリックして
「CharacterBaseに基づくブループリントクラスを作成します」をクリック。
名前は 「BP_CharacterBase」とします。
フォルダは わかりやすくコンテンツ直下にします。

f:id:m-goolee-y:20181201021037p:plain

作成されると、BP_CharacterBaseが開かれると思います。
イベントグラフで 右クリックして GetHealth と打ってみましょう。

f:id:m-goolee-y:20181201022000p:plain

無事にでてきましたね。

BeginPlay から printString で 値の確認をしてみましょう。

f:id:m-goolee-y:20181201022119p:plain

起動時の ThirdPersonExampleMap に追加して、実行してみます。

f:id:m-goolee-y:20181201022354p:plain

上の写真のように表示されればOKです。


これでAttributeSetの準備が完了しました。
今回はここまでとします。

次回からは GameplayAbility を使うためのコンポーネントを準備していきます。

今日の内容でわからないことがあればご連絡ください。

ではでは。

GameplayAbility のための準備はじめました。

こんばんは、ごりです。

これからは、GameplayAbilityの使い方を色々な機能を作って
説明していきたいと思います。

今回は GameplayAbility を使うためのプロジェクトの準備をしていきます。

まず作成から。

f:id:m-goolee-y:20181129221106p:plain

C++の Thirdpersonテンプレートプロジェクトを作成してください。

プロジェクト名はなんでもいいですが今回は「 GPAStudy 」 とします。

f:id:m-goolee-y:20181129222123p:plain
プロジェクトを作成したら、GameplayAbilitySystemプラグインを有効にします。


以前はエンジンの機能に含まれていたみたいですが、

現在は Pluginとして機能が用意されています。

有効にしてプロジェクトを再起動します。

 
再起動後は,プロジェクトの Source/GPAStudy にある、 

「GPAStudy.Build.cs」を編集します。

f:id:m-goolee-y:20181129222455p:plain

これはプロジェクトビルド時にビルドするモジュールを設定するためのファイルです。

GamplayAbilities のモジュールがビルドされるように

PublicDependencyModuleNames.AddRange の下に 
 以下のソースコードを追加してください。

PrivateDependencyModuleNames.AddRange(new string[] { "GameplayAbilities", "GameplayTags", "GameplayTasks"}); 

モジュールの設定が終わったら、最後にGameplayAbility を使うキャラクターの基底クラスを作成します。
コンテンツブラウザの新規追加から、新規C++クラスをクリックし、
f:id:m-goolee-y:20181129224335p:plain

親クラスに Character を選択したら 次へ をクリックします。
f:id:m-goolee-y:20181129224523p:plain

ファイル名は 「CharacterBase」とします。
クラスを作成をクリックするとコンパイルが始まります。

コンパイルが完了すると コンテンツブラウザの C++ クラスフォルダに CharacterBaseが追加されていますね。
f:id:m-goolee-y:20181129225133p:plain

今回はここまでにします。
何か質問ありましたらご連絡ください。

次回、CharacterBase に AttributeSet を追加していきます。
その時に、AttributeSet についても説明いたします。

ではでは。

GameplayEffect - その5 Display 編

こんばんは、ごりです。

 

goolee.hatenablog.com

 

こちらの記事の続きを書いていきます。

今回でGameplayEffect の説明ラストになります。

f:id:m-goolee-y:20181128223826p:plain

最後に説明する項目は Display です。

このEffectが適用された時の見た目の設定部分になります。

 

  • Require Modifier Success to Trigger Cues
    このフラグが true だとこのEffectの適用が成功した時にCue が実行されます。
    デフォルトでは true です。
  • Suppress Stacking Cues
    このフラグが true だとスタックされるEffectは
    1つ目だけCueが実行されます。
    デフォルトでは false です。
  • Gameplay Cues
    このEffectで実行されるCue をここに設定します。

    Magnitude Attribute : ここで指定したAttributeSet の値をもとにCueの大きさを設定します。未指定の場合は、下記のレベルを参照します。

    Min Level : Cueの最小レベル

    Max Level : Cueの最大レベル

    Gameplay Cue Tags :  ここで設定したタグと一致する
                                         GameplayCueを実行します。
  • UIData
    このエフェクトをUIで表現するためのデータを設定できます。
    サンプルとして、UGameplayEffectUIData  クラスを継承した
    Gameplay Effect UI Data Text Only クラスが用意されています。

 

以上が Display の説明となります。

間違っている点や質問等ありましたら、連絡していただけると幸いです。

 

さて、5回にわたって GameplayEffect の説明をしてきましたが、AttributeSet や GameplayCue といった説明していない機能もあります。

今後そちらの記事も書いていきたいと思います。

 

ではでは。

 

 

GameplayEffect - その4 Immunity と Granted Abilities 編

こんばんは、ごりです。
 

goolee.hatenablog.com

 

今日はこちらの記事の続きから書いていきます。

ImmunityとGranted Abilities についてです。

まずはImmunity から。

f:id:m-goolee-y:20181127212449p:plain

  • GrantedApplicationImmunityTags
    GrantedTagsのAddedにタグが設定されているGameplayEffect に対して

    Requires Tags : ここで指定したタグが含まれている場合適用されない。

    Ignore Tags : ここで指定したタグが含まれていない場合適用されない。

  • Granted Application immunity Query

    Owning Tag Query : このGameplayEffect が与えるタグに対して適用できるかどうかの計算式を設定できる。 

    Effect Tag Query : このGameplayEffect が持つタグに対して適用できるかどうかの計算式を設定できる。

    Source Tag Query : このGameplayEffect の発生源が持つタグに対して適用可能かどうかの計算式を設定できる。

    Modifying Attribute : ここで指定されたAttributeSetの値を変更しようとするGameplayEffectは適用されない

    Effect Source : ここで指定したオブジェクトがGameplayEffectの発生源のGameplayEffectは適用されない。

    Effect Deefinition : このEffectが適用中はここで指定したGameplayEffect は適用されない。

 

つづいて Granted Abilitiesについて。

f:id:m-goolee-y:20181127212537p:plain

  • Ability
    このEffectを摘要した際に追加するAbility

  • Level
    ここで指定したAbility を追加するためのレベル

  • Input ID 
    追加するAbilityを認識するためのID
    -1の場合、自動で設定される

  • Removal Policy
    追加したAbilityが取り外される際の処理を設定できます。

    Cancel Ability Immediately : 実行中のAbilityはキャンセルされ、取り外される。

    Remove Ability on End : Abilityが終了した際に、取り外される。

    Do Nothing :  このGameplayEffectが取り外されても、Abilityは取り外されない。

 

以上が Immunity と Granted Abilities についての説明になります。

次回が GameplayEffect の説明ラストになります。

 

間違っている点や、質問等ありましたら、連絡していただけると幸いです。

ではでは。

 

 

GameplayEffect - その3 Expiration と Tags 編

こんばんは、ごりです。 

goolee.hatenablog.com

 今日はこちらの記事の続きから書いていきます。

GameplayEffectの Expiration と Tags のカテゴリの説明です。

まず Expiration からです。

 

f:id:m-goolee-y:20181125143825p:plain

 

  • Premature Expritation Effect Classes
    Effectの強制終了や、タグが消されたなどの時に                適用される Effect です。
    Duration Policy が Has Duration の時限定。

  • Routin Expiration Effect Classes
    持続時間が経ってEffectが終了する時に適用されるEffectです。
    Duration Policy が Has Duration の時限定。

 

続いて Tags の説明です。

f:id:m-goolee-y:20181126193832p:plain

  • GameplayEffectAssetTag
    エフェクト自身のタグです。

  • GrantedTag
    このEffectを適用しているアクタに設定するタグです。

  • Ongoing Tag Requirements
    パラメータ変更のオンオフを設定できます。
    ただし、オフになっても対象から取り外されるわけではありません。

  • Application Tag Requirements
    対象に適用できるかをこのTagで設定できます。

  • Remove Gameplay Effects with Tags 
    エフェクト適用時にここで指定したタグを持つEffectは外されます。

このTagsについてはまた別の日に使い方を書いていきたいと思います。

 

以上が、Expiration と Tags の説明になります。

間違っている点など、質問ございましたら連絡いただけると幸いです。

ではでは。

 

GameplayEffect - その2 Stacking と Overflow 編

こんにちは、ごりです。

goolee.hatenablog.com

今日はこちらの記事の続きを書きたいと思います。
GameplayEffectのカテゴリの Stacking と Overflow についての説明です。

まず Stacking についてです。

f:id:m-goolee-y:20181125130355p:plain

  • Stacking Type
    同じEffectが適用方法を設定します。
    None :  積まれず、別々のインスタンスとして、扱われます。
    Aggregate by Source : Effectの発生源のスタックに積まれていきます。
    Aggregate by Target : Effect の対象のスタックに積まれていきます。

  • Stack Limit Count
    スタックに積まれる最大数

  • Stack Duration Refresh Policy
    持続時間が設定されている場合、持続時間のリセット方法を設定可能。
    Reflesh on Successful Application : スタックに新たに積まれた際に
                    持続時間をリセット
    Never Reflesh : スタックに積まれても持続時間はリセットされません。

  • Stack Period Reset Policy
    適用間隔が設定されている場合、適用間隔のリセット方法を設定可能。
    Reset on Successful Application : スタックに新たに積まれてからの
                                                           適用間隔にリセットされます。
    Never Reset : スタックに積まれても適用間隔は、
                           最初にEffectを適用してからの間隔になります。

  • Stack Expiration Policy
    持続時間が設定されていて、持続時間経過で、Effectが終了するときの
    スタックの処理方法を設定します。
  • Clear Entire Stack : Effectが終了すると、スタック全体がクリアされます。
    Remove Single Stack and Refresh Duration : スタックから一つ取り外され、
                         持続時間がリセットされます。
                         パラメータの変更はされない。
    Reflesh Duration : 持続時間だけがリセットされるため、
                                  実質無限にEffectが適用されるということになります。
                                  手動でStackから取り出す処理を作成する必要があります。

 

つづいて Overflow についてです。

f:id:m-goolee-y:20181125133926p:plain

Overflow は Stacking の設定と関わってきます。

  • Overflow Effects : スタックの上限(StackingのStack Limit Count)を
                                 超えた場合に適用されるEffect

  • Deny Overflow Application : trueの場合、上限を超えた際のEffectは適用されず、                                                 持続時間のリセットもされません。

  • Clear Stack on Overflow : trueの場合、スタックの上限を超えた際に、
                                              スタックすべてをクリア。デフォルトは false
                                              DenyOverflow Application をtrueで変更可能。

以上が、Stacking と Overflow についての説明となります。
間違っている点や質問などありましたらご連絡いただけると幸いです。

ではでは。