mcpField
U
ue-gameplay-abilities

ue-gameplay-abilities

github.com/quodsoler開発4191.2k 回インストール4 週間前に更新
リポジトリ

ue-gameplay-abilities について

UE 5.8 の Gameplay Ability System を使う開発者向けスキルです。アビリティ、エフェクト、属性、タスク、タグ、レプリケーション、Gameplay Cue と初期化方法を解説します。

主な機能

  1. 01Ability System Component の設定
  2. 02アビリティの起動とポリシー
  3. 03アビリティタスクとイベント待機
  4. 04Gameplay Effect と属性
  5. 05タグ、レプリケーション、Cue

活用シーン

  1. 01コストやクールダウン付き能力の実装
  2. 02アニメーションや Gameplay イベントの待機
  3. 03ダメージや時間制限付きバフの適用
  4. 04ASC の所有権とレプリケーション設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/quodsoler/unreal-engine-skills --skill ue-gameplay-abilities

インストール後、Claude Code で/ue-gameplay-abilitiesを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
ability-task-reference.md
gameplay-effect-reference.md
gas-setup-patterns.md

詳細

UE Gameplay Ability System

対象エンジン:UE 5.8。以下の API は 5.8 のヘッダーに照らして検証済みです。古い形式は「非推奨 — 使用しないでください」に記載されています。

GAS は GameplayAbilities プラグイン(Engine/Plugins/Runtime/GameplayAbilities)として提供されており、Experimental ではなく、本番環境で使用できます。.uproject で有効にし、モジュールの Build.cs にある PublicDependencyModuleNames に "GameplayAbilities"、"GameplayTags"、"GameplayTasks" を追加してください。このスキルでは、UAbilitySystemComponent、UGameplayAbility、UGameplayEffect、UAttributeSet、UAbilityTask、Gameplay Cues を扱います。

コンテキスト

.agents/ue-project-context.md が存在する場合は読み込んでください(モジュール名、規約、有効なプラグイン、GAS/ネットワーク設定)。ファイルがなくても作業を中断しないでください。

依頼とコードベースから対象領域を特定してください。妥当な解釈が複数あり、それぞれでコードが異なる場合に限り、質問してください。

依頼の内容…参照先
ASC の所在、初期化順序、リスポーン、レプリケーションモードASC の所有と初期化
アビリティの作成、発動、コスト、クールダウン、ポリシーGameplay Abilities
モンタージュ、イベント、ターゲティング、タイマー、タグクエリの待機Ability Tasks
ダメージ、バフ、スタック、実行、免疫、GE コンポーネントGameplay Effects
体力/マナの浮動小数点値、クランプ、属性レプリケーションAttribute Sets
アビリティをブロック、付与、キャンセルするタグ、ルーズタグTags in GAS
パーティクル、サウンド、ヒット時のエフェクト、Cue Notify クラスGameplay Cues
Cue の検索パス、グローバルカーブテーブル、プロジェクト設定Project Settings

GAS アーキテクチャ

構成要素クラスヘッダー目的
コンポーネントUAbilitySystemComponentAbilitySystemComponent.hアビリティ、エフェクト、属性、タグを管理します
アビリティUGameplayAbilityAbilities/GameplayAbility.h発動時に行われる処理です
エフェクトUGameplayEffectGameplayEffect.hデータ駆動型の属性変更です
属性UAttributeSetAttributeSet.hレプリケートされる FGameplayAttributeData のステータスです
タスクUAbilityTaskAbilities/Tasks/AbilityTask.hアビリティ内の潜在的な処理ステップです

Gameplay タグは、要件、付与、ブロッカーとしてこれらすべてに関わります。

ASC の所有と初期化

所有者使用する場面備考
APlayerStateネットワーク接続されたプレイヤーキャラクターASC はポーンの死亡後も存続します。レプリケーションには Mixed を使用してください
APawn / ACharacterAI、シングルプレイヤー最もシンプルです。AI には Minimal を使用し、ポーン所有の ASC がすべてのクライアントで完全なデータを必要とする場合は Full を使用してください

ASC を所有または公開するすべてのアクターは、IAbilitySystemInterface を実装します。

// MyCharacter.h
#pragma once

#include "GameFramework/Character.h"
#include "AbilitySystemInterface.h"
#include "MyCharacter.generated.h"

class UAbilitySystemComponent;

