Lyra のアビリティ

Lyra でゲームプレイに Gameplay Ability System (ゲームプレイ アビリティ システム) を使用する方法について概説します。

Lyra では、ゲームプレイの大部分のオーケストレーションに Gameplay Ability System (GAS) が使用されています。アビリティは、ジャンプなど、主人公のデータに元々備わっている場合もあれば、ゲームの機能などのアクション、[Experience]() から付与される場合や、[Equipment]() から付与される場合などもあります。

Gameplay Ability System の内容と使用する理由

Gameplay Ability System は、ゲームプレイ メカニクスをすばやく実装し、繰り返し利用するためのフレームワークを提供するプラグインです。マルチプレイヤーを対象とする複雑なゲームプレイ メカニクスのコードを作成する際には、多くの異なるゲーム タイプに適用される共通機能ボイラープレート コードを多数作成する必要があります。

GAS は、メカニクスをゲーム設計の共通パターンにできるだけ抽象化しようとするため、プロジェクトごとにコンテキストが変わってもゲームプレイ実装に関わる共通の問題を解決するフレームワークとして利用できます。

ボイラープレート コードを作成すると、特にマルチプレイヤー ゲームでは、エラーが発生しやすく、時間もかかります。たとえば、Health 値が正しく複製されていることを確認するために何時間もかけることは避けたいものです。あるいは、Energy 値の処理を統一すると決めて同じ行をコピーする場合も同様です。

GAS では、特定のメカニクスに偏ることなく、できる限り共通のゲームプレイ機能を実現するゲーム基盤を提供することでこれらの問題に対応します。Health (ヘルス)、Ammo (弾薬)、Melee Attack (近接攻撃)、Poison Debuff (毒のデバフ) などのコンセプトに縛られることなく、GAS には Attributes (属性)Abilities (アビリティ)Effects (エフェクト) を定義、レプリケート、操作するためのツールが用意されていいます。これらの要素には、所定のゲームプレイ メカニクスのニーズに合わせて専用の値が与えられます。

Lyra には、武器の使用などの共通アクション、ジャンプやダッシュなどの移動に関連するアクション、死後に再スポーンをトリガーするなどの受動的リスニング アクション向けのアビリティが実装されています。マッチ情報 UI を呼び出す、またはゲームプレイ フェーズを管理するなど、それほど目立たない目的にもアビリティは使用されます。これらは次のセクションで詳しく説明します。

GAS は、次のコア クラスを基に構成されています。Lyra では、追加機能を提供するためにこれらの多くが拡張されています。

コア クラス

説明

UAbilitySystemComponent

Ability System Component (ASC:アビリティ システム コンポーネント) は、GAS 機能を利用できるよう任意のアクタに追加できます。特定アクタの状態を追跡し、レプリケーションを処理します。

UAttributeSet

Attribute Set は、属性、つまりゲーム メカニクス内で特別な意味がある数値の集合です。属性では、 ‘Health'などのゲーム リソースを表し、 ‘Base Attack Power'(基本攻撃パワー) など、他のゲーム ルールに影響を与える参照値や、 ‘Applied Damage'(受けたダメージ) などステートレスの量も表現できます。Attribute Set では、1 つまたは複数の属性プロパティの定義、管理、レプリケーションを処理します。

FGameplayTag

Gameplay Tag は、ゲーム オブジェクトに適用できる任意の階層識別子です。これらはゲーム エンティティを識別し、分類し、フィルタで選別するために使用できます。Gameplay Effects (ゲームプレイ エフェクト) や Abilities により付与/取り消しが可能で、それらの動作に影響を与えられます。一例は ‘Gameplay.DamageImmunity' タグで、オーナーのアバター/ポーンで、ダメージを回避します。

UGameplayAbility

Gameplay Ability は、GAS 対応アクタに付与され、実行されるゲーム アクションで、必要条件、コスト、他の動作を決定するための情報を伴います。基本的な近接攻撃から別のゲーム アクションでトリガーされた動作に対する自己完結型のゲーム メニュー フローまで、さまざまな例があります。

UGameplayEffect

Gameplay Effect は、ゲーム アクションの結果です。エフェクトには、属性の変更、タグの付与/取り消し、他のアビリティへのアクセスの有効化などがあり、一時的なものと継続的なものがあります。Gameplay Effect は GAS 対応アクタが互いにやり取りする、最も一般的な方法です。

GAS の主要なメリットを次に示します。

  • Network Replication (ネットワーク レプリケーション): 使用する属性やデバフが適切に適用またはレプリケートされていることを確認する必要はありません。そのような内部ロジックは GAS で処理されます。

  • Modularity (モジュール方式): ゲーム メカニクスの追加や変更が、新規アビリティの実装や付与と同様に簡単になります。ゲームプレイ機能を個別のアセットに分解することで、アビリティ システムは、まったく異なるゲーム オブジェクトやメカニクス間で共通の通信レイヤーを提供できます。たとえば、Health は独自の Attribute Set の一部にでき、さまざまなシステムからの Gameplay Effect を通じてインタラクションできます。

  • Fast iteration (高速イテレーション): GAS により、システム全体を変更することなく、個別のゲーム ルールを変更することが容易になります。ゲーム演算のデータ ソースを簡単に入れ替え、アクションの結果の変更は、対応する Gameplay Effect から変更できます。

ULyraAbilitySystemComponent

Lyra Ability System Component (ULyraAbilitySystemComponent) は Ability System Component (UAbilitySystemComponent) 機能を Lyra フレームワークのインターフェースに拡張します。これはすべての LyraPlayerState インスタンスに追加され、「c:Lyra\Source\LyraGame\AbilitySystem\LyraAbilitySystemComponent.h」ファイル ディレクトリで見つかります。

ALyraPlayerState

