UE4の勉強記録

UE4の勉強の記録です。個人用です。

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する 魔法の習得システムの改良

f:id:kazuhironagai77:20201101215749p:plain

<前文>

WebGPU

最近、3D graphicsの業界に疎くなってしまったんですが、その理由は3つあります。

  1. 最新の3D graphics APIは、低レベル化が進んで大学院や大企業で研究開発する人以外勉強しても益がない。
  2. Vulkan、MantleそしてDirectX12の3つが同時に存在しているのは、multi-threadに対応した3D graphics APIの最適解がまだ見つかっていないからと言う気がしている。
  3. 個人が勉強するならばUE4やUnityなどのゲームエンジンの使用方法を勉強した方が役に立つ。

それでWebGPUも名前しか知らなくて「どうせWebGLの後継APIなんでしょ。」と勝手に思っていました。しかし最近WebGPUについてまとめた動画を見たら、単なるWebGLの後継APIと言うよりはVulkan、MantleそしてDirectX12の3つの良いとこ取りをした最新の3D Graphics APIらしいです。

それで突然興味が湧いてきました。しかしこれを勉強するとなるとそれなりに時間と労力が取られるので、理解出来ました以上の成果がないと継続が困難になる事は確実です。(あるいは10倍の簡単さで理解出来るような天才的な教科書が有れば、取られる時間や労力が10分の1になるので知的好奇心を満足させるだけでもいいかもしれません。)

うーん。やっぱり二の足を踏んでしまいますね。

ただ、益はなくても勉強しない事によって害が生まれる可能性もあります。

今回のVtuberの中国における炎上は、私にとって中国人が味方ではなく敵になる可能性について考えさせられました。アメリカにいた時は、同じアジア人ですから中国人は基本的に味方なんです。大学で勉強していても解けない宿題を中国人の友達に聞きに行ったりしたりしていました。今の日本人のソフトエンジニアだって自分で分からなかった時は中国人の同僚に聞けばいいや。と軽く考えている人はいっぱいいると思います。

もしその中国人から明日からお前には何も教えない。と言われたら結構窮地に陥ります。その時に交渉出来る材料としてWebGPUの専門家になっておく。と言うのは有りかなと思います。

うーん。でもそれなら私の場合はUE4の専門家でもいいですね。

それでは、今週の勉強を始めます。

<本文>

前に予定していた作業内容の内、魔法の拾得の改良を行います。

f:id:kazuhironagai77:20201101215847p:plain

具体的に言うと以下の事を考えています。

  1. Talent [Skill] Tree Builderについての勉強 
  2. レベルアップのテストと改良
  3. 神官NPCか巫女NPCの作成
  4. 神殿の作成

をやって行きます。

1. Talent [Skill] Tree Builderについての勉強

f:id:kazuhironagai77:20201101220004p:plain

が無料で配布されていたので、これの使い方を勉強してみます。もし魔法の拾得に使えそうならば使用します。

初っ端からですが、Create Projectになっていてます。既にあるProjectに追加する事は出来るんでしょうか?

1.1 解説を読む

f:id:kazuhironagai77:20201101220029p:plain

Talent/Skill Tree systemってどんなシステムなんでしょうか? Tree diagramの事なんでしょうか?ゲームを普段しない私はこういうゲーム関係の専門用語が良く分かりません。

以下の事が出来ると書かれています。

  1. キャラクターの属性の調整
  2. 名前によるアイテムの解除
  3. タイプによるあるグループのアイテムの解除

キャラクターの属性って何なんでしょうね。ポケモンの火属性とか、水属性みたいなのを指しているんでしょうか?名前によるアイテムの解除も良く分かりませんね。キャラクターの名前によって使用出来るアイテムが変わるんでしょうか?タイプによるあるグループのアイテムの解除は、キャラのタイプ(例えば職業とか?)によって使用出来るアイテムが違うと言う事なんでしょうか?

更に4つのPresetが提供されているとあります。それは、

  1. 伝統的な垂直木
  2. 武器(人工的な?)の才能?
  3. 才能のスイッチャー?
  4. 水平木

