UE4の勉強記録

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

「Unreal Engine4.xを使用してRPGを作成する」の8章、在庫数とアイテムの使用(Inventory Population and Item Use)を勉強する。

<前文>

f:id:kazuhironagai77:20190908194130p:plain

今週は、調子が悪くて週末ずっと寝てました。そんな中で勉強したのでちょっとオカシな所があるかもしれません。

<本文>

<目的>

「Unreal Engine4.xを使用してRPGを作成する」の8章、在庫数とアイテムの使用(Inventory Population and Item Use)を勉強します。

この章では、以下の事をします。

  1. フィールドプレイヤーのブーリアンの作成(Creating the Field Player Boolean)
  2. インベントリースクリーンがオンかオフかどうかを決定する(Determining whether the inventory screen is on or off)
  3. インベントリーと店のアイテムの論理的な違い(Logical difference between inventory and shop items)
  4. インベントリースクリーンの完成(Finishing the inventory screen)
  5. アイテムの購入(Buying item)
  6. アイテムの使用(Using the item)

教科書の前置きに色々説明がありましたが、今一ピンと来ません。やりながら理解していきましょう。

<方法と結果>

<Step.0>

まず、サンプルコードを解凍します。

f:id:kazuhironagai77:20190908194232p:plain

もう、普通に出来ましたね。

<Step.1>

フィールドプレイヤーのブーリアンの作成(Creating the Field Player Boolean)

フィールドプレイヤーのイベントグラフ内に新しいブーリアン変数を作成します。

教科書にはfield PlayerはContent | Blueprints | Charactersにあると書かれていましたが、私のプロジェクトではContent | Blueprints内にありました。直しておいた方がいいのかそのままの方がいいのか悩みますね。そのままにします。

教科書にブーリアン変数の名前が書かれていないみたいですね。唯一それらしきのはinventoryScreenですが、今一、確信が持てません。

早速サンプルコードで確認してみます。

f:id:kazuhironagai77:20190908194406p:plain

inventoryScreenでした。

ちなみに、教科書の図が以下に示すようになっていたのですが、

f:id:kazuhironagai77:20190908194429p:plain

多分、間違っていますね。

以下に示すように

f:id:kazuhironagai77:20190908194452p:plain

inventoryScreenブーリアン変数をフィールドプレイヤー内に作成しました。

<Step.2>

インベントリースクリーンがオンかオフかどうかを決定する(Determining whether the inventory screen is on or off)

インベントリースクリーンがオンかオフかどうかを確認します。

あれ、もう二節目になりました。ひょっとすると8章は短いのかもしれません。

Determineなので決定すると訳しましたが、確認するぐらいが適切な気がします。しかしDetermineに確認すると言う訳はないですね。

f:id:kazuhironagai77:20190908194554p:plain

教科書通りに作成しました。流石にBPまで逐一記録する気はないので結果だけ表示します。

<Step.3>

インベントリーと店のアイテムの論理的な違い(Logical difference between inventory and shop items)

Itemブループリント内のボタンに何かの機能を追加するみたいです。

f:id:kazuhironagai77:20190908194625p:plain

これも教科書通りに作成しました。

最後まで作成しても良かったのですが区切りがいいのでStep.3はここで終わりにします。

<Step.4>

フィールドプレイヤーのイベントグラフ内にarrayItemと言う名前のテキストの配列を作成します。

はい。

f:id:kazuhironagai77:20190908194715p:plain

出来ました。

<Step.5>

インベントリースクリーンの完成(Finishing the inventory screen)

Pause_InventoryブループリントにarrayItem変数を使用した機能を追加します。

はい。

f:id:kazuhironagai77:20190908194752p:plain

出来ました。

一応、サンプルコードで確認します。

f:id:kazuhironagai77:20190908194812p:plain

最後の部分はまだ作成していないから除外して比較すると同じですね。

<Step.6>

AddChildの部分を追加します。

f:id:kazuhironagai77:20190908194847p:plain

これでフィールドプレイヤーの持つアイテムがPause_Inventoryウィジェット内のScrollBox_Inventoryに表示されるはずです。

<Step.7>

アイテムの購入(Buying item)

Itemブループリント内のボタンの機能の追加を行います。

f:id:kazuhironagai77:20190908194924p:plain

出来ました。

うーん。この辺は正直、自分で考えて作成したいですね。考察で、自分で作成するためには、考えなければならないポイントを考えたいと思います。

<Step.8>

テストしてみます。