Lyra Player States (Lyra プレイヤー状態) (ALyraPlayerState) は、プレイヤー固有のアビリティと動作すべてで使用される Ability System Components を所有します。人間のプレイヤーと AI ボットそれぞれに 1 つ あります。このクラスには「c:\Lyra\Source\LyraGame\Player\LyraPlayerState.h」ファイル ディレクトリでアクセスできます。Ability System Component を Player State クラスに追加する主なメリットは、GAS 状態ロジックをベースの Pawn データから分離できることにあります。

このロジックの分離が役に立つのは、プレイヤーの Pawn が頻繁に再スポーンする必要があるゲームや、プレイヤーが複数の Pawn 間のコントロールを切り替える場合、あるいは、その時点で Pawn を所有していないゲームプレイのインスタンスにおいてです。

これにより、所有する Pawn 間でアビリティ、属性、エフェクトの一部が持続することが保証されます。このロジックではさらに簡単なプロセスで、ゲーム フェーズが変更されても GAS 状態を維持できます。ただし、特に注意が必要なのは、Pawn を Possess (所有) または Unpossess (所有を解除) するたびに、ポーン固有の GAS 状態を初期化するときおよび初期化を解除するときです。

Lyra ではこれを ULyraHeroComponent および ULyraPawnExtensionComponent を通じて対応します。これらのコンポーネントは、有効なコントローラーで所有されたときに、Abilities、Attributes、Gameplay Effects の特定セットを PlayerState の AbilitySystemComponent に付与する処理を担当します。これらは、ポーンが除外、所有解除、またはプレイから他の方法で削除されたときに、自動的に取り消されます。

ULyraHeroComponent は「c:\ReleaseWorkspace\SamplesULyraPawnExtensionComponent \Games\Lyra\Source\LyraGame\Hero\LyraHeroComponent.h」ディレクトリ、ULyraPawnExtensionComponent は、「c:\Lyra\Source\LyraGame\Pawn\LyraPawnExtensionComponent.h」ファイル ディレクトリにあります。

ALyraGameState

高レベルのゲーム フェーズ ロジックが「C:\Lyra\Source\LyraGame\LyraGameState.h」ファイルにある Lyra Game State (ALyraGameState) によりサーバー側で管理されます。Game State はクライアントとサーバーの両方に存在し、Ability System Component を使用して、アビリティとして実装された Game Phase (ゲーム フェーズ) を持ちます。これらの Game Phase をアクティブ/非アクティブ化にすることで、ゲームプレイ イベントの処理に影響を及ぼします。たとえば、ShooterCore には 3 つのフェーズが実装されています。

フェーズ

説明

Warmup (ウォームアップ)

このフェーズ中に、ダメージ無効化の Gameplay Effects がすべてのプレイヤーに適用され、レプリケートされたカウントダウンを開始し、無効化を除外し、Playing 状態に遷移します。

Playing (プレイ中)

このフェーズでは、ゲームが開始され、プレイ中です。スコアや時間制限が追跡され、適切なタイミングで PostGame に遷移します。

PostGame (ポストゲーム)

このフェーズでは、ダメージ無効化が再適用され、すべてのプレイヤーでコントロールが無効化され、次のマッチ ラウンドに遷移します。

Game State はクライアントとサーバーの両方に存在し、Game Mode はサーバーのみに存在します。

Game Phase Abilities (ゲーム フェーズ アビリティ)

Game Phase abilities は、ULyraGamePhaseAbility クラスから拡張され、各アビリティは個別の状態にカプセル化されます。Game State ロジックは、アビリティのアクティベーションがフェーズの開始で、アビリティの終了がフェーズの終了であると想定しています。これにより、 Gameplay Tag GamePhaseTag 使用して、特定フェーズの開始や終了をリッスンする機能を利用できます。

| */ Defines the game phase this game phase ability is part of.For example, if your game phase is GamePhase.RoundStart, then it will cancel all sibling phases.

So, if you had a phase such as GamePhase.WaitingToStart that was active, starting the ability part of RoundStart would end WaitingToStart.However, to get nested behaviors you can also nest the phases.For example, GamePhase.Playing.NormalPlay, is a sub-phase of the parent GamePhase.Playing, so changing the sub-phase to GamePhase.Playing.SuddenDeath, would stop any ability tied to GamePhase.Playing.*, but wouldn't end any ability tied to the GamePhase.Playing phase.
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Lyra|Game Phase")

    FGameplayTag GamePhaseTag;
 |

Lyra Game Phase Subsystem (ULyraGamePhaseSubsytem) を使用してブループリントからフェーズを切り替えることができます。これは前のフェーズ アビリティが実行されていれば終了し、新しいものをアクティブ化します。

入力タグ アクティベーション サポート