垂直木と水平木(vertical tree and Horizontal tree)は、多分、Tree diagramの事を指していると思われます。2と3の才能(talent)は技術(skill)の事を言っているのでしょうか?

中身を見てから検討します。

まず、Tutorialが紹介されています。

f:id:kazuhironagai77:20201101220118p:plain

動画なので後で見ます。

Descriptionの所をみると木の作成方法が説明されています。

f:id:kazuhironagai77:20201101220141p:plain

これだけでは分かりませんね。

まずクラス(例:メイジ)を作成せよとありますが、普通のUE4のクラスにはMageはありません。このPlugInにMage Classが付いているのでしょうか?それともCharacterクラスから派生してMageクラスを作成するのでしょうか?

次に特技(specialization)を作成せよ。とあります。うん。これから推測すると、このPlugInには特別なクラスが付属されていそうですね。

最後に才能(技術?)のdata tableを作成せよ。とあります。これはサンプルを見れば作れそうです。

ここまで読んだだけですが、結構簡単に作成出来そうですね。続きを読んでいきます。

出来る事の一覧が載っています。ここは後で読みます。

以下のBPが含まれているそうです。

f:id:kazuhironagai77:20201101220237p:plain

Tutorialが2つありますね。これらも見てみましょう。

次は、動画を見てみます。

f:id:kazuhironagai77:20201101220302p:plain

この動画は上の説明を映像を交えて説明しているみたいですね。操作の仕方が分からない時に参考にしましょう。

1.2 実際にやってみる

それではTalent [Skill] Tree Builderからprojectを作成してみます。

f:id:kazuhironagai77:20201101220337p:plain

Ch4_3が4.24なので同じVersionで作成しました。

Playボタンを押すと以下の画面になります。

f:id:kazuhironagai77:20201101220358p:plain

30分程度いじってみました。理解した所をまとめます。

f:id:kazuhironagai77:20201101220422p:plain

右のWidgetに書かれていますがTまたはNを押すとTalentsウィジェットが開きます。

f:id:kazuhironagai77:20201101220443p:plain

動画で説明されていたのと同じです。

f:id:kazuhironagai77:20201101220500p:plain

動画ではそれ以外に以下に示したウィジェットが表示されています。それぞれ

Switcher,

f:id:kazuhironagai77:20201101220519p:plain

Horizontal,

f:id:kazuhironagai77:20201101220542p:plain

weapon,

f:id:kazuhironagai77:20201101220602p:plain

と紹介されています。

これらの画面が見たいのですが開けません。

Projectに付属のTutorialなどをやって分かったのですが、以下に示したDT_ClassesデータテーブルのAssaultが今の実装だと選ばれているようです。

f:id:kazuhironagai77:20201101220623p:plain

これをSwitchSampleClassに変更すれば

f:id:kazuhironagai77:20201101220700p:plain

この画面が表示されるはずです。

調べて見るとW_MainWindowウィジェットの以下の部分、GetHeroClass関数がAssaultを返していると分かりました。

f:id:kazuhironagai77:20201101220742p:plain

GetHeroClass関数の実装を見てみると

f:id:kazuhironagai77:20201101220758p:plain

Assaultに固定されていて変更出来ません。以下に示した方法でSwitchSampleClassに変更しました。

f:id:kazuhironagai77:20201101220824p:plain

f:id:kazuhironagai77:20201101220833p:plain

テストします。

f:id:kazuhironagai77:20201101220854p:plain

惜しい。Class Specializaionがありませんと出て来ました。

だったらAssaultのClassTreesを

f:id:kazuhironagai77:20201101220910p:plain

から

f:id:kazuhironagai77:20201101220931p:plain

に変えてみました。

f:id:kazuhironagai77:20201101220948p:plain

うん。ClassTreeだけなら呼び出せますね。同様にHorizontal TreeやWeapon Treeも呼び出せました。

f:id:kazuhironagai77:20201101221034p:plain

f:id:kazuhironagai77:20201101221042p:plain

うーん。ここまであるならなんで表示出来ないですかね。

1.3 色々なTreeを表示させる

ありました。Sample CharacterのDefaultの項目にClassがありました。これをSwitcher Sample Classに変更します。

