<前文>
WebGPU
最近、3D graphicsの業界に疎くなってしまったんですが、その理由は3つあります。
- 最新の3D graphics APIは、低レベル化が進んで大学院や大企業で研究開発する人以外勉強しても益がない。
- Vulkan、MantleそしてDirectX12の3つが同時に存在しているのは、multi-threadに対応した3D graphics APIの最適解がまだ見つかっていないからと言う気がしている。
- 個人が勉強するならばUE4やUnityなどのゲームエンジンの使用方法を勉強した方が役に立つ。
それでWebGPUも名前しか知らなくて「どうせWebGLの後継APIなんでしょ。」と勝手に思っていました。しかし最近WebGPUについてまとめた動画を見たら、単なるWebGLの後継APIと言うよりはVulkan、MantleそしてDirectX12の3つの良いとこ取りをした最新の3D Graphics APIらしいです。
それで突然興味が湧いてきました。しかしこれを勉強するとなるとそれなりに時間と労力が取られるので、理解出来ました以上の成果がないと継続が困難になる事は確実です。(あるいは10倍の簡単さで理解出来るような天才的な教科書が有れば、取られる時間や労力が10分の1になるので知的好奇心を満足させるだけでもいいかもしれません。)
うーん。やっぱり二の足を踏んでしまいますね。
ただ、益はなくても勉強しない事によって害が生まれる可能性もあります。
今回のVtuberの中国における炎上は、私にとって中国人が味方ではなく敵になる可能性について考えさせられました。アメリカにいた時は、同じアジア人ですから中国人は基本的に味方なんです。大学で勉強していても解けない宿題を中国人の友達に聞きに行ったりしたりしていました。今の日本人のソフトエンジニアだって自分で分からなかった時は中国人の同僚に聞けばいいや。と軽く考えている人はいっぱいいると思います。
もしその中国人から明日からお前には何も教えない。と言われたら結構窮地に陥ります。その時に交渉出来る材料としてWebGPUの専門家になっておく。と言うのは有りかなと思います。
うーん。でもそれなら私の場合はUE4の専門家でもいいですね。
それでは、今週の勉強を始めます。
<本文>
前に予定していた作業内容の内、魔法の拾得の改良を行います。
具体的に言うと以下の事を考えています。
をやって行きます。
1. Talent [Skill] Tree Builderについての勉強
が無料で配布されていたので、これの使い方を勉強してみます。もし魔法の拾得に使えそうならば使用します。
初っ端からですが、Create Projectになっていてます。既にあるProjectに追加する事は出来るんでしょうか?
1.1 解説を読む
Talent/Skill Tree systemってどんなシステムなんでしょうか? Tree diagramの事なんでしょうか?ゲームを普段しない私はこういうゲーム関係の専門用語が良く分かりません。
以下の事が出来ると書かれています。
- キャラクターの属性の調整
- 名前によるアイテムの解除
- タイプによるあるグループのアイテムの解除
キャラクターの属性って何なんでしょうね。ポケモンの火属性とか、水属性みたいなのを指しているんでしょうか?名前によるアイテムの解除も良く分かりませんね。キャラクターの名前によって使用出来るアイテムが変わるんでしょうか?タイプによるあるグループのアイテムの解除は、キャラのタイプ(例えば職業とか?)によって使用出来るアイテムが違うと言う事なんでしょうか?
更に4つのPresetが提供されているとあります。それは、
- 伝統的な垂直木
- 武器(人工的な?)の才能?
- 才能のスイッチャー?
- 水平木
垂直木と水平木(vertical tree and Horizontal tree)は、多分、Tree diagramの事を指していると思われます。2と3の才能(talent)は技術(skill)の事を言っているのでしょうか?
中身を見てから検討します。
まず、Tutorialが紹介されています。
動画なので後で見ます。
Descriptionの所をみると木の作成方法が説明されています。
これだけでは分かりませんね。
まずクラス(例:メイジ)を作成せよとありますが、普通のUE4のクラスにはMageはありません。このPlugInにMage Classが付いているのでしょうか?それともCharacterクラスから派生してMageクラスを作成するのでしょうか?
次に特技(specialization)を作成せよ。とあります。うん。これから推測すると、このPlugInには特別なクラスが付属されていそうですね。
最後に才能(技術?)のdata tableを作成せよ。とあります。これはサンプルを見れば作れそうです。
ここまで読んだだけですが、結構簡単に作成出来そうですね。続きを読んでいきます。
出来る事の一覧が載っています。ここは後で読みます。
以下のBPが含まれているそうです。
Tutorialが2つありますね。これらも見てみましょう。
次は、動画を見てみます。
この動画は上の説明を映像を交えて説明しているみたいですね。操作の仕方が分からない時に参考にしましょう。
1.2 実際にやってみる
それではTalent [Skill] Tree Builderからprojectを作成してみます。
Ch4_3が4.24なので同じVersionで作成しました。
Playボタンを押すと以下の画面になります。
30分程度いじってみました。理解した所をまとめます。
右のWidgetに書かれていますがTまたはNを押すとTalentsウィジェットが開きます。
動画で説明されていたのと同じです。
動画ではそれ以外に以下に示したウィジェットが表示されています。それぞれ
Switcher,
Horizontal,
weapon,
と紹介されています。
これらの画面が見たいのですが開けません。
Projectに付属のTutorialなどをやって分かったのですが、以下に示したDT_ClassesデータテーブルのAssaultが今の実装だと選ばれているようです。
これをSwitchSampleClassに変更すれば
この画面が表示されるはずです。
調べて見るとW_MainWindowウィジェットの以下の部分、GetHeroClass関数がAssaultを返していると分かりました。
GetHeroClass関数の実装を見てみると
Assaultに固定されていて変更出来ません。以下に示した方法でSwitchSampleClassに変更しました。
テストします。
惜しい。Class Specializaionがありませんと出て来ました。
だったらAssaultのClassTreesを
から
に変えてみました。
うん。ClassTreeだけなら呼び出せますね。同様にHorizontal TreeやWeapon Treeも呼び出せました。
うーん。ここまであるならなんで表示出来ないですかね。
1.3 色々なTreeを表示させる
ありました。Sample CharacterのDefaultの項目にClassがありました。これをSwitcher Sample Classに変更します。
他のも試してみます。
うん。なるほど。大体分かりました。
最初に出て来たコレらは、このTree diagramらの事を指していました。調べたらRPGでは、これらをskill tree systemと呼ぶそうです。
今のRPGはレベルが上がると魔法が使えるのではなくて、レベルが上がるとTalent pointが貰えてそれに応じて使用出来る魔法を自分で選んで開放するんですね。
こっちの事実の方が驚きでした。
せっかくここまで使用方法が分かったので、もう少し遊んでみようと思います。
1.4 自分でTreeを作成してみる
TutorialでMageクラスを作成する方法が説明されていたのでやって見ました。
何も表示されていませんね。もう少し改良してみます。
多少は見やすくなったでしょうか?
まずは、矢印を表示させたいですね。後、クリックしても使用可能になりませんね。
1.4.1クリックして使用可能にするには?
DT_Talentの
Test_FireのNeed_SpendPointsを0にする必要がありました。
出来ました。
1.4.2 矢印を表示させるには?
DT_TalentsのNeed_Parentsにelementを追加するとArrowElementsの項目が出現します。そこで適切な矢印を選択します。
これで矢印が表示出来ます。
1.5 他の機能を試してみる
Descriptionには以下の事が出来ると書かれています。全部試すのは無理ですが、幾つか試してみます。
1.5.1 Can modify stats [+/-/+%/-%/*]
これのやり方はTutorialに書かれていました。
Test_Fireを開放するとHealthが10上がる様にしました。
100から110に変化しました。
[-/+%/-%/*]の条件はStatModifier_ModOPで選ぶ事が出来ます。
1.5.2 Can unlock abilities [3 sample abilities included]
まず、提供されている3つのサンプル能力とは以下の
Heal, Immune, そしてAoEの事です。HealとImmuneはいいですが、AoEって何の事なんでしょうか?
これが、Healですね。
これがimmuneです。炎に突っ込んでもHealthが減らなくなりました。
最後にAoEです。
Area Of Effectの事だそうです。
この範囲で魔法の影響が出ると言う事でしょうか?
作成方法ですがHealを見て推測しましょう。
Assaultの場合、上記のtalentを開放するとHealが使用出来るようになります。
DT_Talentを見るとHealing AbilityがAssult_Gunmanの所にありました。
そしてA_GM_HealingのTalentBornusesを見るとBonusTypeがUnlockSkillName、UnlockNameがHealになっています。
うん。これをそのままコピってみましょう。
M_Fire_testのTalentBornusesをA_GM_Healingと同じにしました。
Mageに変更してTalent Tree画面を開き、TestFireを開放します。
1を押してHealが使用出来るか試します。
出来ました。
今度はBPを見てどのようにSkillが管理されているか調べましょう。
SimpleCharacterのBPではUnlocked Abilities変数が使用出来るskillを管理しているみたいです。
正し、このUnlocked Abilities変数はNameの配列なので、どんなTextでも保持出来ますね。
Healを発動させるために、1を押す必要がありますが、そこでUnlocked Abilities変数内にHealがあるかチェックしていました。
種も仕掛けもない非常に愚直な方法でskillを発動させてますね。
その後でParticleを発動させています。
一応、Particle Systemもチェックしておきます。
もう分かりました。
SkillだけじゃなくてこのPluginの仕組みも大体理解出来ました。
1.6 Talent [Skill] Tree Builderは他のprojectに移植出来るのか?
今までの理解の範囲で語るのならTalentTreeBuilderのフォルダー丸ごとmigrateして
SampleCharacterのBPをThirdPersonCharacterに丸コピーすれば出来そうです。
多少は継承関係を直したり他の関数をコピーしたりする必要はあるかもしれせんが、それで出来そうです。
1.7 今のRPGゲームに使用するのか?
しません。これ完全にオーバーキルな機能です。しかも今から使用するとなると今まで作成した部分に大幅な変更が必要になる可能性があります。
1.8 Talent [Skill] Tree Builder1の総括
以下の事を学びました。
- 経験値を自分で振り分けて使用出来るアイテムや魔法を決定出来るというアイデア
- UIの表現方法
- データの整理の仕方
2と3についてはこれからもTalent [Skill] Tree Builder1を何回も見て参考にしていこうと思います。
2. レベルアップのテストと改良
流石に、Pluginの使い方を見るだけでは物足りないのでもう少しだけやります。
2.1 レベルアップの復習
どうやってキャラクターがレベルアップしているのか覚えていません。その復習からやります。
RPGGameModeBaseクラスのTick()関数内で戦闘勝利後に、敵のモンスターの金貨と経験値を獲得するコードがあります。
その直ぐ後に、獲得した経験値が次のレベルにふさわしいかどうかをチェックするコードが書かれています。
最初に戦士のレベルを管理するデータテーブルSoldierLevelUpを読み込みます。
その直ぐ後に、獲得した経験値が次のレベルにふさわしいかどうかをチェックするコードが書かれています。
最初に戦士のレベルを管理するデータテーブルSoldierLevelUpを読み込みます。
SoldierLevelUpを開いて見てみると、MagicNameの項目がありました。このデータテーブルを作成した時は、レベルが上がったら即、魔法が覚えられる設定だったのでMagicNameの項目を作成したんでした。
そしたら、まだコードは残っていました。
思い出してきました。
魔法の名前は日本語にしたいのですが、UE4C++のFStringに直接日本語を読み込ませると、文字化けしてしまったんでした。
因みに、魔法の種類を管理しているデータテーブルは以下の様になっています。
うーん。ここに新しい項目、local nameでも作成してRow Name にはfire1, fire2 としてlocal nameには炎(小)、炎(大)とすれば別に神殿云々しなくても出来そうですね。
それはともかくとして、レベルアップに関しては良く出来ていました。特に直す必要はなさそうです。
2.2 魔法の習得の確認
魔法の名前を英語名にすれば、レベルアップ時に魔法も覚えられるはずです。それを確認します。
レベル2に上がった時にfire1が覚えられるようにセットしました。
テストします。
エラーが出ました。プレイヤーの操作するキャラが、炎(小)の消費魔力以上の魔力があるかどうかをチェックする箇所でした。
Fire1を新しくセットしました。
出来ました。レベル2になったら魔法Fire1が使用出来る様になりました。
この方法で魔法が習得出来る様になると神殿とか考える必要なくなりますね。こっちで魔法は習得出来るようにします。
3. レベルアップと魔法の習得
FMagicsDataにFStringタイプの変数、MagicLocalNameを追加します。
ビルドしました。
あれ、いつもここで一回だけクラッシュしたと思ったんですがしませんね。念のために一回UE4Editorを閉じてやり直します。
データテーブル、MagicsのRow NameとMagic Local Nameに新しい名前を追加しました。
テストします。
エラーは起きませんでしたが、魔法の名前がfire1, fire2になっていました。
炎(小)、炎(大)に変えます。
RowNameをFStringで保存していたので、FString->FText->FNameに変化させる必要がありました。正直この3つのタイプの違いが良く分かっていません。ここでちょっと勉強します。
このサイトに丁寧な説明がありました。
理解した範囲で以下にまとめると、
- FStringが一番コストが掛かるがsearchなどの機能が使用出来る。
- FTextはText Localizationが可能。
- FNameは何も出来ないがコストが最も低い。
となると単純な結論を言えば、FStringは他のタイプの上位交換と言う事でしょうか。Text Localizationについてはちょっと勉強しないと理解出来ない部分がありそうですが、後で暇なときに勉強します。
テストします。
はい。今度は炎(小)、炎(大)が表示されました。
コメント欄を見てみると、Fire1が選択されたと表示されています。これを直します。
ウィジェットMagicのBPでデータテーブルのmagicsのmagic Local Nameが何回も使用されるので、FStringタイプの変数、LocalNameOfMagicにデータテーブルのmagicsのmagic Local Nameを保持する事にしました。
その変数を適切な個所で使用します。
テストします。
出来ました。
4. 今後の課題
4.1 UIとそこに表示されるコメントについて
一応、レベルアップにおける魔法の習得が可能になりました。しかし課題が多く見つかりました。まず戦闘中のセリフはそれぞれのコードの中で管理されていてどこでどんなセリフが呼ばれているのか全く分からないです。一括で管理するシステムを作らないと今日みたいに見直した時に訳が分からなくなります。
コメントの表示方法については、もっと適切なUIがある気がします。戦闘中の画面とポーズ画面、更に普段の会話画面のコメントの表示方法が全部バラバラです。統一した方がユーザーに分かり易いはずです。
コメントの内容についても、改善しなければならない点が沢山あります。まず報連相が必要です。ユーザーはゲームの内部で何が起きているのか全く分かりません。適切な報連相がなければゲームをプレイする事がつまらなくなって継続しなくなるでしょう。
これらの課題については来週、考えてみます。
5. まとめと感想
今週はここまです。来週はLandScapeについてもう少し勉強して、村の地面がデコボコするようにします。