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;