ささみのメモ帳

ゲーム会社で働く、無能プログラマーが自分のためのメモ帳として利用しています。

UEのGASのEffectについてのメモ

Effect(GameplayEffect)とは

UnrealEngineのGASの機能の一つで、ターゲット者に適用する効果内容の定義 効果の生存時間、効果内容の適用タイミング、タグの付与、攻撃等のイベント発生の内容を定義をする
GameplayEffect(UGameplayEffect)クラスをベースとして作る
公式リファレンス

設定項目は以下の要素がある(C++での定義例あり)
※ver UE 5.3

項目名 定義内容
Duration 効果持続期間
Period 処理実行頻度
Gameplay Effect 効果中の処理内容
Gameplay Cue 連携するCue
Stacking 既に効果を保持しているターゲットに対する振る舞い

Duration


DurationPolicy(期間の種類)を設定

Instant(即時)

即時適用されて、即時消滅する

DurationPolicy = EGameplayEffectDurationType::Instant;
Infinite (無限)

一定の間隔で適用されて、意図的に削除しない限り消滅しない

DurationPolicy = EGameplayEffectDurationType::Infinite;

static ConstructorHelpers::FObjectFinder<UCurveTable> Curve(TEXT([CurveTablePath]));
if (Curve.Succeeded())
{
    //一括の場合
    Period.SetScalingValue(2.0f, FName([RowName]), Curve.Object);

    //単体の場合
    Period.Value = 2.0f;
    Period.Curve.CurveTable = Curve.Object;
    Period.Curve.RowName = FName([RowName]);
}

bExecutePeriodicEffectOnApplication = false;
PeriodicInhibitionPolicy = EGameplayEffectPeriodInhibitionRemovedPolicy::ResetPeriod;

Period:適用間隔(秒) ※CurveTableはパターン化のための基本値に掛ける係数を管理 Y : 係数(倍率)
Execute Periodic Effect on Application:初回即時適用の有無
Periodic Inhibition Policy:周期的な適用ができなかったときの処理

項目 内容
Never Reset リセットはせず、そのまま続行
Reset Priod 間隔周期をリセット
Execute and Reset Priod 即時実行して、間隔周期をリセット
Has Duration (期間あり)

一定の間隔で適用されて、一定時間後に消滅

Magnitude Calculation Type:期間の種類

  • Scalable Float
    任意の時間効果をつける

Scalable Float Magnitude:時間(秒)
※CurveTableはパターン化のための持続時間の基本値に掛ける係数を管理 Y : 係数(倍率)

static ConstructorHelpers::FObjectFinder<UCurveTable> Curve(TEXT([CurveTablePath]));
if (Curve.Succeeded())
{
    FScalableFloat ScalableDuration(10.f);
    ScalableDuration.Curve.CurveTable = Curve.Object;
    ScalableDuration.Curve.RowName = FName([RowName]);
    DurationMagnitude = FGameplayEffectModifierMagnitude(ScalableDuration);
}
  • Attribute Based
    任意の属性値をもとに効果時間の計算

Coefficient:ベース属性値に掛ける係数
Pre Multiply Additive Value:乗算前にベースに加算される値
Post Multiply Additive Value:乗算前にベースに加算される値
Backing Attribute

Attribute to Capture:対象とする属性の選択
※GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName)を使用して追加した属性が表示される

Attribute Source:属性所持者

項目 属性を持つ対象
Source 発動者
Target 受動者

Snapshot:ベース属性値を計算前の値で固定か可変か

Attribute Curve

Curve Table:属性値をX軸とした基本値(Y)を取得するCurveTable
※X: 属性値 Y : 計算で利用するベース値
RowName:CurveTableのRowName

Attribute Calulation Type:計算方法の種類

Attribute Magnitude:属性値の総計
Attribute Base Value:加算となるものを含まない純粋な属性値
Attribute Bonus Magnitude:加算部分のみの属性値

Source Tag Filter:効果を発生する対象が持つ必要があるTag
Target Tag Filter:効果を受ける対象が持つ必要があるTag