UCLASS()
class MYGAME_API AMyCharacter : public ACharacter, public IAbilitySystemInterface
{
    GENERATED_BODY()

public:
    AMyCharacter();

    virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;

protected:
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "GAS")
    TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;
};
// MyCharacter.cpp
#include "MyCharacter.h"
#include "AbilitySystemComponent.h"

AMyCharacter::AMyCharacter()
{
    AbilitySystemComponent = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystemComponent"));
    AbilitySystemComponent->SetIsReplicated(true);
    AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Mixed);
}

UAbilitySystemComponent* AMyCharacter::GetAbilitySystemComponent() const
{
    return AbilitySystemComponent;
}

InitAbilityActorInfo(OwnerActor, AvatarActor) は、サーバーとクライアントの両方で実行する必要があります。ポーン所有の ASC では、BeginPlay で (this, this) を指定します。PlayerState 所有の ASC では、サーバー側の PossessedBy とクライアント側の OnRep_PlayerState で、(PlayerState, Character) を指定します。両方の経路を含む完全なコード、リスポーン処理、AI 用の例については、gas-setup-patterns.md を参照してください。

EGameplayEffectReplicationModeシミュレートされたプロキシへの影響
MinimalGE はレプリケートされず、最小限のタグ/Cue データのみ送られます。AI とプレイヤー以外のアクター向けです
Mixed所有する接続には完全な GE が送られ、それ以外には最小限のデータが送られます。プレイヤーキャラクター向けです
Fullすべての GE がすべてのクライアントにレプリケートされます

Mixed は、ASC の所有アクターを所有する接続に完全な GE データを送信するため(GameplayEffect.cpp:5240)、PlayerState 所有の ASC と、PlayerController がポーンを所有した後のポーン所有 ASC の両方で機能します。Mixed ではなく Full を選ぶかどうかは、正しさではなく帯域幅に関する判断です。プレイヤー所有の ASC では Minimal は機能しません(AbilitySystemComponent.h:83)。各モードのネットワーク転送コストについては ue-networking-replication を参照してください。

ゲームプレイ能力

// MyFireballAbility.h
#pragma once

#include "Abilities/GameplayAbility.h"
#include "MyFireballAbility.generated.h"

class UGameplayEffect;

UCLASS()
class MYGAME_API UMyFireballAbility : public UGameplayAbility
{
    GENERATED_BODY()

public:
    UMyFireballAbility();

    virtual bool CanActivateAbility(const FGameplayAbilitySpecHandle Handle,
        const FGameplayAbilityActorInfo* ActorInfo,
        const FGameplayTagContainer* SourceTags = nullptr,
        const FGameplayTagContainer* TargetTags = nullptr,
        OUT FGameplayTagContainer* OptionalRelevantTags = nullptr) const override;

    virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle,
        const FGameplayAbilityActorInfo* ActorInfo,
        const FGameplayAbilityActivationInfo ActivationInfo,
        const FGameplayEventData* TriggerEventData) override;

    virtual void EndAbility(const FGameplayAbilitySpecHandle Handle,
        const FGameplayAbilityActorInfo* ActorInfo,
        const FGameplayAbilityActivationInfo ActivationInfo,
        bool bReplicateEndAbility, bool bWasCancelled) override;

    virtual void CancelAbility(const FGameplayAbilitySpecHandle Handle,
        const FGameplayAbilityActorInfo* ActorInfo,
        const FGameplayAbilityActivationInfo ActivationInfo,
        bool bReplicateCancelAbility) override;

protected:
    UPROPERTY(EditDefaultsOnly, Category = "GAS")
    TSubclassOf<UGameplayEffect> DamageEffect;
};

コンストラクターでポリシーと能力自体のタグを設定します。

// MyFireballAbility.cpp
#include "MyFireballAbility.h"
#include "AbilitySystemBlueprintLibrary.h"
#include "AbilitySystemComponent.h"

UMyFireballAbility::UMyFireballAbility()
{
    InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerActor;
    NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::LocalPredicted;
    NetSecurityPolicy = EGameplayAbilityNetSecurityPolicy::ClientOrServer;

    FGameplayTagContainer Tags;
    Tags.AddTag(FGameplayTag::RequestGameplayTag(TEXT("Ability.Skill.Fireball")));
    SetAssetTags(Tags);

    ActivationOwnedTags.AddTag(FGameplayTag::RequestGameplayTag(TEXT("Ability.Active.Casting")));
    ActivationBlockedTags.AddTag(FGameplayTag::RequestGameplayTag(TEXT("State.Stunned")));
    CancelAbilitiesWithTag.AddTag(FGameplayTag::RequestGameplayTag(TEXT("Ability.Active.Melee")));
}

SetAssetTagsはコンストラクター内でのみ使用できます。設定したタグはGetAssetTags()で取得します。

列挙型値用途
EGameplayAbilityInstancingPolicyInstancedPerActor, InstancedPerExecutionInstancedPerActorが既定の選択肢です。複数のコピーを同時に実行できる場合は、実行ごとのインスタンス化を使用します
EGameplayAbilityNetExecutionPolicyLocalPredicted, LocalOnly, ServerInitiated, ServerOnly応答性が求められるプレイヤーの能力にはLocalPredictedを使用します
EGameplayAbilityNetSecurityPolicyClientOrServer, ServerOnlyExecution, ServerOnlyTermination, ServerOnlyサーバーが管理すべきクライアントからの要求を拒否します
void UMyFireballAbility::ActivateAbility(const FGameplayAbilitySpecHandle Handle,
    const FGameplayAbilityActorInfo* ActorInfo,
    const FGameplayAbilityActivationInfo ActivationInfo,
    const FGameplayEventData* TriggerEventData)
{
    Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);

    // CommitAbility applies cost and cooldown; it fails if either cannot be paid.
    if (!CommitAbility(Handle, ActorInfo, ActivationInfo))
    {
        EndAbility(Handle, ActorInfo, ActivationInfo, true, true);
        return;
    }

    const FGameplayEffectSpecHandle Spec =
        MakeOutgoingGameplayEffectSpec(DamageEffect, GetAbilityLevel());
    const FGameplayAbilityTargetDataHandle TargetData =
        UAbilitySystemBlueprintLibrary::AbilityTargetDataFromActor(ActorInfo->AvatarActor.Get());

    ApplyGameplayEffectSpecToTarget(Handle, ActorInfo, ActivationInfo, Spec, TargetData);
    EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
}

2つの処理を異なるタイミングで行う必要がある場合は、コミットを分割します。CommitAbilityCost(Handle, ActorInfo, ActivationInfo)とCommitAbilityCooldown(Handle, ActorInfo, ActivationInfo, ForceCooldown)を使用します。クールダウンのオーバーロードには、追加のconst bool ForceCooldown引数があることに注意してください。

インスタンス化された能力内では、GetAbilitySystemComponentFromActorInfo_Ensured()がASCを返します。アクター情報が設定されていない場合もクラッシュせず、ensureログを出力します。

サーバーから付与して有効化する方法:

const FGameplayAbilitySpecHandle Handle =
    ASC->GiveAbility(FGameplayAbilitySpec(UMyFireballAbility::StaticClass(), 1));

ASC->TryActivateAbility(Handle);
ASC->TryActivateAbilityByClass(UMyFireballAbility::StaticClass());
ASC->TryActivateAbilitiesByTag(
    FGameplayTagContainer(FGameplayTag::RequestGameplayTag(TEXT("Ability.Skill.Fireball"))));
ASC->ClearAbility(Handle);

能力タスク

能力タスクを使うと、能力を複数フレームにまたがって実行できます。基本パターンは常に、静的ファクトリー → デリゲートをバインド → ReadyForActivation()(UGameplayTaskから継承)です。タスクのデリゲートは動的なので、各ハンドラーにUFUNCTION()が必要です。

// In the ability's header:
UFUNCTION()
void HandleMontageCompleted();

UFUNCTION()
void HandleMontageInterrupted();
#include "Abilities/Tasks/AbilityTask_PlayMontageAndWait.h"

UAbilityTask_PlayMontageAndWait* Task =
    UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(
        this, NAME_None, AttackMontage, 1.f);
