Lyra では、ゲームプレイの大部分のオーケストレーションに Gameplay Ability System (GAS) が使用されています。アビリティは、ジャンプなど、主人公のデータに元々備わっている場合もあれば、ゲームの機能などのアクション、Experience から付与される場合や、Equipment から付与される場合などもあります。
Gameplay Ability System の内容と使用する理由
Gameplay Ability System は、ゲームプレイ メカニクスをすばやく実装し、繰り返し利用するためのフレームワークを提供するプラグインです。マルチプレイヤーを対象とする複雑なゲームプレイ メカニクスのコードを作成する際には、多くの異なるゲーム タイプに適用される共通機能ボイラープレート コードを多数作成する必要があります。
GAS は、メカニクスをゲーム設計の共通パターンにできるだけ抽象化しようとするため、プロジェクトごとにコンテキストが変わってもゲームプレイ実装に関わる共通の問題を解決するフレームワークとして利用できます。 samples-and-tutorials/sample-games/lyra-game-sample/lyra-input-settings ボイラープレート コードを作成すると、特にマルチプレイヤー ゲームでは、エラーが発生しやすく、時間もかかります。たとえば、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 で仲介されます。 |
Game Feature Actions | UGameFeatureAction_AddAbilities は、アクティベーション時にアクタに Ability Set を付与できます。これらのアクションは Game Feature プラグインまたは Experience Definition (エクスペリエンス定義) 自体に追加できます。 |
Equipment | ULyraEquipmentDefinitions は、それらが追加されるアクタに AbilitySet も付与できます。これはエクスペリエンスがロードされたときに、ULyraPlayerState で仲介されます。 |
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 に設定されているからで、アビリティが終了するまで、冗長なアクティベーション メッセージが無視されます。 |
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++ で拡張し、CheckCost と ApplyCost 仮想関数をオーバーライドすることによりカスタム コストを作成できます。
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 イベントは、次の順でアビリティ コストをコミットします。
|
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 が呼び出されるとき、キャラクターがローカルでコントロールされる場合、ネイティブのトレース ターゲットを実行し、次の順でターゲット データを作成します。
|
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 関数をオーバーライドします。これは以下の起動アクティベーション チェックロジックをブループリントで実装したものです。
|
GA_Grenade | このアビリティは、Ability.Type.Action.Grenade タグのアセットで、InputTag.Weapon.Grenade によってアクティブ化されます。これは GE_Grenade_Cooldown をクールダウン エフェクトとして使用します。On Pawn Avatar Set は、ローカルクライアントの UI Extension Subsystem でウィジェットを登録し、アビリティインスタンスごとにウィジェットが 1 つだけ追加されるようにします。On Activation はアビリティ コストとクールダウンをチェックし、コミットします。いずれかのチェックが失敗するとアビリティが終了します。次のプロセスで実行されます。
|
GA_ADS (Aim Down Sights) | HUD 表示ボタンを処理するため GA_AbilityWithWidget から継承します。このアビリティは、Ability.Type.Action.ADS タグのアセットで、InputTag.Weapon.ADS によってアクティブ化され、Event.Movement.ADS タグを付与します。アクティブな間、ローカル予測 (Local predicted) されます。つまり、クライアントですぐに実行され、サーバーは追いつくために同期します。アクティベーション時:
|
GA_Hero_Dash | GA_AbilityWithWidget から継承します。このアビリティは、InputTag.Ability.Dash タグのアセットで、Ability.Type.Action.Dash によってアクティブ化されますEvent.Movement.Dash を付与します。アクティブにすると、クールダウン エフェクトを使用します。GE_HeroDash_Cooldown:クールダウンのアクティベーション時:
|
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 は BaseDamage と Health 属性値を集計します。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_ | その他のブループリント (ポーン タイプ、アイテム スポーナーなど) |