static ConstructorHelpers::FObjectFinder<UCurveTable> Curve(TEXT([CurveTablePath]));
if (Curve.Succeeded())
{
    FAttributeBasedFloat ABF;

    ABF.Coefficient.Value = 10.0f;
    ABF.Coefficient.Curve.CurveTable = Curve.Object;
    ABF.Coefficient.Curve.RowName = FName([RowName]);

    ABF.PreMultiplyAdditiveValue.Value = 10.0f;
    ABF.PreMultiplyAdditiveValue.Curve.CurveTable = Curve.Object;
    ABF.PreMultiplyAdditiveValue.Curve.RowName = FName([RowName]);

    ABF.PostMultiplyAdditiveValue.Value = 10.0f;
    ABF.PostMultiplyAdditiveValue.Curve.CurveTable = Curve.Object;
    ABF.PostMultiplyAdditiveValue.Curve.RowName = FName([RowName]);

    ABF.BackingAttribute.AttributeToCapture = UAbilitySystemComponent::GetOutgoingDurationCapture().AttributeToCapture;
    ABF.BackingAttribute.AttributeSource = EGameplayEffectAttributeCaptureSource::Source;
    ABF.BackingAttribute.bSnapshot = true;

    ABF.AttributeCurve.CurveTable = Curve.Object;
    ABF.AttributeCurve.RowName = FName([RowName]);

    ABF.AttributeCalculationType = EAttributeBasedFloatCalculationType::AttributeBaseValue;
    ABF.SourceTagFilter = FGameplayTagContainer([Tag]);
    ABF.TargetTagFilter = FGameplayTagContainer([Tag]);

    DurationMagnitude = FGameplayEffectModifierMagnitude(ABF);
}
  • Custom Calulation Class
    独自の計算方法で効果時間設定
    Calculation Class :独自処理定義クラス
    Coefficient:ベースとなる効果時間に掛ける係数
    Pre Multiply Additive Value:乗算前にベースに加算される値
    Post Multiply Additive Value:乗算前にベースに加算される値

Final Lookup Curve

Curve Table:計算した値をX軸とした、パターン値(Y)のCurveTable
Row Name:CurveTableのRowName

static ConstructorHelpers::FObjectFinder<UCurveTable> Curve(TEXT([CurveTablePath]));
if (Curve.Succeeded())
{
    FCustomCalculationBasedFloat CCBF;
    //型はUGameplayModMagnitudeCalculation
    CCBF.CalculationClassMagnitude = UCustomCalculation::StaticClass();
    CCBF.Coefficient = 10.0f;
    CCBF.PostMultiplyAdditiveValue = 5.0f;
    CCBF.PreMultiplyAdditiveValue = 10.0f;

    CCBF.FinalLookupCurve.CurveTable = Curve.Object;
    CCBF.FinalLookupCurve.RowName = FName([RowName]);
    DurationMagnitude = FGameplayEffectModifierMagnitude(CCBF);
}
  • Set by Caller
    該当のData(Tag)が呼ばれるまで効果持続
    Data Name :Dataの名前
    Data Tag:DataとなるTag
FSetByCallerFloat SBCF;

SBCF.DataName = FName("FireWait");
SBCF.DataTag = FGameplayTagContainer([Tag]);

DurationMagnitude = FGameplayEffectModifierMagnitude(SBCF);
Period(周期)

適用間隔(秒)
※DurationPolicyが「Instant」では関係なし
※CurveTableはパターン化のための基本値に掛ける係数を管理 Y : 係数(倍率)

Execute Periodic Effect on Application:初回即時適用の有無
Periodic Inhibition Policy:周期的な適用ができなかったときの処理

項目 内容
Never Reset リセットはせず、そのまま続行
Reset Priod 間隔周期をリセット
Execute and Reset Priod 即時実行して、間隔周期をリセット

