<前文>
GameplayAbilities APIは何のために使用するのでしょうか?
前回は2週間ぶりのUE4C++の勉強だったので、何となく進めてしまいましたが、今週はもう少しGameplayAbilities APIについて目的や全体像などを含めた理解を深めたいと思います。
<本文>
<前回までの成果とその考察>
前回は、2週間ぶりのUE4C++の勉強だったので、簡単に済ませてしまいましたがそれでも以下に示す成果が上がりました。
1. GameplayAbilities のAPIはネットからは見つからないが、GameplayAbilities のクラスなどを定義した実際のコード内にきちんとしたRemarkが書かれており、それを読めばAPIと同じレベルの情報は得る事が出来た。
2. アクションRPGの解説で説明されているGameplay Ability Systemと今回のレシピで勉強している“GameplayAbilities API …”は同じ事である。
3. 以下の推測が正しいと仮定して勉強を継続する予定です。
- アビリティ―は列挙型(enum)で示します。
- UGameplayAbilityクラスからの派生クラスを作成します。この派生クラスで具体的なアビリティ―の内容を決定します。
- GameplayAbilitiesSetクラスからもオブジェクトを作成します。アビリティ―を列挙したenumとUGameplayAbilityクラスからの派生クラスを管理します。
4. Game Programming Patternsに出てくるType Objectとの関係については良く分からないです。この関係についての考察は一端保留して先にこのAPIの使用方法を理解します。
5. このAPIはマルチプレイで沢山のクライアントがサーバーに接続した状態でのクライアント同士の戦闘をスムーズに行うために開発されたものかもしれません。
まず、前回の成果について考察したいと思います。
最初に考察したいのが、2の結論「Gameplay Ability Systemと今回のレシピで勉強している“GameplayAbilities API …”は同じ事。」です。GameplayAbilities 関係の情報はネットで全然見つからなかったですが、Gameplay Ability Systemについての情報は少しはネット上にありそうです。この情報をもっと集めたいと思います。以下に示すように結構見つかりました。
まず、公式サイトからの情報です。
・Gameplay Abilities in Action RPG
・GameplayAbilities and You (Unreal Wiki)
・Action RPG | Project Spotlight | Unreal Engine Livestream
以下は日本語の情報です。
・猫でも分かる UE4の新しいサンプル「Action RPG」について(p77~)
公式サイト以外でGameplay Ability Systemについて述べたサイトを以下に示します。
Tom Looman氏による解説
・Tutorial: Creating a RAGE Potion in Epic’s Action RPG
・Gameplay Ability System Tutorial with C++ & Blueprint [Unreal Engine 4 RPG Game]
SabreDartStudiosによる解説
・Intro to Gameplay Abilities in Unreal Engine 4
Unreal Sydneyによる解説
・Intro to the Unreal Engine Gameplay Abilities Module - Unreal Sydney Meetup
以下は日本語の情報です。
おかわりはくまい氏による解説
・GameplayAbilitiesの使い方(セットアップ編)
探せばもっと出て来そうですが取りあえずは十分でしょう。これだけ情報があれば何とか成りそうですね。
1についてはそのままで、今回のGameplayAbilities のクラスや関数の目的についての簡単な解説はGameplayAbilities のAPIのRemarkを見る代わりに実際のコードにあるコメントをチェックしていきます。
3については上記のサイトを使用して確認してみます。全体像が見えると作業の進捗が全然違うので先週の続きを始める前に簡単にでも確認したいです。
4についてですが、4で言いたかった事は「GameplayAbilitiesのAPIを使用する目的は何なのか?」と言う事です。前回の勉強では、教科書から「GameplayAbilities APIを使用する事でゲームプレイ中のボタンを押すなどのイベントでアクターなどのアビリティ―をC++の関数から呼び出す事が出来る。」と結論づけましたがこの結論が正しいとすると、何でわざわざGameplayAbilitiesのAPIを使用する必要があるのかが良く分かりません。そこでGame Programming Patternsに出てくるType Objectを体現しているのかな?と勝手に想像していたのですが、この二つを同時に考えながらRecipeを勉強しても余計に混乱するので、一端白紙に戻して「GameplayAbilitiesのAPIを使用する目的は何なのか?」を上記のサイトから探してみます。GameplayAbilities APIをどうして使用するのか理解出来たらどのようにGameplayAbilities APIを使用するのかについても理解が深まると思います。
5についてですが、全く分かりません。前回、GameplayAbilities の構造体(struct)や関数の目的を調べていたら、やたらマルチプレイやサーバーとクライアントについての説明が出て来たからです。
以上をふまえて、先週の続きを勉強する前に、上記のサイトを読んでみます。
<上記のサイトらを読んで>
本来なら、公式サイトから当たっていくのが筋なのでしょうが、量が多いのと私のGameplayAbilitiesの知識が全くない事からビデオから見ていきます。
公式サイトなのでAction RPG | Project Spotlight | Unreal Engine Livestreamから見ました。10分ぐらい見た所で気が付いたのですが前にアクションRPGの作り方を勉強したくてネットを漁っていた時に既に1回このビデオは見ていました。その時の感想は全く意味が分からないでした。今回は前回よりもGameplayAbilitiesに関する知識は多少ですが増えているので、多少は理解出来るかもと思っていましたが最初のコメントに
と書かれていましたのでやっぱり観るのは中止しました。ので、このビデオで紹介されている事は全く分かりません。
次に、Tom Looman氏による解説のビデオGameplay Ability System Tutorial with C++ & Blueprint [Unreal Engine 4 RPG Game]を見ました。以下にそのサイトのイメージの一部を示します。
これはAction RPG内でGameplay ability systemをどのように使用するかについて解説しているようです。Action RPGを使用しないといけないみたいなので、今回は取りあえずスキップします。ただ初めて知ったのですがTom Looman氏はUE4C++の講座をUdemyで持っていて大変好評のようです。
その次にSabreDartStudiosによる解説Intro to Gameplay Abilities in Unreal Engine 4を見ました。以下にそのサイトのイメージの一部を示します。
最初から(0.49位)Gameplay Ability Systemが何故重要なのかについて語っています。私が理解した範囲ですがSabreDartStudiosによる解説によると、ネットワークゲームでプレイヤーが魔法を使用した場合、サーバーの許可がない状態でも魔法が使用出来ます。これはサーバーの許可を待っていたら動きがスムーズでなくなりゲームでの対戦に影響が出るからです。しかし後からサーバーがそのプレイヤーの魔力がその魔法を打てるほどない事からその魔法を打つ許可を与えなかった場合、そのプレイヤーが魔法を打った事やその魔法による敵のダメージなど全てなかった事にしてしかもそれ以外は全て実際にゲーム内で起こった通りにする事が出来るそうです。これを行うためにGameplay AbilitiesのAPIでは最低限のコードだけで2万行あるそうです。
すごい。
これがGameplay AbilitiesのAPIの真の目的だったのですね。
そういえばポケモンgoのジム戦でHPが非常に少ない時に敵のゲージ技を避けると避けているにも関わらず一端死んだことになってその後復活するのですが透明になってしまうバグがありました。
このサイトに詳しく説明されていました。以下にそのサイトのイメージの一部を示します。
このバグはずっと放置されていて現在も治っているのか不明みたいです。私は詳しくは知らないのですがこのバグのせいでジムでの強いポケモンが結構変わってしまうみたいです。なのでかなり昔からこのバグを直してほしいとの要望が世界中から出されているにも関わらず放置されている謎のバグとしてユーザーから認知されているようです。
このバグそのものについてはどうでもいいですが、重要な事はポケモンgoでも攻撃判定の正誤をサーバーが後で判定してその結果がクライアントに伝わる前にゲーム内では攻撃が成功したと仮定して進行し、その後サーバーから攻撃判定が誤と伝えられた場合はゲーム内での攻撃に関する部分のみの巻き戻しが行われている事です。確かポケモンgoはunityで作成されているはずですがunityにもUE4のGameplay abilityの APIに近い機能があるのでしょう。
ウーン。とうとうGameplay abilityの真の目的が理解出来ました。
これは凄いビデオを発見してしまったと、大喜びでSabreDartStudiosによる解説Intro to Gameplay Abilities in Unreal Engine 4の続きを見たのですが、その後はSabreDartStudiosが前に作成したマルチプレイ式のゲームを使用しての説明になってしまい、全く意味が分からなくなってしまいました。どうもSabreDartStudiosも講座を独自に作っていてその生徒に対しての説明の一環としてこのビデオを作成したみたいです。以下に示すコメントが示すように、SabreDartStudiosの講座は全部YouTube上に公開されているようですが、Gameplay abilityの APIの使い方を学ぶのにマルチプレイ式のゲームの作り方を1から勉強するわけには(少なくとも今は)行きませんので、
取りあえず、このビデオはここまでにします。
最期のビデオになりましたがUnreal Sydneyによる解説Intro to the Unreal Engine Gameplay Abilities Module - Unreal Sydney Meetupを見てみます。
見る前に気がついたのですが、このビデオ再生数も少ないしチャンネル登録者数はたったの20人でした。しかもしゃべっている人が高校生?ぐらいの年齢の子でした。ので、あんまり期待しないで見たのですが内容は凄いの一言でした。
まず、Gameplay abilityの APIの目的ですが「gameplayの扱い+それらの複製と予測」と軽く説明がされてました。複製と予測とは「サーバーが許可する前にプレイヤーの魔法が取りあえず発動して…」の事を指しているはずです。このビデオのスゴイ所はその後になぜこれが必要なのかも説明している所です。
このビデオの解説ではGameplay abilityの APIの長所は4点あります。
1. エンジニアがネットワークの予測と複製をC++を使用して扱う事が出来る。
2. その一方でデザイナーがBPを使用してメカニックを簡単に微調整出来る。
3. デザインチームが思いつく全てをサポートするに十分な一般性がある。
4. ネットワークのロードを減らすために最適化している。
すごい。分かり易すぎる。その後でGameplay abilityの APIを理解するために必要な8つのコンセプトが紹介されています。
- AbilitySystemComponent
- AttributeSets
- GameplayTags
- GameplayEffects
- GameplayCues
- GameplayAbilities
- GameplayTasks
- GameplayEvents
だそうです。ビデオ内ではそれぞれのコンセプトの解説がありましたが、大変細部にわたった説明で現状の私の知識ではあまり理解出来なかったのでそこはスキップしました。
前回途中まで勉強したGameplayAbilitiesはGameplay abilityの APIの8大コンセプトの一つだったのですね。前回までの成果の3で述べた内容は、前回の勉強した範囲ではGameplay abilityの APIの全体像を理解するための現状最善の推測でしたがGameplay abilityの APIを理解するためならこの8大コンセプトを素直に使用した方が全然分かりやすそうです。
ところで、このビデオで使用したスライドの謝辞の部分でGameplayAbilities and You (Unreal Wiki)を作成したKAZ氏が助けてくれて大変助かったと書かれていました。
あれ?
KAZという名前はポーランドかどこかに僅かにあるらしいですがほぼ日本人なはずです。GameplayAbilities and You (Unreal Wiki)を作成した人ってひょっとして日本人?
もしかしてすっごい遠回りして勉強していた可能性が…。
まあいいです。
もうこうなったら毒食わば皿まででGameplayAbilities and You (Unreal Wiki)は最後に見ましょう。
全部ビデオは見てしまったので、今度はサイトを読んでいきます。まずは公式のサイトから行きます。
Gameplay Abilities in Action RPG
最初からGameplay AbilityのAPIを使用する目的が書かれています。
アクションRPG(ARPG)のサンプルはこのGameplay Abilities のプラグインをプレイヤーの振る舞いと敵の攻撃を扱うためにとHPや魔力などの定量的なデータの集まりの調整のために使用します。
この説明はその通りなんですが、これだと何であえてGameplay AbilityのAPIを使用しないといけないのかが初心者には分からないですね。勿論これを書いている人がマルチプレイ式のゲームをあえて持ち出さないのは初心者をいたずらに混乱しないためでしょうが、初心者はそんな事は全く分からないですから単に何であえて「Gameplay AbilityのAPIを使用するの?」です。私もUnreal Sydneyのビデオを見る前だったら同じでした。
その後で、このサイトでもGameplay abilityの APIを八つのコンセプトで分類しています。一見Unreal Sydneyのビデオと同じかと思ったのですが微妙に違っていました。以下に示します。
こちらの説明は、あまりネットワークに入っていなかったからか、一応、今の私の知識でも意味はわかる解説になっていましたので説明の部分も簡単に訳してみました。
Unreal Sydneyによる分類とGameplay Abilities in Action RPGの分類を比べてみると最初の5つは同じで残り3つに関しては同じ事を違う言い回しで述べているのかどうか不明です。
何で違うのか良く読んでみたら、
アビリティ―システムは沢山の機能がありますが、ARPGは以下に示す機能のみを使用します。
と説明されていました。あれ、勘違いしてました。Gameplay Abilities in Action RPGはAction RPGを通してGameplay Abilitiesを理解するためのチュートリアルでした。アクションRPGはある種のRPGを定義する言葉ですが、Epic Gameが提供してくれたアクションRPGを作成するためのサンプルゲームの名前もAction RPGなので勘違いしてました。
その次のAttributes and Effects In ARPGになると完全にAction RPGを通しての実践と解説になっていて、Action RPGを通してGameplay Abilitiesを理解したい人にはとってもいいチュートリアルですがそれ以外の人(つまり私)にはかなり分かりにくくなりました。ので次のサイトを見てみます。
こちらのサイトは、一般的なGameplay AbilityのAPIの使用方法の説明のようです。前回でも述べましたがGameplay Ability Systemの目的について以下の様に説明しています。
前回はこのサイトの述べている事がGameplay AbilityのAPIの事なのが分からなかったので軽く読んで終わりにしてしまいましたが今回は(かなり意訳になってしまいましたが)訳してみました。
前回は良く分かってない状態で読んでましたね。例えば属性なんかは定義が良く分かってなかったです。属性(attribute)はRPGにおける炎属性とか水属性の事を指すと思っていたのですがGameplay Abilities in Action RPGのサイトで説明されているようにHPやダメージなどの値の事でした。属性(attribute)などのGameplay AbilityのAPIで使用されている用語の定義はその後にかなりしっかりしかも厳密に紹介されていました。以下にGameplay Ability Systemからの用語の定義を簡単にまとめた内容を示します。
今週はここまででとし、これまでの成果を一端まとめます。
GameplayAbilities and You (Unreal Wiki)と日本語のサイトは来週勉強します。
<今週のまとめ>
前回は2週間ぶりのUE4C++の勉強だったので軽くやりました。しかしそれでも非常に重要な知見「Gameplay Ability Systemと今回のレシピで勉強している“GameplayAbilities API …”は同じ事である。」が確認出来ました。今回はその知見を基にしてGameplay Ability Systemを勉強する事でほとんど情報のないGameplayAbilities APIについてその目的や全体像についての理解を深める事が出来ました。
以下にGameplayAbilities APIの目的と全体像についての推測をまとめます。
- GameplayAbilities APIの目的はアクションRPGやマルチプレイ式のゲームにおいてプレイヤーとその敵とのお互いの干渉(例えば攻撃とそのダメージ)とそれぞれのキャラクターの持つパラメーターを管理するためのAPIであると考えられます。
- このAPIを使用する最重要な点はマルチプレイ式のゲームにおいて複製と予測を行う事です。それは例えば、サーバーの許可がない状態でもクライアントの扱うキャラクターは攻撃が出来て更に後でその攻撃が無効だった場合その攻撃がなかった事それ以外はあった事にゲーム内の現実を変化する事が出来る事です。これによってクライアントはサーバーの返事を待たずに攻撃などの行動を行う事が出来き、ゲーム内のプレイヤーの反応が非常にスムーズになります。
- GameplayAbilities APIは、主にAbilitySystemComponent, AttributeSets, GameplayTags, GameplayEffects, GameplayCues, GameplayAbilities, GameplayTasksとGameplayEventsで構成されるとみられます。