アビリティ システム コンポーネント (UAbilitySystemComponent
) は、アクタと ゲームプレイ アビリティ システム の間の橋渡しをします。アクタをゲームプレイ アビリティ システムとインタラクションさせるには、独自のアビリティ システム コンポーネント、または別のアクタに所有されたアビリティ システム コンポーネントへのアクセスが必要です。アビリティ システム コンポーネントを使用する前に、プロジェクトが Gameplay Ability System プラグイン を使用する設定になっていることを確認してください。
基本要件
AActor
サブクラスをゲームプレイ アビリティ システムを使用する設定にするには、IAbilitySystemInterface
インターフェースを実行して GetAbilitySystemComponent
関数をオーバーライドします。この関数はアクタに紐づいているアビリティ システム コンポーネントを返す必要があります。ほとんど場合、Actor クラスには、任意の Actor タイプの組み込みコンポーネントと同様に、アビリティ システム コンポーネントへのポインタを格納する UPROPERTY
でタグ付けされた変数があります。アクタには独自のアビリティ システム コンポーネントがあるのが一般的ですが、プレイヤーのポーンまたはキャラクターなどのアクタが、プレイヤー ステートまたはプレイヤー コントローラーなど別のアクタに所有されるアビリティ システム コンポーネントを使用したい場合があります。プレイヤーのスコア、またはプレイヤーのポーンあるいはキャラクターが破壊され再スポーンされた時、またはプレイヤーが新しいポーンやキャラクターを所有したときにリセットされない長時間続くアビリティ クールダウン タイマーなどの場合です。ゲームプレイ アビリティ システムはこの動作をサポートします。これを実装するには、使用するアビリティ システム コンポーネントを返すようにアクタの GetAbilitySystemComponent
関数を記述します。
設定例
次の手順に従うと、アビリティ システム コンポーネントでシンプルかつ一般的なパターンを開始しやすくなります。
AActor
またはサブクラスとしてクラスを宣言し (APawn
とACharacter
が一般的な基本クラス)、次のようにIAbilitySystemInterface
をヘッダ ファイルで宣言に追加します。class AMyActor : public AActor, public IAbilitySystemInterface
IAbilitySystemInterface
には、オーバーライドが必要な単一関数のGetAbilitySystemComponent
がありますので、クラス定義でその関数を宣言してください。//~ Begin IAbilitySystemInterface /** アビリティ システム コンポーネントを返します */ virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override; //~ End IAbilitySystemInterface
-
場合によっては、特にアクタを破壊および再スポーンすることができる場合は、アビリティ システムを Player State など別に保持することが望ましいです。分かりやすくするために、この例はアクタ上にそれを保存します。
/** アビリティ システム コンポーネント。ゲームプレイアトリビュートとゲームプレイアビリティを使用するために必要です。 */ UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "Abilities") UAbilitySystemComponent* AbilitySystemComponent;
- アクタのソース ファイルで
GetAbilitySystemComponent
関数を記述します。アビリティ システム コンポーネントはアクタ上に格納されているので、関数は次のように非常に短くなります。UAbilitySystemComponent* AMyActor::GetAbilitySystemComponent() const { return AbilitySystemComponent; }
高度な使用シナリオ
Player State が所有するアビリティ システム コンポーネントを使用するポーンのように、別のアクタに属するアビリティ システム コンポーネントを使用するにアクタを設定することができます。これを行うには、アクタの GetAbilitySystemComponent
関数がオーナーからアビリティ システム コンポーネントを取得するか、事前にアクタにキャッシュする必要があります。これは、プレイヤーが制御するアクタが破壊されて再スポーンされる可能性があり、プレイヤーが持続するために、お金、ポイント、または長時間続くアビリティ クールダウンなどの特定のゲームプレイ能力システム情報を必要とするプロジェクトで最も頻繁に発生します。装置やモジュラー マシン、あるいはボディ パーツを表すためにアクタが他のアクタを自分自身にアタッチしているプロジェクトで使用されます。これらのケースでは、アタッチされたアクタとのゲームプレイ アビリティ システムのインタラクションはメイン アクタのアビリティ システム コンポーネントへ送信されます。これを実現する簡単な方法は、アタッチされたアクタの GetAbilitySystemComponent
関数をメイン アクタにパススルーすることです。パフォーマンスを向上させるために、アクタが別のアクタにアタッチ (所有) されている間、キャッシュされたポインタを維持することを検討してください。
ゲームプレイ アビリティ システムは単一のアビリティ システム コンポーネントを共有する複数のアクタをサポートしますが、複数のアビリティ システム コンポーネントをもつ単一アクタをサポートしません。後者の場合、クエリを実行したり、アクタのアビリティ システム コンポーネントへ変更を適用したり、アクタからコンポーネントを取得するときにあいまいさが生じます。