Task->OnCompleted.AddDynamic(this, &UMyFireballAbility::HandleMontageCompleted);
Task->OnInterrupted.AddDynamic(this, &UMyFireballAbility::HandleMontageInterrupted);
Task->ReadyForActivation();
タスク待機対象
UAbilityTask_PlayMontageAndWaitUAnimMontageの終了、ブレンドアウト、中断、またはキャンセル
UAbilityTask_PlayAnimAndWaitリンク済みアニメーションレイヤー用にスロットで再生する生のUAnimSequence
UAbilityTask_WaitGameplayEventASCに送信されるゲームプレイイベントタグ(アニメーション通知、ヒット登録)
UAbilityTask_WaitDelay指定した秒数
UAbilityTask_WaitTargetDataターゲットを確定するAGameplayAbilityTargetActor
UAbilityTask_WaitAttributeChange / ...ChangeThreshold変化する、または比較条件を満たす属性
UAbilityTask_WaitGameplayTagQueryターゲットのタグに対するFGameplayTagQueryがtrueまたはfalseになること
UAbilityTask_WaitGameplayTagCountChangedASC上の1つのタグのカウントが変化すること
UAbilityTask_WaitGameplayEffectApplied_Self / _Targetタグ要件に一致するGE(または_Queryファクトリー経由のFGameplayTagQuery)

ファクトリーの完全なシグネチャ、デリゲート名、カスタムタスクのテンプレート、タスク使用時の注意点については、ability-task-reference.mdを参照してください。

ゲームプレイエフェクト

EGameplayEffectDurationType動作
Instant基準値に対して一度だけ実行されます。PostGameplayEffectExecuteを発火します
HasDurationDurationMagnitude秒間、現在値に集約されます
Infinite明示的に削除されるまで集約されます
const FGameplayEffectContextHandle Ctx = ASC->MakeEffectContext();
const FGameplayEffectSpecHandle Spec =
    ASC->MakeOutgoingSpec(UMyDamageEffect::StaticClass(), Level, Ctx);

Spec.Data->SetSetByCallerMagnitude(
    FGameplayTag::RequestGameplayTag(TEXT("SetByCaller.Damage")), 75.f);

ASC->ApplyGameplayEffectSpecToSelf(*Spec.Data.Get());
ASC->ApplyGameplayEffectSpecToTarget(*Spec.Data.Get(), TargetASC);

ASC->RemoveActiveGameplayEffect(ActiveHandle);
ASC->RemoveActiveGameplayEffectBySourceEffect(UMyDamageEffect::StaticClass(), nullptr);

モディファイアーの演算はEGameplayModOp(名前空間付きの列挙型なので、値はTEnumAsByte<EGameplayModOp::Type>)で定義されています。集約の計算式は ((BaseValue + AddBase) * MultiplyAdditive / DivideAdditive * MultiplyCompound) + AddFinal です。

値意味
AddBaseほかの処理より先に基準値へ加算します
MultiplyAdditive乗数を合計し、その合計を計算途中の値に乗算します
DivideAdditive除数を合計し、その合計で計算途中の値を除算します
MultiplyCompound計算途中の値に乗算します。他の複合乗算と累積します
AddFinalすべての乗算の後に加算します
Override計算結果を置き換えます

以前はUGameplayEffectのモノリシックなプロパティだった動作は、現在はGameplayEffectComponents/以下のUGameplayEffectComponentサブクラスにあります。スタック、マグニチュード計算、UGameplayEffectExecutionCalculation、周期エフェクト、無効化、クエリ、ライフサイクルデリゲート、コンポーネントの全一覧については、gameplay-effect-reference.mdを参照してください。

属性セット

// MyHealthSet.h
#pragma once

#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "MyHealthSet.generated.h"

UCLASS()
class MYGAME_API UMyHealthSet : public UAttributeSet
{
    GENERATED_BODY()

public:
    UMyHealthSet();

    virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
    virtual void PostGameplayEffectExecute(const struct FGameplayEffectModCallbackData& Data) override;
    virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;

    UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health, Category = "Health")
    FGameplayAttributeData Health;
    ATTRIBUTE_ACCESSORS_BASIC(UMyHealthSet, Health)

    UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_MaxHealth, Category = "Health")
    FGameplayAttributeData MaxHealth;
    ATTRIBUTE_ACCESSORS_BASIC(UMyHealthSet, MaxHealth)

protected:
    UFUNCTION()
    void OnRep_Health(const FGameplayAttributeData& OldHealth);

    UFUNCTION()
    void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth);
};

ATTRIBUTE_ACCESSORS_BASIC は、GetHealthAttribute()、GetHealth()、SetHealth()、InitHealth() を生成します。追加のアクセサーが必要なプロジェクトでは、GAMEPLAYATTRIBUTE_PROPERTY_GETTER、GAMEPLAYATTRIBUTE_VALUE_GETTER、GAMEPLAYATTRIBUTE_VALUE_SETTER、GAMEPLAYATTRIBUTE_VALUE_INITTER をチェーンする独自のマクロを定義します。