f:id:kazuhironagai77:20201101221107p:plain

f:id:kazuhironagai77:20201101221122p:plain

他のも試してみます。

f:id:kazuhironagai77:20201101221153p:plain

f:id:kazuhironagai77:20201101221204p:plain

うん。なるほど。大体分かりました。

f:id:kazuhironagai77:20201101221229p:plain

最初に出て来たコレらは、このTree diagramらの事を指していました。調べたらRPGでは、これらをskill tree systemと呼ぶそうです。

今のRPGはレベルが上がると魔法が使えるのではなくて、レベルが上がるとTalent pointが貰えてそれに応じて使用出来る魔法を自分で選んで開放するんですね。

こっちの事実の方が驚きでした。

せっかくここまで使用方法が分かったので、もう少し遊んでみようと思います。

1.4 自分でTreeを作成してみる

TutorialでMageクラスを作成する方法が説明されていたのでやって見ました。

f:id:kazuhironagai77:20201101221257p:plain

何も表示されていませんね。もう少し改良してみます。

f:id:kazuhironagai77:20201101221318p:plain

多少は見やすくなったでしょうか?

まずは、矢印を表示させたいですね。後、クリックしても使用可能になりませんね。

1.4.1クリックして使用可能にするには?

DT_Talentの

f:id:kazuhironagai77:20201101221347p:plain

Test_FireのNeed_SpendPointsを0にする必要がありました。

f:id:kazuhironagai77:20201101221416p:plain

出来ました。

1.4.2 矢印を表示させるには?

f:id:kazuhironagai77:20201101221442p:plain

DT_TalentsのNeed_Parentsにelementを追加するとArrowElementsの項目が出現します。そこで適切な矢印を選択します。

f:id:kazuhironagai77:20201101221503p:plain

これで矢印が表示出来ます。

1.5 他の機能を試してみる

Descriptionには以下の事が出来ると書かれています。全部試すのは無理ですが、幾つか試してみます。

f:id:kazuhironagai77:20201101221532p:plain

