アビリティ システム コンポーネントと属性

ゲームプレイ属性と属性セットでアビリティ システム コンポーネントを使用する

アビリティ システム コンポーネント (UAbilitySystemComponent) は、アクタと ゲームプレイ アビリティ システム の間の橋渡しをします。アクタをゲームプレイ アビリティ システムとインタラクションさせるには、独自のアビリティ システム コンポーネント、または別のアクタに所有されたアビリティ システム コンポーネントへのアクセスが必要です。アビリティ システム コンポーネントを使用する前に、プロジェクトが Gameplay Ability System プラグイン を使用する設定になっていることを確認してください。

基本要件

AActor サブクラスをゲームプレイ アビリティ システムを使用する設定にするには、IAbilitySystemInterface インターフェースを実行して GetAbilitySystemComponent 関数をオーバーライドします。この関数はアクタに紐づいているアビリティ システム コンポーネントを返す必要があります。ほとんど場合、Actor クラスには、任意の Actor タイプの組み込みコンポーネントと同様に、アビリティ システム コンポーネントへのポインタを格納する UPROPERTY でタグ付けされた変数があります。アクタには独自のアビリティ システム コンポーネントがあるのが一般的ですが、プレイヤーのポーンまたはキャラクターなどのアクタが、プレイヤー ステートまたはプレイヤー コントローラーなど別のアクタに所有されるアビリティ システム コンポーネントを使用したい場合があります。プレイヤーのスコア、またはプレイヤーのポーンあるいはキャラクターが破壊され再スポーンされた時、またはプレイヤーが新しいポーンやキャラクターを所有したときにリセットされない長時間続くアビリティ クールダウン タイマーなどの場合です。ゲームプレイ アビリティ システムはこの動作をサポートします。これを実装するには、使用するアビリティ システム コンポーネントを返すようにアクタの GetAbilitySystemComponent 関数を記述します。

設定例

次の手順に従うと、アビリティ システム コンポーネントでシンプルかつ一般的なパターンを開始しやすくなります。

  1. AActor またはサブクラスとしてクラスを宣言し (APawnACharacter が一般的な基本クラス)、次のように IAbilitySystemInterface をヘッダ ファイルで宣言に追加します。

    class AMyActor : public AActor, public IAbilitySystemInterface

  2. IAbilitySystemInterface には、オーバーライドが必要な単一関数の GetAbilitySystemComponent がありますので、クラス定義でその関数を宣言してください。

//~ Begin IAbilitySystemInterface
/** Returns our Ability System Component. */
virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;
//~ End IAbilitySystemInterface
  1. 場合によっては、特にアクタを破壊および再スポーンすることができる場合は、アビリティ システムを Player State など別に保持することが望ましいです。分かりやすくするために、この例はアクタ上にそれを保存します。

    /** Ability System Component.Required to use Gameplay Attributes and Gameplay Abilities. */ UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "Abilities") UAbilitySystemComponent* AbilitySystemComponent;

  2. アクタのソース ファイルで`GetAbilitySystemComponent` 関数を記述します。アビリティ システム コンポーネントはアクタ上に格納されているので、関数は次のように非常に短くなります。

    return AbilitySystemComponent;

高度な使用シナリオ

Player State が所有するアビリティ システム コンポーネントを使用するポーンのように、別のアクタに属するアビリティ システム コンポーネントを使用するにアクタを設定することができます。これを行うには、アクタの GetAbilitySystemComponent 関数がオーナーからアビリティ システム コンポーネントを取得するか、事前にアクタにキャッシュする必要があります。これは、プレイヤーが制御するアクタが破壊されて再スポーンされる可能性があり、プレイヤーが持続するために、お金、ポイント、または長時間続くアビリティ クールダウンなどの特定のゲームプレイ能力システム情報を必要とするプロジェクトで最も頻繁に発生します。装置やモジュラー マシン、あるいはボディ パーツを表すためにアクタが他のアクタを自分自身にアタッチしているプロジェクトで使用されます。これらのケースでは、アタッチされたアクタとのゲームプレイ アビリティ システムのインタラクションはメイン アクタのアビリティ システム コンポーネントへ送信されます。これを実現する簡単な方法は、アタッチされたアクタの GetAbilitySystemComponent 関数をメイン アクタにパススルーすることです。パフォーマンスを向上させるために、アクタが別のアクタにアタッチ (所有) されている間、キャッシュされたポインタを維持することを検討してください。

ゲームプレイ アビリティ システムは単一のアビリティ システム コンポーネントを共有する複数のアクタをサポートしますが、複数のアビリティ システム コンポーネントをもつ単一アクタをサポートしません。後者の場合、クエリを実行したり、アクタのアビリティ システム コンポーネントへ変更を適用したり、アクタからコンポーネントを取得するときにあいまいさが生じます。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル