<前文>
3章の後はRPGのUIについての勉強ばかりです。そこでRPGにおけるUIのデザインについてもっと知っておく必要があると思い、スマートホン用のDQ5を買いました。暇なときに遊んでいます。DQのUIは、RPGのUIとしての完成形だと思いました。これを目標にして自分のUIを作成したいと思います。
<本文>
<目的>
「Unreal Engine4.xを使用してRPGを作成する」の9章、装備(Equipment)を勉強します。教科書によると、
- 武器のデータデーブル(The weapons Data Table)
- 武器と装備のスクリーンの変数のセット(Setting the weapon and equipment screen variables)
- 武器のボタンの作成(Creating the weapon button)
- 装備スクリーンの再訪(Revisiting the equipment screen)
- 装備スクリーンのテキストボックスのセット(Setting the equipment screen Text Blocks)
- 装備する時にキャラクターの状態を集める(Correcting character stats when equipping)
とありました。
<方法と結果>
<Step.0>
まずはサンプルコードを解凍してUE4エディターから動くかを確認します。いつもの通りですね。
息をするが如く簡単に出来ました。
今までと同じようにCh2を使用します。
<Step.1>
武器のデータテーブル(The weapons Data Table)
武器のデータテーブルを作成します。
教科書によると、ItemDataを親にしたDataTableから作成するそうです。勿論、名前はWeaponsです。
作成しました。
<Step.2>
教科書によると、それぞれのキャラクターにweaponsが必要になるみたいです。まだ良く分かりませんが、やって行くうちに判明するでしょう。
データテーブルWeaponsにDaggerを追加します。
値は、教科書と同じにしました。
<Step.3>
武器と装備のスクリーンの変数のセット(Setting the weapon and equipment screen variables)
まず、Step.2で作成した武器を装備するためのフレームワークを作成します。
まず、アイテムでやったように武器の配列をキャラクター内に作成する必要があります。
作成しました。
何で、arrayItemは単数形なのにarrayWeaponsは複数形なのでしょうか?
以下に教科書の図を示しますが、arrayItemは単数形なのにarrayWeaponsは複数形になっています。
ネイティブの人でも単数形と複数形の使い分けは結構いい加減ですね。
<Step.4>
- アイテムと武器の大きな違いは、アイテムはただ使用するだけですが、武器は装備したり装備を外したりする事です。
- そのため、装備画面のためのフレームワークを作成する必要があります。
- ので、FiledPlayerのブループリント内で、その装備画面を今開いているかどうかを表すBoolean変数、equipmentScreenを作成します。
だそうです。
はい。作成しました。
教科書だとarrayWeapons変数とequipmentScreen変数はprivateになっている(目が閉じている)のですが、いずれ他のブループリントから呼ばれるはずですのでpublicにしてあります。
<Step.5>
- Pause_Equipmentイベントグラフを開きます。
- イベントが初期化(construct)した時にequipmentScreenブーリアンをTrueにセットします。
- そしてプレイヤーがスクリーンを去った時にfalseにセットします。
- これは、Pause_Inventoryイベントグラフ内でinventoryScreenの変数を作成した時の方法と同じです。
とありました。
まず、Pause_Equipmentなんて作成したのかな?と思って調べたら、作成してました。
出来ました。
ここで普通にPause_Equipment ブループリント内で、EquipmentScreen変数をFieldPlayerから呼び出しているのですが、教科書の設定では、EquipmentScreen変数はprivateだったはずです。呼び出せるのでしょうか?
サンプルコードを見てみますが、やっぱりEquipmentScreen変数の目は閉じたままで、Privateの設定になっています。
うーん。良く分からない。これは考察で調べます。
<Step.6>
武器のボタンの作成(Creating the weapon button)
- 武器ボタンを作成します。
- そのためにまず、Itemウィジェットブループリントを複製します。
- それをWeaponと名付けます。
しました。
<Step.7>
Weaponブループリント内のinventoryScreenブーリアン変数をequipmentScreenブーリアン変数に取り替えます。
しました。しましたが、最初にすべきなのは、Weaponブループリント内のボタンの名前をItemからweaponに変更する事だと思います。
<Step.8>
BranchのYesの先のGetDataTableRawノードのDataTableをWeaponsに変更します。
しました。
<Step.9>
BreakItemsDataのATKとキャラクターのATKを足します。
以下に示すように直しました。
<Step.10>
以下に示す(教科書には図が示されている)図と同じように、WeaponウィジェットブループリントのonClickイベントが設定されているか確認してください。
はい。
教科書の図は小さすぎて非常に見にくいですが、同じです。確認出来ました。
<Step.11>
後、CharacterTarget変数にPartyMemberの状態をセットされているか確認して下さい。
されています。確認しました。
<Step.12>
装備スクリーンの再訪(Revisiting the equipment screen)
装備スクリーンを発展(populate)させます。
教科書に書かれている通りにPause_Equipmentウィジェットブループリント内のEvent Constructに武器を表示する機能を追加しました。
多分、合っているでしょう。
<Step.13>
- Equpimentスクリーンをテストして下さい。
- 武器を装備し続ける事でATKが無限に上昇します。
- これを直します。
とありました。
まず、テストしてみましょう。
Pause_Equipment画面を開いて見ると、Daggerが表示されています。ここまでは教科書で述べられている通りです。
Daggerボタンを押して装備します。
KUROのAPが10上昇しました。
Daggerが消えました。
一回出て、もう一度、Pause_Equipment画面を開くとDaggerが装備品に含まれています。
確かに教科書の言う通り、武器を装備しているのではなく使用してしまっていますね。
それでは直していきましょう。
<Step.14>
装備スクリーンのテキストボックスのセット(Setting the equipment screen Text Blocks)
あれ?これから武器を装備するためにBPを直していくと思ったら新しい節が始まってしまいました。
この節でBPを直すのでしょうか?
そうだと期待してやって行きましょう。
- Equipmentスクリーン内にWeapとArmがあり、そのすぐ右側にText Blockがあります。
- このText BlockにTextの変数をバインドして武器と防具の名前を表示するようにします。
何か関係ない事をやり始めているような気もしますが、やって行きます。
<Step.15>
- FieldPlayerのブループリントのイベントグラフから武器の名前を保持するテキスト変数を作成します。
- そのテキスト変数の名前はSoldierWeaponとします。
はい。作りました。
<Step.16>
- Pause_Equipmentウィジェットブループリントのデザイン画面を開きます。
- テキストボックスを選択してバインドを作成します。
はい。
- ここに武器の名前が表示されるようにします。
はい。
出来ました。
<Step.17>
soldierWeapon変数にテキストをセットします。
- Weaponウィジェットブループリントのイベントグラフを開き、Remove From ParentノードをSet soldierWeaponに変更します。
- SoldierWeaponのテキストの値はユーザーがクリックしたitem変数にセットします。
はい。しました。
<Step.18>
- テストします。
- 装備ボタンを押すと、武器の名前がWeapの隣に表示されるはずです。
- 更に、武器は消滅しません。
が
となりました。うーん。教科書の説明通りではありますね。
ただし、
何度も武器がクリックでくるようになり、APを無限に増やせられるようになってしまいましたね。
<Step.19>
装備する時にキャラクターの状態を集める(Correcting character stats when equipping)
- 最後に装備が一回以上出来ないようなロジックを追加します。
- FieldPlayerのブループリントに二つの変数を追加します。
- 一つ目は、ブーリアンでSoldierが武器を装備しているかどうかを追跡するため。
- もう一つは、integerでsoldierの基本的はAttack statを追跡するためのもの。
やっぱりAPが無限に増やせる状態は直すみたいですね。
二つの変数をFieldPlayerウィジェットブループリントに作成しました。
<Step.20>
- 作成した二つの変数を使用してロジックを作成します。
- Weaponウィジェットブループリントのイベントグラフを開きます。
- 武器を装備していた場合、Soldier Weapon Equipped がtrueになるようにセットします。
作成しました。
<Step.21>
Soldierの基本のATKをsoldierbaseAtk変数に保持させます。
しました。
<Step.22>
- 武器を選択した時、ItemDataのATKとsoldierbaseAtkを足します。
- この方法でATKが無限に上昇する事が防げます。
しました。
しましたが、この方法だと一端装備したら、装備は外せない(Soldier Weapon Equippedがfalseに戻らない。) ですね。
<Step.23>
- 大きな問題がまだあります。
- もし装備画面から出て、もう一度装備画面に戻って武器を使用した場合、ATKは無限に増えます。
- もし、SolderWeaponEquippedがtrueの場合は、どの武器が装備されているのかを見つけてそのATKをsoldierのベースのATKから引く必要があります。
ゲロゲロ。
これってもう装備のロジックを最初から考え直した方がいいレベルじゃないですか。
ウーン。最後になってこの様。
この本で勉強する最大の理由はゲームにおける具体的なソフトウェアデザインを学ぶ事です。ここまでかなり勉強になりましたが、この装備の部分のソフトウェアデザインは自分で考えた方がかなりマシな気がします。と言うか考えないとまずい気がします。
取りあえず今日は、教科書のやり方でやります。
まず、教科書に書かれている事が正しいのか確認します。
最初の画面です。
Daggerボタンを一回だけ押してKUMOにDaggerを装備します。
Daggerを装備しました。APが10上昇して15になりました。
今度は、Daggerボタンを何回も押します。
何回押しても、KUMOのAPは15から変化しません。
ここまでは成功です。
それでは、一回Equip画面から出ます。
そしてもう一度、Equip画面に入ります。
Daggerを装備していてKUMOのAPは15です。
Daggerボタンを押してみます。
あれ。変わりません。KUMOのAPは15のままです。
どっかで理解間違えた?
ちょっと教科書をもう一回読み直してみます。
分からない。
それが起きるのは、我々が武器が既に装備されていた場合を考えていないからです。
とか書かれていますが。武器が既に装備されている場合も正常に機能しています。
丁度最後の部分なのでこの個所はスキップする事にします。
<考察>
arrayWeapons変数とequipmentScreen変数の目が閉じている、つまりprivateなのに他のブループリントから値が呼べるのは不思議と述べていましたが、単純にGetter やSetterを使用してアクセスしているので不思議でも何でもなかったです。
ところで、この本は全部で10章なので順調に行けば来週で終わるはずです。この本で勉強をする前は、この本を終わるころには、RPGが一本完成すると勝手に期待していたのですが、実際のRPGを作成するには全然足りないようですね。この教科書に肉付けして一本ゲームを完成させるのか、それとも他の教科書を勉強するのかもこれから考えないといけないみたいですね。