f:id:kazuhironagai77:20190908194952p:plain

買えない。

f:id:kazuhironagai77:20190908195012p:plain

お金持ってなかったです。

うーん。今回のテストだけなので、Portionの値段を-10 goldにしちゃいます。

f:id:kazuhironagai77:20190908195041p:plain

これで試してみます。

f:id:kazuhironagai77:20190908195059p:plain

PortionをクリックしたらGoldが10に代わりました。買えたみたいですね。

f:id:kazuhironagai77:20190908195130p:plain

Inventoryを開いて見た所、Portionが追加されています。

今度は、Portionを3つ買って見ました。

f:id:kazuhironagai77:20190908195152p:plain

Inventoryを開くとPortionが3つ表示されています。これは期待した通りに表示されていますが、Portionx3の方が、ユーザーに親切と思われます。改良が必要ですね。

今度はEtherも買ってみます。

f:id:kazuhironagai77:20190908195213p:plain

f:id:kazuhironagai77:20190908195220p:plain

問題ないですね。

<Step.9>

アイテムの使用(Using the item)

Itemブループリント内のボタンの機能内のTarget Inventory ScreenがTrueだった場合の機能を追加します。

f:id:kazuhironagai77:20190908195300p:plain

出来ました。

f:id:kazuhironagai77:20190908195320p:plain

教科書にも書かれていた通り、このやり方ではetherには対応していません。実際に使用する場合には改良が必要ですね。

<Step.10>

テストします。

f:id:kazuhironagai77:20190908195353p:plain

取りあえず、2つほどポーションを買いました。

f:id:kazuhironagai77:20190908195417p:plain

使用してみると、見事に消えました。しかし元々HPがMAXなのでPortionが効いているのかわかりませんね。

良い事を思いつきました。Portionの効果をHP‐10に変更しました。

f:id:kazuhironagai77:20190908195440p:plain

f:id:kazuhironagai77:20190908195450p:plain

今度はPortionを使用するとHPが10下がりましたので成功ですね。

このデータシートの値を変更する事で、アイテムの効果を、プログラムをいじる事なく変更出来るのは、大変画期的ですね。「Game Programming Patterns 」に、この方法でゲームをデザインしないとゲームデザイナーがゲームのバランスを調節する段階で、全ての他の作業を中止する必要が出て来てゲームが完成しなくなる。と書かれていたのですが、その本を読んだときには、どのように直したらいいかの部分が理解出来なくて、ちょっと困っていました。それがこの教科書で勉強する事で具体的な方法で出来るようになったので、この教科書で勉強した価値はあったと言えますね。この辺もちょっと考察したいです。

<考察>

ここまで、インベントリーのシステムが完成すると、自分で独自のインベントリーシステムを作成したくなります。今回は、自分で独自のインベントリーシステムを作成する時に何を考えて作成しないといけないのかを考察したいと思います。

1.データシートの活用

  • データシートでアイテムの効果や酒類を一括管理しないと、アイテムの効果の値を変化した場合に、いちいちコンパイルする必要が生じてゲームが完成しない可能性があるみたいです。のでデータシートでの管理は必須だと思います。

2.C++で各部分とブループリントで書く部分の分担

  • まず、基本の考え方から復習しますが、デザイナーがより良いデザインをするために変更可能な部分はブループリントで作成、それ以外はC++で作成。が基本です。
  • これを考えながら教科書のインベントリーシステムのどこがC++で作成されていのか、ブループリントで作成されているのは何処からかを調べる必要があります。
  • 調べた後で、改良出来る点を考えます。

3.UIの改良

  • まずアイテムのイラストは追加したいです。
  • スマートホンなどのPC以外のデバイスにも対応出来るUIにしたい。
  • KUROとHealerが常に表示されているが、この部分にも子供のウィジェットを使用して、パーティーのメンバーが増えたり減ったりした場合の変更に対応した表示にしたいです。

4.他の機種にも対応

  • 3.UIの改良でも述べましたが、兎に角、アンドロイドアプリとして使用可能なインベントリーシステムにしたいです。

取り敢えず、これくらいですかね。

ワークフローも考えてみたのですが、ちょっと複雑すぎて挫折しました。片手間に出来るものではなかったですね。

<感想とまとめ>

今週は作業的には簡単でしたが、簡単になったのはこれまでのゲームの設計がしっかりしていたからです。その設計部分をしっかり理解しておかないと、大切な部分の勉強がおろそかになってしますと思いました。