各 OnRep_ の本体は、GAMEPLAYATTRIBUTE_REPNOTIFY(UMyHealthSet, Health, OldHealth) の呼び出し 1 つです。また、すべての属性に DOREPLIFETIME_CONDITION_NOTIFY(UMyHealthSet, Health, COND_None, REPNOTIFY_Always) の行が必要です。クランプ処理を含む完全な .cpp は、gas-setup-patterns.md にあります。

フック発生タイミング用途
PreAttributeChange現在値が再計算されるたび現在値のみのクランプ
PreAttributeBaseChange基本値の書き込み前(const)基本値のクランプ
PostGameplayEffectExecuteインスタント GE、または周期的 GE の 1 周期が基本値を書き込んだ後死亡、被弾リアクション、ゲームイベント
PostAttributeChange現在値の変更後派生状態への反応

登録と読み取り:

// Constructor of the ASC owner — the ASC finds subobject attribute sets automatically:
HealthSet = CreateDefaultSubobject<UMyHealthSet>(TEXT("HealthSet"));

// Runtime, authority only:
UMyHealthSet* NewSet = NewObject<UMyHealthSet>(this);
ASC->AddSpawnedAttribute(NewSet);

const float CurrentHealth = ASC->GetNumericAttribute(UMyHealthSet::GetHealthAttribute());

1 つの ASC に複数の UAttributeSet サブクラスを格納できますが、各クラスのインスタンスは 1 つだけです。

GAS のタグ

タグの定義(ネイティブタグマクロ、.ini タグソース)、コンテナのマッチング、FGameplayTagQuery のセマンティクスについては、ue-gameplay-tags-messaging を参照してください。GAS 固有の内容は次のとおりです。

// On the ability CDO (constructor): tags granted while the ability runs, and the gates.
ActivationOwnedTags.AddTag(CastingTag);
ActivationRequiredTags.AddTag(WeaponEquippedTag);
ActivationBlockedTags.AddTag(StunnedTag);
BlockAbilitiesWithTag.AddTag(MeleeTag);
CancelAbilitiesWithTag.AddTag(ChannelTag);

// On the ASC: query and react.
ASC->HasMatchingGameplayTag(StunnedTag);
const FGameplayTagContainer& Owned = ASC->GetOwnedGameplayTags();
ASC->RegisterGameplayTagEvent(StunnedTag, EGameplayTagEventType::NewOrRemoved)
    .AddUObject(this, &AMyCharacter::HandleStunnedTagChanged);

コールバックは void HandleStunnedTagChanged(const FGameplayTag Tag, int32 NewCount); として宣言します。UFUNCTION() は不要です。タグイベントは通常のマルチキャストデリゲートです。

ルーズタグは GE を介さず、直接設定します。3 番目の引数でタグのレプリケーション方法を選択します。

ASC->AddLooseGameplayTag(StunnedTag);                                              // local only
ASC->AddLooseGameplayTag(BuffedTag, 1, EGameplayTagReplicationState::TagOnly);     // tag to all
ASC->AddLooseGameplayTag(BuffedTag, 1, EGameplayTagReplicationState::CountToOwner);// + count to owner
ASC->RemoveLooseGameplayTag(BuffedTag, 1, EGameplayTagReplicationState::TagOnly);
ASC->SetLooseGameplayTagCount(BuffedTag, 3, EGameplayTagReplicationState::TagAndCountToAll);

EGameplayTagReplicationState の値は、None、SimulatedTagOnly、TagOnly、CountToOwner、TagAndCountToAll です。None 以外の値はサーバーで追加する必要があります。

Gameplay Cues

キューはコスメティック用途に限られます。タグのプレフィックスは GameplayCue. です。GE は GameplayCues 配列を介してキューを発火させるほか、コードから直接発火させることもできます。