static ConstructorHelpers::FObjectFinder<UCurveTable> Curve(TEXT([CurveTablePath]));
if (Curve.Succeeded())
{
    Period.Value = 3.0f;
    Period.Curve.CurveTable = Curve.Object;
    Period.Curve.RowName = FName([RowName]);
    bExecutePeriodicEffectOnApplication = true;
    PeriodicInhibitionPolicy = EGameplayEffectPeriodInhibitionRemovedPolicy::ResetPeriod;
}

Gameplay Effect

Components(要件)

効果の適用要件(Component)追加

既存の要件定義は以下のものがある

要件の種類 内容
Apply Additional Effects 他のエフェクトを追加で適用
Block Abilities with Tags 特定のタグを持つアビリティをブロック
Chance To Apply This Effect エフェクトを適用する確率を設定
Custom Can Apply This Effect カスタムロジックでエフェクトの適用
Grant Gameplay Abilities ゲームプレイアビリティを付与
Grant Tags to Target Actor ターゲットアクターにタグを付与
Immunity to Other Effects 他のエフェクトに対する免疫を設定
Remove Other Effects 他のエフェクトを削除
Require Tags to Apply/Continue This Effect このエフェクトの適用・継続に必要なタグを設定
Tags This Effect Has (Asset Tags) このエフェクトが持つタグを設定
Remove Other Effects 他のエフェクトを削除
Require Tags to Apply/Continue This Effect このエフェクトの適用・継続に必要なタグを設定
UI Data (Text Only) テキストのみのUIデータを設定

UGameplayEffectComponentを継承することで、独自のComponentを作ることも可能
※以下の「CustomEffectRequirement」は独自で作ったもの

UCustomEffectRequirement* component = CreateDefaultSubobject<UCustomEffectRequirement>("CustomEffectRequirement");
GEComponents.Add(component);
Modifiers(修飾子)

Attribute(属性)への変更要求

Attribute:変更を加える属性
Modifier Op: 属性値の変更を加え方
Magnitude Calculation Class :量計算方法の種類

  • Scalable Float
    任意の変更量

Scalable Float Magnitude:時間(秒)
※CurveTableはパターン化のための持続時間の基本値に掛ける係数を管理 Y : 係数(倍率)

static ConstructorHelpers::FObjectFinder<UCurveTable> Curve(TEXT([CurveTablePath]));
if (Curve.Succeeded())
{
    FScalableFloat ScalableDuration(10.f);
    ScalableDuration.Curve.CurveTable = Curve.Object;
    ScalableDuration.Curve.RowName = FName([RowName]);

    FGameplayModifierInfo Info;
    Info.ModifierMagnitude = FGameplayEffectModifierMagnitude(ScalableDuration);
    Modifiers.Add(Info);
}
  • Attribute Based
    任意の属性値をもとに変更値の計算

Coefficient:ベースとなる属性値に掛ける係数
Pre Multiply Additive Value:乗算前にベースに加算される値
Post Multiply Additive Value:乗算前にベースに加算される値
Backing Attribute

Attribute to Capture:対象とする属性の選択
※GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName)を使用して追加した属性が表示される

Attribute Source:属性所持者

項目 ベース属性値を持つ対象
Source 発動者
Target 受動者

Snapshot:ベース属性値を計算前の値で固定か可変か

Attribute Curve

Curve Table:属性値をX軸とした基本値(Y)を取得するCurveTable
※X: 属性値 Y : 計算に利用するベース値
RowName:CurveTableのRowName

Attribute Calulation Type:計算方法の種類

Attribute Magnitude:ベース属性値の総計
Attribute Base Value:加算となるものを含まない純粋なベース属性値
Attribute Bonus Magnitude:加算部分のみのベース属性値

Source Tag Filter:効果を発生する対象が持つ必要があるTag
Target Tag Filter:効果を受ける対象が持つ必要があるTag