1.5.1 Can modify stats [+/-/+%/-%/*]

これのやり方はTutorialに書かれていました。

f:id:kazuhironagai77:20201101221602p:plain

Test_Fireを開放するとHealthが10上がる様にしました。

f:id:kazuhironagai77:20201101221638p:plain

100から110に変化しました。

[-/+%/-%/*]の条件はStatModifier_ModOPで選ぶ事が出来ます。

f:id:kazuhironagai77:20201101221658p:plain

1.5.2 Can unlock abilities [3 sample abilities included]

まず、提供されている3つのサンプル能力とは以下の

f:id:kazuhironagai77:20201101221721p:plain

Heal, Immune, そしてAoEの事です。HealとImmuneはいいですが、AoEって何の事なんでしょうか?

これが、Healですね。

f:id:kazuhironagai77:20201101221742p:plain

これがimmuneです。炎に突っ込んでもHealthが減らなくなりました。

f:id:kazuhironagai77:20201101221806p:plain

最後にAoEです。

Area Of Effectの事だそうです。

f:id:kazuhironagai77:20201101221828p:plain

この範囲で魔法の影響が出ると言う事でしょうか?

作成方法ですがHealを見て推測しましょう。

f:id:kazuhironagai77:20201101221848p:plain

Assaultの場合、上記のtalentを開放するとHealが使用出来るようになります。

DT_Talentを見るとHealing AbilityがAssult_Gunmanの所にありました。

f:id:kazuhironagai77:20201101222049p:plain

そしてA_GM_HealingのTalentBornusesを見るとBonusTypeがUnlockSkillName、UnlockNameがHealになっています。

f:id:kazuhironagai77:20201101222122p:plain

うん。これをそのままコピってみましょう。

M_Fire_testのTalentBornusesをA_GM_Healingと同じにしました。

f:id:kazuhironagai77:20201101222154p:plain

Mageに変更してTalent Tree画面を開き、TestFireを開放します。

f:id:kazuhironagai77:20201101222219p:plain

1を押してHealが使用出来るか試します。

f:id:kazuhironagai77:20201101222240p:plain

出来ました。

今度はBPを見てどのようにSkillが管理されているか調べましょう。

SimpleCharacterのBPではUnlocked Abilities変数が使用出来るskillを管理しているみたいです。

f:id:kazuhironagai77:20201101222326p:plain

正し、このUnlocked Abilities変数はNameの配列なので、どんなTextでも保持出来ますね。

f:id:kazuhironagai77:20201101222419p:plain

Healを発動させるために、1を押す必要がありますが、そこでUnlocked Abilities変数内にHealがあるかチェックしていました。

f:id:kazuhironagai77:20201101222450p:plain

種も仕掛けもない非常に愚直な方法でskillを発動させてますね。

その後でParticleを発動させています。

f:id:kazuhironagai77:20201101222521p:plain

一応、Particle Systemもチェックしておきます。

f:id:kazuhironagai77:20201101222611p:plain

f:id:kazuhironagai77:20201101222620p:plain

もう分かりました。

SkillだけじゃなくてこのPluginの仕組みも大体理解出来ました。

1.6 Talent [Skill] Tree Builderは他のprojectに移植出来るのか?

今までの理解の範囲で語るのならTalentTreeBuilderのフォルダー丸ごとmigrateして

f:id:kazuhironagai77:20201101222654p:plain

SampleCharacterのBPをThirdPersonCharacterに丸コピーすれば出来そうです。

f:id:kazuhironagai77:20201101222741p:plain

f:id:kazuhironagai77:20201101222750p:plain

多少は継承関係を直したり他の関数をコピーしたりする必要はあるかもしれせんが、それで出来そうです。

1.7 今のRPGゲームに使用するのか?

しません。これ完全にオーバーキルな機能です。しかも今から使用するとなると今まで作成した部分に大幅な変更が必要になる可能性があります。

1.8 Talent [Skill] Tree Builder1の総括

以下の事を学びました。

  1. 経験値を自分で振り分けて使用出来るアイテムや魔法を決定出来るというアイデア
  2. UIの表現方法
  3. データの整理の仕方

2と3についてはこれからもTalent [Skill] Tree Builder1を何回も見て参考にしていこうと思います。

2. レベルアップのテストと改良

流石に、Pluginの使い方を見るだけでは物足りないのでもう少しだけやります。

2.1 レベルアップの復習

どうやってキャラクターがレベルアップしているのか覚えていません。その復習からやります。

RPGGameModeBaseクラスのTick()関数内で戦闘勝利後に、敵のモンスターの金貨と経験値を獲得するコードがあります。

その直ぐ後に、獲得した経験値が次のレベルにふさわしいかどうかをチェックするコードが書かれています。

最初に戦士のレベルを管理するデータテーブルSoldierLevelUpを読み込みます。

f:id:kazuhironagai77:20201101222908p:plain

その直ぐ後に、獲得した経験値が次のレベルにふさわしいかどうかをチェックするコードが書かれています。

最初に戦士のレベルを管理するデータテーブルSoldierLevelUpを読み込みます。

f:id:kazuhironagai77:20201101222929p:plain

SoldierLevelUpを開いて見てみると、MagicNameの項目がありました。このデータテーブルを作成した時は、レベルが上がったら即、魔法が覚えられる設定だったのでMagicNameの項目を作成したんでした。

f:id:kazuhironagai77:20201101223004p:plain

そしたら、まだコードは残っていました。

f:id:kazuhironagai77:20201101223041p:plain

思い出してきました。

魔法の名前は日本語にしたいのですが、UE4C++のFStringに直接日本語を読み込ませると、文字化けしてしまったんでした。

因みに、魔法の種類を管理しているデータテーブルは以下の様になっています。

f:id:kazuhironagai77:20201101223109p:plain

うーん。ここに新しい項目、local nameでも作成してRow Name にはfire1, fire2 としてlocal nameには炎(小)、炎(大)とすれば別に神殿云々しなくても出来そうですね。

それはともかくとして、レベルアップに関しては良く出来ていました。特に直す必要はなさそうです。

2.2 魔法の習得の確認

魔法の名前を英語名にすれば、レベルアップ時に魔法も覚えられるはずです。それを確認します。

f:id:kazuhironagai77:20201101223204p:plain

f:id:kazuhironagai77:20201101223212p:plain

レベル2に上がった時にfire1が覚えられるようにセットしました。

テストします。

エラーが出ました。プレイヤーの操作するキャラが、炎(小)の消費魔力以上の魔力があるかどうかをチェックする箇所でした。

f:id:kazuhironagai77:20201101223240p:plain

Fire1を新しくセットしました。

出来ました。レベル2になったら魔法Fire1が使用出来る様になりました。

f:id:kazuhironagai77:20201101223306p:plain

この方法で魔法が習得出来る様になると神殿とか考える必要なくなりますね。こっちで魔法は習得出来るようにします。

3. レベルアップと魔法の習得

FMagicsDataにFStringタイプの変数、MagicLocalNameを追加します。

f:id:kazuhironagai77:20201101223412p:plain

ビルドしました。

あれ、いつもここで一回だけクラッシュしたと思ったんですがしませんね。念のために一回UE4Editorを閉じてやり直します。

データテーブル、MagicsのRow NameとMagic Local Nameに新しい名前を追加しました。

f:id:kazuhironagai77:20201101223437p:plain

テストします。

エラーは起きませんでしたが、魔法の名前がfire1, fire2になっていました。

f:id:kazuhironagai77:20201101223455p:plain

炎(小)、炎(大)に変えます。

f:id:kazuhironagai77:20201101223515p:plain

RowNameをFStringで保存していたので、FString->FText->FNameに変化させる必要がありました。正直この3つのタイプの違いが良く分かっていません。ここでちょっと勉強します。

このサイトに丁寧な説明がありました。

f:id:kazuhironagai77:20201101223534p:plain

理解した範囲で以下にまとめると、

  • FStringが一番コストが掛かるがsearchなどの機能が使用出来る。
  • FTextText Localizationが可能。
  • FNameは何も出来ないがコストが最も低い。

となると単純な結論を言えば、FStringは他のタイプの上位交換と言う事でしょうか。Text Localizationについてはちょっと勉強しないと理解出来ない部分がありそうですが、後で暇なときに勉強します。

テストします。

f:id:kazuhironagai77:20201101223608p:plain

はい。今度は炎(小)、炎(大)が表示されました。

コメント欄を見てみると、Fire1が選択されたと表示されています。これを直します。

f:id:kazuhironagai77:20201101223638p:plain

ウィジェットMagicのBPでデータテーブルのmagicsのmagic Local Nameが何回も使用されるので、FStringタイプの変数、LocalNameOfMagicにデータテーブルのmagicsのmagic Local Nameを保持する事にしました。

f:id:kazuhironagai77:20201101223658p:plain

その変数を適切な個所で使用します。

f:id:kazuhironagai77:20201101223718p:plain

f:id:kazuhironagai77:20201101223726p:plain

テストします。

f:id:kazuhironagai77:20201101223745p:plain

f:id:kazuhironagai77:20201101223753p:plain

出来ました。

4. 今後の課題

4.1 UIとそこに表示されるコメントについて

一応、レベルアップにおける魔法の習得が可能になりました。しかし課題が多く見つかりました。まず戦闘中のセリフはそれぞれのコードの中で管理されていてどこでどんなセリフが呼ばれているのか全く分からないです。一括で管理するシステムを作らないと今日みたいに見直した時に訳が分からなくなります。

コメントの表示方法については、もっと適切なUIがある気がします。戦闘中の画面とポーズ画面、更に普段の会話画面のコメントの表示方法が全部バラバラです。統一した方がユーザーに分かり易いはずです。

コメントの内容についても、改善しなければならない点が沢山あります。まず報連相が必要です。ユーザーはゲームの内部で何が起きているのか全く分かりません。適切な報連相がなければゲームをプレイする事がつまらなくなって継続しなくなるでしょう。

これらの課題については来週、考えてみます。

5. まとめと感想

今週はここまです。来週はLandScapeについてもう少し勉強して、村の地面がデコボコするようにします。