ASC->ExecuteGameplayCue(HitCueTag, ASC->MakeEffectContext());   // one-shot
ASC->AddGameplayCue(BuffCueTag);                                // persistent
ASC->RemoveGameplayCue(BuffCueTag);
const bool bActive = ASC->IsGameplayCueActive(BuffCueTag);
クラス基底クラスオーバーライド用途
UGameplayCueNotify_StaticUObjectOnExecute_Implementationアクターをスポーンしないバーストキュー
UGameplayCueNotify_BurstUGameplayCueNotify_Staticデータ駆動型のバーストエフェクトコード不要の一回限りのパーティクル/サウンド
UGameplayCueNotify_HitImpactUGameplayCueNotify_Staticデータ駆動型のインパクトエフェクトサーフェスタイプに応じたインパクト
AGameplayCueNotify_ActorAActorOnActive_/WhileActive_/OnRemove_Implementationアクターが必要な持続型キュー
AGameplayCueNotify_BurstLatentAGameplayCueNotify_Actorデータ駆動型のバーストエフェクトアクターのスポーンが必要なバースト
AGameplayCueNotify_LoopingAGameplayCueNotify_Actorデータ駆動型のループエフェクトループするオーラやチャネル
// MyHitCue.h
#pragma once

#include "GameplayCueNotify_Static.h"
#include "MyHitCue.generated.h"

UCLASS()
class MYGAME_API UMyHitCue : public UGameplayCueNotify_Static
{
    GENERATED_BODY()

public:
    virtual bool OnExecute_Implementation(AActor* MyTarget,
        const FGameplayCueParameters& Parameters) const override;
};

UGameplayCueManager は、プロジェクト設定で構成されたスキャンパス配下のキューアセットを検出します。

プロジェクト設定

GAS の設定は UDeveloperSettings クラスである UGameplayAbilitiesDeveloperSettings(Project Settings → Gameplay Abilities)にあります。GetDefault<UGameplayAbilitiesDeveloperSettings>() で読み取ります。主なフィールドは、GameplayCueNotifyPaths、ReplicateActivationOwnedTags、bAllowGameplayModEvaluationChannels、およびグローバルなカーブ/属性テーブルです。実行時のヘルパーは引き続き UAbilitySystemGlobals にあります(GetGameplayCueNotifyPaths()、AddGameplayCueNotifyPath()、GetAttributeSetInitter())。

非推奨 — 使用しないでください

出力しないでください5.8 で使用出典
AGameplayCueNotify_StaticUGameplayCueNotify_Static(UObject)このクラスは存在したことがありません。GameplayCueNotify_Static.h:19
EGameplayModOp::MultiplicativeEGameplayModOp::MultiplyAdditive(レガシーエイリアスの綴りは Multiplicitive)GameplayEffectTypes.h:112-148
EGameplayModOp::Additive / DivisionAddBase / DivideAdditive非公開の後方互換エイリアス。GameplayEffectTypes.h:141-143
EGameplayAbilityInstancingPolicy::NonInstancedInstancedPerActorAbilities/GameplayAbilityTypes.h:46 の UE_DEPRECATED_FORGAME(5.5)
UGameplayAbility::AbilityTagsGetAssetTags() / SetAssetTags()Abilities/GameplayAbility.h:474 の UE_DEPRECATED_FORGAME(5.5)
GetAbilitySystemComponentFromActorInfo_Checked()GetAbilitySystemComponentFromActorInfo_Ensured()Abilities/GameplayAbility.h:168 の UE_DEPRECATED(5.5)
アクターへの NetUpdateFrequency の代入SetNetUpdateFrequency(100.f)GameFramework/Actor.h:903 の UE_DEPRECATED(5.5)
UGameplayEffect::StackingType(パブリックな読み取り)GetStackingType()GameplayEffect.h:2407 の UE_DEPRECATED(5.7)
UGameplayEffect::GrantedApplicationImmunityTagsUImmunityGameplayEffectComponentGameplayEffect.h:2379 の UE_DEPRECATED(5.3)
AddReplicatedLooseGameplayTagAddLooseGameplayTag(Tag, Count, EGameplayTagReplicationState::CountToOwner)(非推奨メッセージに記載された置き換え先。クライアントでカウントが不要な場合は TagOnly)関数は削除済み(5.8 に宣言なし)。バッキングメンバーの ReplicatedLooseTags は AbilitySystemComponent.h:1941 で UE_DEPRECATED(5.7)
FGameplayAbilitySpec::DynamicAbilityTagsGetDynamicSpecSourceTags()GameplayAbilitySpec.h:242 の UE_DEPRECATED(5.5)
UAbilitySystemBlueprintLibrary::MakeSpecHandleMakeSpecHandleByClassAbilitySystemBlueprintLibrary.h:249 の UE_DEPRECATED(5.5)
UAbilitySystemGlobals の設定メンバーGetDefault<UGameplayAbilitiesDeveloperSettings>()AbilitySystemGlobals.h 全体にわたる UE_DEPRECATED(5.5)
FGameplayEffectSpec::GetModifierMagnitude(ModifierIdx, bFactorInStackCount)GetModifierMagnitude(int32 ModifierIdx)GameplayEffect.h:1153 の UE_DEPRECATED(5.6)
FActiveGameplayEffectHandle(int32)、ResetGlobalHandleMap()、RemoveFromGlobalMap()FActiveGameplayEffectHandle::GenerateNewHandle() または GetInstantExecutedHandle()。グローバルマップは廃止されていますActiveGameplayEffectHandle.h:30,66,69 の UE_DEPRECATED(5.8)