static ConstructorHelpers::FObjectFinder<UCurveTable> Curve(TEXT([CurveTablePath]));
if (Curve.Succeeded())
{
    FAttributeBasedFloat ABF;

    ABF.Coefficient.Value = 10.0f;
    ABF.Coefficient.Curve.CurveTable = Curve.Object;
    ABF.Coefficient.Curve.RowName = FName([RowName]);

    ABF.PreMultiplyAdditiveValue.Value = 10.0f;
    ABF.PreMultiplyAdditiveValue.Curve.CurveTable = Curve.Object;
    ABF.PreMultiplyAdditiveValue.Curve.RowName = FName([RowName]);

    ABF.PostMultiplyAdditiveValue.Value = 10.0f;
    ABF.PostMultiplyAdditiveValue.Curve.CurveTable = Curve.Object;
    ABF.PostMultiplyAdditiveValue.Curve.RowName = FName([RowName]);

    ABF.BackingAttribute.AttributeToCapture = UAbilitySystemComponent::GetOutgoingDurationCapture().AttributeToCapture;
    ABF.BackingAttribute.AttributeSource = EGameplayEffectAttributeCaptureSource::Source;
    ABF.BackingAttribute.bSnapshot = true;

    ABF.AttributeCurve.CurveTable = Curve.Object;
    ABF.AttributeCurve.RowName = FName([RowName]);

    ABF.AttributeCalculationType = EAttributeBasedFloatCalculationType::AttributeBaseValue;
    ABF.SourceTagFilter = FGameplayTagContainer([Tag]);
    ABF.TargetTagFilter = FGameplayTagContainer([Tag]);

    FGameplayModifierInfo Info;
    Info.ModifierMagnitude = FGameplayEffectModifierMagnitude(ABF);
    Modifiers.Add(Info);
}
  • Custom Calulation Class
    独自の計算方法で属性値設定
    Calculation Class :独自処理定義クラス
    Coefficient:ベース属性値に掛ける係数
    Pre Multiply Additive Value:乗算前にベースに加算される値
    Post Multiply Additive Value:乗算前にベースに加算される値

Final Lookup Curve

Curve Table:計算した属性値をX軸とした、パターン値(Y)のCurveTable
Row Name:CurveTableのRowName

static ConstructorHelpers::FObjectFinder<UCurveTable> Curve(TEXT([CurveTablePath]));
if (Curve.Succeeded())
{
    FCustomCalculationBasedFloat CCBF;
    //型はUGameplayModMagnitudeCalculation
    CCBF.CalculationClassMagnitude = UCustomCalculation::StaticClass();
    CCBF.Coefficient = 10.0f;
    CCBF.PostMultiplyAdditiveValue = 5.0f;
    CCBF.PreMultiplyAdditiveValue = 10.0f;

    CCBF.FinalLookupCurve.CurveTable = Curve.Object;
    CCBF.FinalLookupCurve.RowName = FName([RowName]);

    FGameplayModifierInfo Info;
    Info.ModifierMagnitude = FGameplayEffectModifierMagnitude(CCBF);
    Modifiers.Add(Info);
}
  • Set by Caller
    該当のData(Tag)が呼ばれるまで属性値を変更
    Data Name :Dataの名前
    Data Tag:DataとなるTag
 FSetByCallerFloat SBCF;

    SBCF.DataName = FName("FireWait");
    SBCF.DataTag = FGameplayTagContainer([Tag]);

    FGameplayModifierInfo Info;
    Info.ModifierMagnitude = FGameplayEffectModifierMagnitude(SBCF);
    Modifiers.Add(Info);

Source Tags :属性変更効果発生者のタグ要件
Must Have Tags :必ず所持しているべきタグ
Must Not Have Tags:必ず所持していてはならないタグ Query Must Match:条件を満たす必要があるタグ

Target Tags :属性変更効果適用者のタグ要件
Must Have Tags :必ず所持しているべきタグ
Must Not Have Tags:必ず所持していてはならないタグ
Query Must Match:条件を満たす必要があるタグ

 FGameplayModifierInfo Info;
Info.Attribute = [FGameplayAttribut];
Info.ModifierOp = EGameplayModOp::Override;