Gameplay Ability Set (UGameplayAbilitySet) を通じて付与されたアビリティは、一致する Input Tag を [Lyra's Input system]() から受信している場合に、自動的にアクティベーションをチェックします。これにより、不透明型 Input ID 数値に依存または Input Action イベントを手動で処理することなく、アビリティ アクティベーションが容易になります。例としては、以下に説明するジャンプ (GA_Hero_Jump) や武器の発射 (GA_Weapon_Fire) などがあります。

拡張されたタグ関係システム

GAS のアビリティとエフェクトには、そのオーナーに付与されたゲームプレイ タグ、特に他のアビリティや Gameplay Effect に基づいて、特定のアビリティをブロックまたはキャンセルする機能が用意されています。

この情報はそれぞれの固有のアビリティとエフェクトにより保持されますが、これらの関係を全体的に変える必要があるときにこのことが不便になります。たとえば、ゲームの規模が大きくなり、ゲーム ルールが複雑になったため、ルールを更新しようとした場合にエラーや不整合につながることがあります。

Lyra は、Lyra Ability Tag Relationship Mapping (アビリティ タグ関係マッピング) (ULyraAbilityTagRelationshipMapping) データ アセットを導入することにより、このワークフローに改良を加えています。これらはブロック、キャンセルおよび必須タグ関係のリストを保持します。これらは [Content Browser (コンテンツ ブラウザ)] > [Add (追加)] > [Miscellaneous (その他)] > [Data Asset (データアセット)] で作成できます。

Ability Tag Relationship Mapping アセットを ULyraPawnData アセットの一部として指定でき、ポーンが所有されたときに、対応する Lyra Ability System Component に割り当てられます。Ability System Component が有効なタグ関係マッピングへの参照を保持するとき、アビリティ アクティベーションのアクティブ化とキャンセル条件の追加レイヤーとしてこれらを適用します。

ULyraGlobalAbilitySystem

Lyra Global Ability System (ULyraGlobalAbilitySystem) には、レベルにあるすべての Lyra Ability System Component を簡単に追跡し、やり取りする方法が用意されています。

Lyra Ability System Component は初期化中に自動的にサブシステムに登録します。現時点で、サブシステムには、すべての登録 Ability System Component からアビリティと Gameplay effects を付与または削除する、ブループリントから呼び出し可能な関数が用意されています。

たとえば、Lyra の Elimination モードは、マッチのウォームアップ フェーズで、グローバルに Gameplay Effect (GE_PregameLobby) を適用します。これはすべてのプレイヤーに対するダメージ無効化タグを付与し、マッチがまだ開始されていないことを示す UI 要素を有効にする Gameplay Cue (ゲームプレイ キュー) をトリガーします。

ULyraAbilitySet

Lyra Ability Set (ULyraAbilitySet) は、コンテンツ ブラウザから作成できる、Data Asset (データアセット) タイプです。Ability Set が適用されたとき、Lyra キャラクターに付与される Gameplay Ability、Gameplay Effect および Attribute Set のリストを保持します。

Game Features や Equipment など Lyra Ability Set を付与するパーティは、付与される対象のアクタの追跡を処理します。ヘルパー構造体 FLyraAbilitySet_GrantedHandles は入出力の管理と除外に使用されます。

メソッド

説明

Granted Gameplay Abilities

付与される Lyra Gameplay Ability のリストで、アビリティを付与するデフォルト レベルと、そのアビリティに関連付けられるオプションの入力タグがあります。

Granted Gameplay Effects

付与されたゲームプレイ エフェクトのリストで、エフェクトを付与するデフォルト レベルがあります。

Granted Attributes

付与された属性セットのリスト。

Ability Set (アビリティ セット) はさまざま方法で付与できます。

Ability Set を付与するメソッド

説明

ULyraExperienceDefinition ULyraPawnData

Ability Set のリストは ULyraPawnData アセットで定義されます。これらのアセットは ULyraExperience Definition から参照でき、その Ability Set は、初期化時に、自動的にプレイヤーのポーンに付与されます。これはエクスペリエンスがロードされたときに、ULyraPlayerState で仲介されます。

これらのアビリティは所有するポーンではなく、Player State (プレイヤー状態) に付与されます。これらはポーンが所有される前に付与され、所有されるポーンが変わる場合でも続きます。アクティベーション ポリシーが On Spawn に設定されている場合でも、ポーン自体が所有されるまでアクティブ化されません。状況に応じて計画します。

Game Feature Actions

UGameFeatureAction_AddAbilities は、アクティベーション時にアクタに Ability Set を付与できます。これらのアクションは Game Feature プラグインまたは Experience Definition (エクスペリエンス定義) 自体に追加できます。

Equipment

ULyraEquipmentDefinitions は、それらが追加されるアクタに AbilitySet も付与できます。これはエクスペリエンスがロードされたときに、ULyraPlayerState で仲介されます。

これらのアビリティは所有するポーンではなく、Player State (プレイヤー状態) に付与されます。これらはポーンが所有される前に付与され、所有されるポーンが変わる場合でも続きます。アクティベーション ポリシーが On Spawn に設定されている場合でも、ポーン自体が所有されるまでアクティブ化されません。状況に応じて計画します。

ULyraGameplayAbility

Lyra Gameplay Ability (ULyraGameplayAbility) は UGameplayAbility クラスから拡張され、追加ユーティリティと Lyra フレームワークとのインターフェースを提供します。

Activation Group (アクティベーション グループ)

Activation Group は、アビリティが自由にアクティブ化できるか、アビリティが他の限定アビリティをブロックまたは中断するかどうかを決定します。次の Tag Relationship アセットを使用して複雑なブロック動作を実現できます。

Activation Group (アクティベーション グループ)

説明

Independent

対象アビリティは他のアビリティをブロックまたは置換しません。多くのアビリティはデフォルトでこのタグに設定する必要があります。

Exclusive Replaceable

対象アビリティは他の限定アビリティをブロックしませんが、別の限定アビリティがアクティブ化された場合にキャンセルされます。

Exclusive Blocking

アビリティが実行されている間、他の限定アビリティをアクティブ化できません。

多くのゲーム アクション (射撃、武器の交換、近接攻撃など) では Independent と Blocking に設定されます。並行処理とキャンセルは Tag Relationship で仲介されます。リーダーボードや他のゲーム内メニューは Exclusive Blocking に設定され、同時に表示されるメニューは 1 つだけであることを保証します。

Activation Policy (アクティベーション ポリシー)

アビリティ アクティベーションにより Lyra フレームワークで自動的に処理されるようにできます。

Activation Policy (アクティベーション ポリシー)

説明

None

アクティベーションをゲーム コードまたはブループリントにより手動で実行します。

On Spawn

有効なアバターが PlayerState に割り当てられるとすぐにアビリティがアクティブ化されます。Weapon Reload (武器リロード) Gameplay Ability (GA_Weapon_AutoReload) は On Spawn に設定されます。すぐに有効化され、受動的に実行されます。その時点のマガジン (弾倉) が空であるのかを定期的にチェックします。ポーンの所有が解除されるまでアビリティは終了しません。

On Input Triggered

関連入力タグがトリガーされるとすぐに、アビリティが一度アクティブ化されます。Aim Down Sights (ADS:エイムダウンサイト)、Grenade (手りゅう弾) のようなアビリティは On Input Triggered に設定されます。一度アクティブ化されると、ボタンが押されている場合は自動的に再アクティブ化されません。

While Input Active

関連入力タグがトリガーされている限り、アビリティが連続的にアクティブ化されます。Weapon Fire (武器発射) アビリティ (GA_Weapon_Fire_Shotgun など) は While Input Active に設定されます。発射アニメーション モンタージュをプレイし、再発射時間が経過するまで待機し、アビリティを終了します。これは Retrigger Instanced Ability が false に設定されているからで、アビリティが終了するまで、冗長なアクティベーション メッセージが無視されます。

Retrigger Instanced Ability が設定されている場合、このアクティベーション ポリシーの使用には注意が必要です。注意を怠ると、アクティベーションがスパムされ、期待しないエフェクトが生まれます。

K2_CanActivateAbility

一部の Lyra アビリティは K2_CanActivateAbility 関数を使用し、C++ ではなくブループリントで、アクティベーション チェックを実装します。この関数はアクティベーションを許可するためのtrue または false を返します。さらにアクティベーションを阻止した要因を判断するためにコンテキスト ゲームプレイ タグを提供します。これは Lyra だけではなく、すべての Gameplay Abilitiy に公開されます。

追加のコスト

通常の Gameplay Abilitiy は単一の Cost および Cooldown Gameplay Effect のみを利用できます。Additional Costs リストには、Gameplay Effect に設定することなく、指定できる追加コストがあり、さらに複雑なアクティベーション条件を実現します。

追加コストは標準コスト フローに統合され、対応する Check Cost Commit Cost ノード、Commit Ability (クールダウンをコミットする場合) により手動でチェック/コミットできます。

実際のコストは ULyraAbilityCost オブジェクトとして実装されます。このクラスを C++ で拡張し、CheckCostApplyCost 仮想関数をオーバーライドすることによりカスタム コストを作成できます。

Lyra は ULyraAbilityCost_PlayerTagStack を使用して、複数の追加コストを実装します。これは Player State の指定 Gameplay Tag (ゲームプレイ タグ) から多数のスタックを消費します。これらは ULyraGameplayAbility_FromEquipment から派生したアビリティから呼び出されていることを想定しています。

Lyra アビリティ コスト

説明

ULyraAbilityCost_InventoryItem

キャラクターのインベントリで関連アイテムの指定量を消費します。これは消耗インベントリ アイテムに使用されます。

ULyraAbilityCost_ItemTagStack

キャラクターのインベントリで指定アイテムから多数のスタックを消費します。コストを支払えない場合、このコストを処理するために他のアビリティに戻す Gameplay Tag をレポートします。これは Lyra で弾薬の消費とリロードを追跡するために使用されます。GA_Weapon_Fire_Shotgun と同様のアビリティはアイテム Item Tag Stack の追加コストを使用して Lyra.ShooterGame.Weapon.MagazineAmmo に設定します。武器を発射するたびに、MagazineAmmo スタックは消費された量が減ります。その時点の武器のマガジンの弾薬が枯渇した場合、アクティブ化されません。

追加と削除イベント

Lyra Abilities には、アクティベーションに頼ることなく、キャラクターへの追加や削除を処理するアビリティを可能にする追加ブループリント イベントを提供します。初期設定とクリーンアップで役に立ちます。

ブループリント イベント

説明

On Ability Added

アビリティが付与されるとすぐに、このイベントが呼び出されます。Avatar または Input Component はまだ有効ではない可能性があるので、アクセスする対象に注意してください。

On Pawn Avatar Set

ポーンが完全に初期化され、Avatar と Input Component が有効であるときに呼び出されます。

On Ability Removed

アビリティが ASC から削除されようとしている (一般にはポーンが所有されなくなる/破棄されたため) とき、このイベントが呼び出されます。

カメラ モード

Lyra Abilities は Set Camera Mode ノードと Clear Camera Mode Blueprint ノードを通じて、カメラ モードをオーバーライドできます。一例は、GA_Hero_Death アビリティでトリガーされた、ポーンが死んでいく間の、デス カメラ モードの使用です。

タイプ タグ

Lyra のアビリティでは、一般にタイプ Gameplay Tag が、階層で分類できるようにその ‘Ability Tags' プロパティに含まれます。このタイプ タグは他のアビリティで、あるいは Tag Relationship システムを通じて、ブロック、キャンセル、必須タグ設定を管理するために広く使用されます。

たとえば、キャラクター主導のアクション アビリティには、 ‘Ability.Type.Action.Dash' および ‘Ability.Type.Action.Jump' などのタイプ タグが含まれます。ただし、キャラクターよりも長生きするパッシブ (受動的) アビリティもあり、それらは ‘Ability.Type.Passive.AutoRespawn' などのタグが付けられています。キャラクターの死は、他に影響を与えることなく、他のすべてのキャラクター アクション アビリティを取り消します。

ネイティブ アビリティ サブクラス

一部の Lyra Abilities は C++ で実装されており、特定のアクティベーション条件を強制したり、(ブループリントで実装するには面倒な) 複雑な数学ロジックを実行したり、機密性の高い低レベルのゲームプレイ システムと相互作用するようになっています。サンプルのアビリティについては、次の表を参照してください。

ゲームプレイ アビリティ

説明

ULyraGameplayAbility_Death

Death Gameplay Event が発生すると、自動的にトリガーするように設定されます。他のすべてのアビリティをキャンセルし、ポーンの Health Component に Death プロセス開始のシグナルを出します (これが他のゲーム通知と状態変更のトリガーとなる)。ビジュアル エフェクトはこのクラス (GA_Hero_Death) の BP アビリティ拡張 (GA_Hero_Death) で実行されます。

ULyraGameplayAbility_Jump

ポーンの Character Movement Component で Jump と StopJumping の入力をトリガーする機能を提供し、その際、アビリティのオーナーがローカルにコントロールされた有効なポーンであるのかをチェックします。

ULyraGameplayAbility_Reset

アクティブ化されたとき、このアビリティは、直ちに所有するプレイヤーの新しいポーンをスポーンされた初期状態にリセットし、他のすべてのアビリティをキャンセルします。

ULyraGameplayAbility_FromEquipment

Lyra の Equipment システムと対話する機能と、能力に関連するアイテムを取得する機能を提供します。

ULyraGameplayAbility_RangedWeapon

武器発射のネイティブ実装。弾薬数、命中精度などを決定するために関連する武器とやり取りします。発射コーン内で弾丸の軌道を計算し、命中目標を見つけ、検証するためのレイキャスト機能が用意されています。

ブループリント アビリティ サブクラス

これらは、ブループリント サブクラスが、Lyra の拡張アビリティ機能をどのように利用しているかの例です。

ブループリント サブクラス

Gameplay Ability の説明

GA_AbilityWithWidget

追加の UI 機能を提供するあらゆるアビリティの基本クラスです。これはアビリティのウィジェットの状態を管理し、ステータス、クールダウン、その他のアビリティ情報を表示できるようにします。一例として、 Lyra の Melee アビリティがあり、モバイル プラットフォーム向けのカスタム タッチ入力ウィジェットを備えています。OnAbilityAdded イベントは、ウィジェット拡張を UI Extension Subsystem に登録し、これにより拡張ハンドルが保存されます。OnAbilityRemoved イベントは、拡張機能の登録を解除し、拡張機能ハンドルをクリアします。

GA_Melee

Ability.Type.Action.Melee のアセットタグを含み、アクティブである間は Event.Movement.Melee タグを付与します。このアビリティはタグ InputTag.Weapon.Ads でトリガーされます。このタグがアクティブ化されたときに、On Activation イベントは、次の順でアビリティ コストをコミットします。

  1. その時点で装備している武器を見つけ、関連するアニメーション モンタージュをプレイします。

  2. 権限 (サーバーをのみ) をチェックし、プレイヤーの正面でカプセル トレースを実行します。

  3. トレースがポーンにヒットする場合、さらにチェックが実行されます。たとえば、フレンドリ ファイア (味方からの誤射) を避けるためのチーム比較、レベル ジオメトリでターゲットが隠れていないことを確認する 2 番目のチェックがあります。

  4. 有効なヒットが登録されている場合、RootMotion の力を通じて、キャラクターがターゲットに向かって移動します。

  5. 次に近接攻撃のダメージのゲームプレイ エフェクトがターゲットに適用され、近接攻撃ヒットのゲームプレイ キューがオーナーでトリガーされます。

  6. 最後に、Melee Impact サウンドはマルチキャスト RPC を通じてすべてのクライアントでプレイされます。

GA_Weapon_Fire

Fire および Reload アビリティは、関連する武器が拾い上げられたとき、Lyra Equipment Definition (ULyraEquipmentDefinition) クラスの Ability Set を通じて、付与されます。アクティベーション要件は、ULyraGameplayAbility_RangedWeapon クラスで処理されます。ターゲット ロジックは同じクラスによって C++ で実行されます。Weapon Fire Gameplay Ability は、タグ InputTag.Weapon.FireAuto (入力バインディング) と Input.Weapon.Fire タグ (ゲームプレイ イベント) でアクティブ化されます。マガジンが空の場合、リロード アビリティで設定された Ability.Weapon.NoFiring タグで抑制されます。Ability.Type.Action.WeaponFire のアセット タグは Event.Movement.WeaponFire タグを付与します。タグがアクティブである間、On Ability Added イベントは、Ability.PlayMontageOnActivateFail.Message タグのリスナーをセットアップします。弾薬が残っていない間、プレイヤーが武器の発射を試みると、このイベントがトリガーされます。メッセージを受け取ったとき、発射を失敗したモンタージュがプレイされます (空砲)。このモンタージュはプレイヤーがまだ生存している場合にのみプレイされ、アニメーションのスパムを回避するために指定時間が経過した場合にのみ再トリガーされます。On Activation が呼び出されるとき、キャラクターがローカルでコントロールされる場合、ネイティブのトレース ターゲットを実行し、次の順でターゲット データを作成します。

  1. アビリティ コスト (弾薬消費) はネイティブにコミットされます。

  2. ターゲット設定データはネットワーク予測され、サーバーに送信され、 ULyraWeaponStateComponent によって検証され確認されます。

  3. ターゲット設定データがサーバーで確認された場合、BP イベント OnRangedWeaponTargetDataReady が呼び出され、見つかったすべてのターゲットが渡されます。これにより、アビリティでダメージの適用、ヒット エフェクトのプレイが可能になります。

  4. 発射アニメーション モンタージュをプレイします。

  5. タイマーに Fire Delay を設定します。ショットの間の効果的な遅延です。

  6. Fire Delay つまりタイマーが終了したとき、アビリティを終了します。さらに発射しようとすると、アクティベーション ロジックで処理されます。

On Ranged Weapon Target Data Ready は、武器が命中したすべてのターゲットが確認されたとき、C++ から呼び出されます。これは Firing ゲームプレイ キューを武器のオーナーでトリガーし、最初のヒットをパラメータとして渡します。キューがすべてのターゲット ヒットで繰り返され、各ターゲット位置で衝突のゲームプレイ キューがプレイされます。アビリティに権限 (サーバーで実行) がある場合、各ターゲット ヒットでダメージ Gameplay Effect を適用します。

GA_Weapon_ReloadMagazine

この Gameplay Ability は、 Ability.Type.Action.Reload タグのアセットで、InputTag.Weapon.Reload によってアクティブ化されます。これは Event.Movement.Reload タグを付与します。アクティブである間、移動オプションを制限します。リロード ロジックは、武器に関連付けられた 3 種類のゲームプレイタグのスタックを中心に展開します。Lyra.ShooterGame.Weapon.MagazineSize は、その時点の武器のマガジン当たりに許容される弾薬の最大量です。Lyra.ShooterGame.Weapon.MagazineAmmo は、その時点のマガジンに残っている弾薬の量です。量がゼロに到達したとき、発射を続けるために武器をリロードする必要があります。Lyra.ShooterGame.Weapon.SpareAmmo はその時点のマガジンにない、残りの弾薬量です。`K2_CanActivateAbility`関数をオーバーライドします。これは以下の起動アクティベーション チェックロジックをブループリントで実装したものです。

  • MagazineAmmoMagazineSize より少ないかどうかをチェックします。false の場合、マガジンが一杯であり、リロードを続けられません。

  • SpareAmmo がゼロより大きいかどうかをチェックします。false の場合、プレイヤーのこの武器で弾薬が切れています。

アビリティのアクティベーション時:
  • 関連アイテムの MagazineAmmo スタック カウントをチェックします。その時点のマガジンに弾薬が残っていない場合、武器発射アビリティのアクティベーションを抑えるためにタグが適用されます。

  • 武器リロード アニメーション モンタージュをプレイし、GameplayEvent.ReloadDone イベントをリッスンします。マネキンのモンタージュでアニメーション通知を通じて、このイベントが送信されます。

  • このイベントが受信されたとき、権限 (サーバー) をチェックし、リロード ロジックを実行します。これはキャラクターのインベントリで関連武器の Lyra.ShooterGame.Weapon.MagazineAmmo および Lyra.ShooterGame.Weapon.SpareAmmo に対する値を変更するだけです。このアビリティを終了します。

  • 何らかの理由でイベントが処理されなかった場合、モンタージュが停止または中断された時点で、アビリティはローカルに終了します。On End Ability は、アクティベーション時に設定される発射抑制タグが事前に設定されていた場合、それを削除するために呼び出されます。

GA_Grenade

このアビリティは、Ability.Type.Action.Grenade タグのアセットで、InputTag.Weapon.Grenade によってアクティブ化されます。これは GE_Grenade_Cooldown をクールダウン エフェクトとして使用します。On Pawn Avatar Set は、ローカルクライアントの UI Extension Subsystem でウィジェットを登録し、アビリティインスタンスごとにウィジェットが 1 つだけ追加されるようにします。On Activation はアビリティ コストとクールダウンをチェックし、コミットします。いずれかのチェックが失敗するとアビリティが終了します。次のプロセスで実行されます。

  1. アビリティ コストとクールダウンをコミットします。

  2. 手りゅう弾のスポーンの位置と回転を計算します。

  3. 権限をチェックします。権限がサーバーにある場合、算出された値で、手りゅう弾のアクタがスポーンされ、所有する Lyra キャラクターを発生元として設定します。

  4. スポーンされた B_Grenade アクタが、爆発チェックを実行すること、関連 Gameplay Effects を適用することを担当します。

  5. B_Grenade は敵のポーンとのコリジョンがあるときに、自動的に爆発します。フレンドリ ファイアを発生元 (手りゅう弾を投げた) キャラクターに適用しますが、チームメンバーには適用しません。

  6. 手りゅう弾投てきモンタージュをプレイします。Gameplay Message Subsystem を通じて、クールダウンの残り時間をブロードキャストします。その結果、関連するウィジェットがクールダウン表示と同期できます。

  7. モンタージュの完了を待つことなくアビリティをすぐに終了します。

On Ability Removed は UI Extension を登録解除し、クリアします。

GA_ADS (Aim Down Sights)

HUD 表示ボタンを処理するため GA_AbilityWithWidget から継承します。このアビリティは、Ability.Type.Action.ADS タグのアセットで、InputTag.Weapon.ADS によってアクティブ化され、Event.Movement.ADS タグを付与します。アクティブな間、ローカル予測 (Local predicted) されます。つまり、クライアントですぐに実行され、サーバーは追いつくために同期します。アクティベーション時:

  1. 視野角 (FOV) を狭めるためにカスタムのカメラ モードを適用します。

  2. キャラクターの歩行速度をキャッシュし、オーバーライドします。アビリティはローカルで予測されるので、これは所有するクライアントとサーバーで実行し、ローカルではないクライアントにレプリケートされます。

  3. 一時入力マッピング コンテキストを適用します。低い乗数で動きの入力をオーバーライドします。入力の大きさを減らすことにより、さらなる動きの入力が低い加速度を生み出し、低い加速度値でサーバーにレプリケートされます。これによりキャラクターは狙いを定めながら歩行します。

  4. ローカル プレイヤーでは、UI が更新され、「狙いを開始」のサウンドがプレイされます。

  5. 入力ボタンが放されるまで待機し、放されるとアビリティを終了します。

アビリティ終了時:
  1. カスタムのカメラ モードをクリアします。

  2. ローカルにコントロールされている場合、UI が更新され、「狙いを終了」のサウンドがプレイされます。

  3. 制御対象キャラクターの歩行速度を元に戻し、通常の移動速度を戻すための入力マッピング コンテキストを削除します。

GA_Hero_Dash

GA_AbilityWithWidget から継承します。このアビリティは、InputTag.Ability.Dash タグのアセットで、Ability.Type.Action.Dash によってアクティブ化されます`Event.Movement.Dash` を付与します。アクティブにすると、クールダウン エフェクトを使用します。**GE_HeroDash_Cooldown**:クールダウンのアクティベーション時:

  1. アビリティ コストをチェックします。コストを支払える場合はコミットし、支払えない場合はアビリティを終了します。

  2. ローカル コントロールをチェックし、サーバーでアビリティを終了します。

  3. ローカル クライアントで、ダッシュ方向が入力と見ている方向に基づいて選択されます。動きの入力がない場合、クライアントでアビリティが終了します (ダッシュ方向入力がある場合にのみ、ダッシュが発生)。

  4. 動きの方向とキャラクターの向きに基づいて、プレイするアニメーション モンタージュを選択します。

  5. キャラクターがしゃがんでいる場合、立ち上がらせます。

  6. アビリティに権限がない (ローカル クライアント) の場合、サーバー RPC を通じて、ダッシュ方向と選択モンタージュをレプリケートします。

  7. 所有クライアントとサーバーの両方で、選択モンタージュをプレイし、ダッシュ方向にルート モーションの力を加えます。

  8. メッセージング サブシステムを通じてメッセージを送信します。クライアント側の UI はクールダウン時間を同期できます。

  9. サーバーで、ダッシュ エフェクト ゲームプレイ キューをトリガーし、その結果すべてのクライアントでレプリケートされます。

  10. ルート モーションの力が完了したとき、一定時間遅延し、アビリティを終了します。これにより一定時間、付与されたアビリティ タグが維持され、射撃やジャンプなど他のアクションが抑えられます。

GE_InstantHeal

B_AbilitySpawner で付与されます。これは ALyraWeaponSpawner クラスで、GiveWeapon 関数をオーバーライドして、受け取った Pawn にゲームプレイ エフェクトを適用し、即時の回復ゲームプレイ エフェクトを適用するものです。

FLyraGameplayEffectContext

Lyra Gameplay Effect Context は、GAS によって提供されるデフォルトの Gameplay Effect Context (FGameplayEffectContext) 構造体を拡張し、Gameplay Cue Notifies に送信される追加のデータメンバーおよび機能を定義しています。FGameplayEffectContext は構造体型なので、Unreal および Gameplay Ability System で適切に認識できる置換タイプが必要です。Lyra Gameplay Effect Context は次の複数の関数をオーバーライドします。

関数

説明

Duplicate()

HitResults およびメモリ コピーできない、他のメンバーのディープ コピーを実行します。

GetScriptStruct()

適切な反映データをブループリントに提供するため、FLyraGameplayEffectContext::StaticStruct() を返します。

NetSerialize()

定義された追加メンバーのレプリケーションを追加します。

構造体テンプレート (TStructOpsTypeTraits<>) は、Lyra Gameplay Effect Context に対して定義されます。このヘルパー構造体は、複製およびシリアル化機能をバインドし、それらをレプリケーション システムで利用できるようにします。

Lyra Ability System Globals (ULyraAbilitySystemGlobals) クラスは、Ability System Globals (UAbilitySystemGlobals) クラスを拡張し、 Lyra Gameplay Effect Context 構造体を構築して返すために AllocGameplayEffectContext() 関数をオーバライドしています。

これにより、新しい Gameplay Effect Context オブジェクトが作成されるたびに、Gameplay Ability System は必ず拡張された構造体をアロケートします。

含まれる追加データの種類

現時点で、Gameplay Effect Context 構造体には、Shooter Core の射撃武器ヒットに関連づけられた固有の Cartridge ID が含まれ、Physical Material および Ability Source Object にアクセスする追加ユーティリティが用意されています。

追加データのアクセス方法

構造体型であるので、Lyra Gameplay Effect Context 構造体は、そのデータにアクセスするために、ブループリント公開関数に直接含めることはできません。

この制限を回避する方法は、ブループリント関数ライブラリに静的関数としてアクセサを組み込むことです。Context Handle を入力パラメータとして渡し、これを派生した構造体型に内部でキャストします。

ヘルパー関数 FLyraGameplayEffectContext::ExtractEffectContext は、専用の型にコンテキスト ポインタをキャストします。現時点で、これは FLyraGameplayAbilityTargetData_SingleTargetHit 構造体で使用されます。

同様の方法は、渡された Effect Context Handle を`FGameplayCueParameters` を通じて、Gameplay Cue にキャストするために使用できます。これにより追加の機能にアクセスできます。

ULyraAttributeSet

Lyra Attribute Set (ULyraAttributeSet) はデフォルトの Attribute Set クラスから拡張されます。この Lyra 固有の基本クラスには、便利な ATTRIBUTE_ACCESSORS マクロが用意されていて、Gameplay Attribute プロパティおよび Get、Set、Initialize 機能の値を自動的に設定できます。

FLyraAttributeEvent は、Attribute Set レベルで属性変更イベントを簡素化するために使用されます。

関数

説明

GetWorld()

ワールドへの参照を取得する便利なゲッター。

GetLyraAbilitySystemComponent()

lyra アビリティ システム コンポーネントへの参照を取得する便利なゲッター。

Lyra には 2 種類の特別な Attribute Set クラスがあります。

ULyraHealthSet

Lyra Health Set (ULyraHealthSet) には、キャラクターのその時点および最大のヘルス値を管理する次の属性が含まれます。

属性

説明

Health

その時点のヘルス値、最大値は MaxHealth。

MaxHealth

許容される最大ヘルス値を決定します。

Healing

キャラクターに適用される回復の累積量。Health 値に影響し、自動的にゼロにリセットされます。

Damage

キャラクターに適用されるダメージの累積量。Health 値に影響します。

この属性セットは、その時点の Health 値を MaxHealth で抑え、Health 値がなくなる時点を追跡するために使用されます。ヘルスがなくなったときに発生する、FLyraAttributeEvent デリゲートを実装します。

他のクラスはこのデリゲートにバインドし、ULyraHealthComponent などのヘルス通知を受け取ります。これは死の処理と Health 値をゲームに公開するために使用されます。

ULyraCombatSet

Lyra Combat Set (ULyraCombatSet) にはダメージと回復のサポートが用意されています。Gameplay Effects では、これらの属性の 1 つを変更、または Health の合計値を調整するため Lyra のカスタム実行への依存を処理します。

属性

説明

BaseDamage:

ダメージ実行で処理する、ダメージの基本量。実際に処理されたダメージを決定するためにダメージ実行計算に、入力として渡されます。

BaseHeal:

実行されたときに回復するヘルスの量。

回復とダメージの仕組み

デフォルトでは、Health 属性はモディファイアで非表示になっていて、通常の属性のようには、Gameplay Effects で直接変更できません。代わりに、その値は Healing 属性を通じて、さらに Custom Executions ULyraHealExecution および ULyraDamageExecution を通じて間接的に設定されます。

属性としてダメージと回復を扱うことは、変更された属性から個別のダメージ インスタンスを切り離すメリットがあり、ダメージ値での処理が簡単になります。重要な属性を誤って変更することを回避できます。Health 値は Gameplay Effect モディファイアに公開されていないので、基本値に一定時間または制限のないエフェクトを加えるリスク (いずれ問題を引き起こす可能性がある) がありません。

回復の実行

ULyraHealExecution はソースにおいて BaseHeal 属性のスナップショットを取得し、回復値が負にならないようにゼロで抑えます。最後に Target で Health 属性を変更します。これはソースで実行されるので、Health 値は問題なく変更できます。

ダメージの実行

ULyraDamageExecution は BaseDamageHealth 属性値を集計します。BaseDamage はソースでキャプチャされ、スナップショットが得られ、一方 Health はターゲットでキャプチャされます。衝突場所をチェックします (ダメージ数エフェクトをスポーンする場所が判明)。

ターゲットのチームでフレンドリ ファイアがないのかをチェックし、距離と物理マテリアルに基づいて減衰を適用します。最後に、ターゲットでの Health 属性を変更します。これはソース コードで実行するので、Health 値は問題なく変更できます。

ダメージ数値の Gameplay Cue は、Health 属性の変化を大きさとして受け取り、その生の (正規化されていない) 値から表示を導出するように設定されています。

追加情報

ダメージ数の仕組み

ダメージを与えるアビリティがアクティブ化されているとき、ヒットがあった内容を判定するためにテストを実行します。続いてアビリティはダメージ Gameplay Effects をターゲット アクタに適用します。

GameplayEffectParent_Damage_Basic (またはそこから継承した子) は、武器や手りゅう弾により適用されます。ダメージは、BaseDamage を Health に変換し、フレンドリ ファイアを選別する Execution を通じて適用され、Gameplay Cue GameplayCue.Character.DamageTaken は大きさで LyraHealthSet.Health キューに適用されます。

GCN_Character_DamageTaken はクライアントで呼び出されます。エフェクトの発生元がローカル プレイヤーである場合にのみ表示されます。ダメージは Gameplay Cue の raw の大きさで決まります。位置は、ヒット結果の位置の値で決まります。これはローカルの Controller の ULyraNumberPopComponent に渡されます。このコンポーネントは、表示とプーリングを処理し、実際のダメージを表示するために、ヒット位置で Niagara エミッタをスポーンし、設定します。

Lyra キャラクターを初期化する方法

ポーンの所有フロー、Game Feature 登録、レプリケートされた多様なゲーム フレームワーク値間の相互作用のため、プレイ可能なキャラクターの初期化フローは常に予測可能であるとは限りません。クライアントがサーバーのデータを待っている間に、順番通りにイベントが発生しないことがあります。

Lyra では UPawnExtensionComponent を実装することでこれを解決します。メインのジョブは、ポーンの AbilitySet を付与し、On Spawn Lyra Abilities をアクティブ化する前に、ポーンに関連するすべての初期化条件が満たされていることを確認することです。

Pawn Extension Component はさらにポーンのために付与されたアビリティを追跡し、キャラクターが破棄または所有が解除されたときに、オーナーの Player State から削除されます。

ULyraPawnData アセットを通じて、Ability Set を Pawn に割り当てできます。これらはコンテンツ ブラウザから作成でき、デフォルトの Pawn Data は Experience Definition で決定されます。

ポーンを初期化し、アビリティを割り当てるには、次の条件を満たす必要があります。

  • デフォルトのポーン データが有効である。

  • ポーンが有効なローカル コントローラーで所有されている、またはサーバー権限がある。

  • 関連する Player State と Input Component がポーンにレプリケートされ、有効である

ブループリントアセットの命名規則

プレフィックス

意味

GA_

Gameplay Abilities (ゲームプレイ アビリティ)

GE_

Gameplay Effects (ゲームプレイ エフェクト)

GCN_

Gameplay Cue Notifies (ゲームプレイ キュー通知:UGameplayCueNotify)

GCNL_

Latent Gameplay Cue Notifies (潜在ゲームプレイ キュー通知:AGameplayCueNotify_Actor およびサブクラスから継承)

Phase_

Game Phase Abilities (ゲーム フェーズ アビリティ)

AbilitySet_

Ability Set (アビリティ セット)

IA_

Input Action (入力アクション)

InputData_

Lyra Input Config (Lyra 入力コンフィグ)

W_

Widget UI (ウィジェットUI)

B_

その他のブループリント (ポーン タイプ、アイテム スポーナーなど)

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