よくある間違い

ポーンのみに IAbilitySystemInterface を実装する: ASC が PlayerState にある場合、PlayerState にもインターフェースを実装する必要があります。そうしないと、所有者に対する UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent が失敗します。

サーバーでのみ InitAbilityActorInfo を呼び出す: クライアントでも呼び出す必要があります。サーバー側の経路は PossessedBy、クライアント側の経路は OnRep_PlayerState です。クライアント側で呼び出さないと、属性変更デリゲートが所有クライアントで一度も実行されません。

初期化前に GE を適用する: InitAbilityActorInfo の実行前にアビリティを付与したりエフェクトを適用したりすると、ASC にアクター情報が設定されず、属性セットも登録されません。

誤ったフックでクランプする: PreAttributeChange はアグリゲーターの再計算ごとに呼び出されるため、クランプできるのは NewValue のみです。死亡、ヒットリアクション、ゲームプレイイベントは、実行(即時 GE および周期的なティック)に対してのみ実行される PostGameplayEffectExecute に記述します。

CommitAbility を忘れる: アビリティは実行されますが、コストが消費されず、クールダウンも開始されません。

ルーズタグがレプリケートされると思い込む: AddLooseGameplayTag(Tag) のデフォルトは EGameplayTagReplicationState::None です。サーバーから TagOnly または CountToOwner を渡すか、GE を通じてタグを付与してください。

スタックが気づかないうちに上限に達する: GetStackLimitCount() を超える適用は、エラーなしで拒否されます。スタックが追加されたと判断する前に GetCurrentStackCount(Handle) を確認してください。

権限チェックなしで BeginPlay にスタートアップエフェクトを設定する: 後から参加したクライアントで再適用されます。すべての GiveAbility とスタートアップ GE を HasAuthority() で保護してください。

PlayerState のない AI: ASC を AI キャラクターに配置し、InitAbilityActorInfo(this, this) を呼び出して、レプリケーションを Minimal に設定します。

関連スキル

  • ue-gameplay-tags-messaging — タグ定義(ネイティブタグマクロ、ini タグソース)、コンテナー、FGameplayTagQuery、ゲームプレイメッセージング
  • ue-networking-replication — DOREPLIFETIME の各種バリエーション、RPC、予測キー、プッシュモデル
  • ue-animation-system — モンタージュアビリティタスクが操作するモンタージュアセット、通知、スロット
  • ue-character-movement — ルートモーションアビリティタスクが操作する移動モード
  • ue-cpp-foundations — UPROPERTY/UFUNCTION 指定子、デリゲート、TSubclassOf、サブシステム
  • ue-data-assets-tables — 属性の初期化と FScalableFloat の基盤となる UCurveTable および UDataTable アセット
  • ue-state-trees — State Tree タスクから実行するアビリティ
  • ue-actor-component-architecture — コンポーネントの作成、サブオブジェクトの登録、サブオブジェクトのレプリケーション
  • ue-gameplay-framework — PlayerState と Pawn のライフサイクル、および GAS を使わないダメージ(TakeDamage、UDamageType)
  • ue-input-system — アビリティ入力 ID にバインドされた Enhanced Input アクション
  • ue-game-features — ゲームフィーチャープラグインからのアビリティと属性セットの付与
  • ue-niagara-effects — Niagara システム、ユーザーパラメーター、データインターフェース、データチャネル
  • ue-ui-umg-slate — UMG ウィジェット、Slate、Common UI、MVVM

コメント