static ConstructorHelpers::FObjectFinder<UCurveTable> Curve(TEXT([CurvePath]));
if (Curve.Succeeded())
{
    FScalableFloat ScalableDuration(10.f);
    ScalableDuration.Curve.CurveTable = Curve.Object;
    ScalableDuration.Curve.RowName = FName([RowName]);
    Info.ModifierMagnitude = FGameplayEffectModifierMagnitude(ScalableDuration);
}

Info.SourceTags.RequireTags.AddTag([必要Tag]);
Info.SourceTags.IgnoreTags.AddTag([不必要Tag]);
Info.SourceTags.TagQuery = FGameplayTagQuery();

Info.TargetTags.RequireTags.AddTag([必要Tag]);
Info.TargetTags.IgnoreTags.AddTag([不必要Tag]);
Info.TargetTags.TagQuery = FGameplayTagQuery();

Modifiers.Add(Info);
Executions(実行)

独自ロジックによる効果適用
Calculation Class :実行ロジック定義クラス
Effect Class:実行するGameplayEffectクラス
Required Source Tags:発動者が所持が必要なタグ

FGameplayEffectExecutionDefinition Definition;

Definition.CalculationClass = [UGameplayModMagnitudeCalculation];

FConditionalGameplayEffect Effect;
Effect.EffectClass = [UGameplayEffect];
Effect.RequiredSourceTags.AddTag([発動者が所持が必要なタグ]);

Definition.ConditionalGameplayEffects.Add(Effect);
Executions.Add(Definition);

Gameplay Cues

Rwquire Modifier Success to Trigger Cues

修飾子(Modifier)が成功したときのみ実行の有無

Suppress Stacking Cues

溜まった(Stacking)効果の実行の有無

Gameplay Cues

Magnitude Attribute :キュー実行をするために参照する属性
Min Level:キュー実行をするための最小レベル
Min Level:キュー実行をするための最大レベル
Gameplay Cue Tags:Cue実行用Tag
※キューはタグに紐づいているため、このタグにより実行されるキューが決まる
※タグは「GameplayCue.[キュータグ]」の階層形式

bRequireModifierSuccessToTriggerCues = true;
bSuppressStackingCues = false;

FGameplayEffectCue Cue;
Cue.MagnitudeAttribute = [FGameplayAttribut]
Cue.MinLevel = 1;
Cue.MaxLevel = 10;
Cue.GameplayCueTags.AddTag(GameplayCue.[実行タグ]);

GameplayCues.Add(Cue);

Stacking

Stacking Type

効果の集計対象

対象の種類 内容
Aggregate by Source 発動者ごとに集計
Aggregate by Target 適用者ごとに集計
Stack Limit Count

スタックの最大数を指定。0は無制限

Stack Duration Refresh Policy

スタック毎にスタック中の効果持続期間のリフレッシュ

対象の種類 内容
Refresh on Successful Application スタック中の持続時間がリフレッシュ
Never Refresh スタックの持続時間はリフレッシュされない
Stack Period Reset Policy

スタック毎にスタック中の効果適用周期のリセット

対象の種類 内容
Reset on Successful Application スタック中の適用周期をリセット
Never Reset スタック中の適用処周期をリセットしない
Stack Expiration Policy

スタック効果の破棄

対象の種類 内容
Clear Entire Stack 持続期間終了時、すべてのスタックを破棄
Clear Single Stack 持続期間終了時、一つのスタックを破棄
Overflow

スタックが上限に達した場合の設定
Overflow Effects :適用される追加の効果
Deny Overflow Application:その効果適用拒否の有無
Clear Stack on Overflow:全てのスタックをクリアの有無

StackingType = EGameplayEffectStackingType::AggregateBySource;
StackLimitCount = 10;
StackDurationRefreshPolicy = EGameplayEffectStackingDurationPolicy::RefreshOnSuccessfulApplication;
StackPeriodResetPolicy = EGameplayEffectStackingPeriodPolicy::ResetOnSuccessfulApplication;
StackExpirationPolicy = EGameplayEffectStackingExpirationPolicy::ClearEntireStack;

OverflowEffects.Add([UGameplayEffect]);
bDenyOverflowApplication = true;
bClearStackOnOverflow = false;