UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する Inventory Systemの改善part3

<前文>

f:id:kazuhironagai77:20200202230530p:plain

ここまで、UE4の勉強をして来ますと、ゲームを自作して販売したいという気持ちになって来ます。最初、勉強を始めた時は、ゲームそのものよりもゲームエンジンやPBRに興味があったのですが、今はゲームそのものの制作に興味が移ってしまいました。ゲームを自作する以上は、価値ある物を作成したいです。つまりお金を払っても手に入れたいと思われる物を作成したいです。

ところで、最近ゲームは時間の無駄と言う意見が良く聞かれるようになりました。これってどうなんでしょうか?正しいんでしょうか?賛否両論あるようですが結構正しい部分もあるような気がします。となると幾ら良いゲームを自作してもお金を稼ぐ事は出来なくなるかもしれません。そればかりかゲームそのものが無くなってしまうかもしれません。

そこで私は考えたんですが、ゲームと学習をくっつけて、ゲームをすると何かの学習も出来ると言うのはどうでしょうか?例えば、ゲームと英語学習をくっつけてゲームが上達すると同時に英語も上達する、と言うアプリです。今まで英語学習用のアプリはありましたが効果があるのかも怪しいですし、ゲームとしての面白さもありませんでした。ゲームとして面白い物を作成出来れば、時間の無駄でも人は遊ぶはずです。そして遊べば、その時間が学習に変換されるので時間の無駄にもならないと言うわけです。

中々面白いアイデアと思います。もっと発展させてみたいと思います。

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

<本文>

今週は装備品の整理を行いたいと思います。

f:id:kazuhironagai77:20200202230615p:plain

現状、全ての種類の装備品はプレイヤーが操作するキャラクターの装備袋内に入っています。これを道具と同じように買う事が出来る様に改良します。

1.武器屋の作成

まず、武器屋を作成します。

f:id:kazuhironagai77:20200202230649p:plain

しました。

単に、道具屋をコピーしただけです。

f:id:kazuhironagai77:20200202230707p:plain

話しかけても、道具屋と全く同じ事をしゃべります。

f:id:kazuhironagai77:20200202230726p:plain

のevent graphを開いて見ると

f:id:kazuhironagai77:20200202230746p:plain

RPGGameInstanceの変数Talk Shopをtrueにセットしています。

更にMap1内のレベルブループリントを開くと、TalkShopがTrueの場合、

f:id:kazuhironagai77:20200202230805p:plain

ShopWindowウィジェットを開く仕組みになっていました。

よし。大体分かりました。

まず、RPGGameInstance.hにboolean変数でTalkWeaponShopを作成します。

f:id:kazuhironagai77:20200202230856p:plain

UPROPERTYはTalkShop変数と全く同じにします。

ビルドします。

f:id:kazuhironagai77:20200202230932p:plain

成功しました。

次に、NPC_ShopOwnerをDuplicateしてNPC_WeaponShopOwnerを作成します。

f:id:kazuhironagai77:20200202230955p:plain

NPC_WeaponShopOwner のevent graphを開き、Set TalkShopをSetTalkWeaponShopに変更します。

f:id:kazuhironagai77:20200202231237p:plain

Map1にある武器屋の主になる予定のNPC_ShopOwnerをNPC_WeaponShopOwnerで置き換えます。

f:id:kazuhironagai77:20200202231302p:plain

更に、Map1のeventGraphにSetTalkWeaponShopがtrueだった場合のコードを追加します。

f:id:kazuhironagai77:20200202231325p:plain

テストしてみます。

f:id:kazuhironagai77:20200202231346p:plain

普通に動いていますね。大丈夫なようです。

f:id:kazuhironagai77:20200202231413p:plain

あれ。エラーが出てしまいました。

エラーを読んでみると、FieldPlayerのEventGraphからRPGGameInstance のGameGoldの値をセットしているのですが、そこでRPGGameInstance のGameGoldが呼び出せないといっています。

f:id:kazuhironagai77:20200202231435p:plain

良く分からないので、RPGGameInstance のGameGoldをもう書き直してみました。

もうエラーは出なくなりました。何だったんでしょうか?

2.武器屋のUIの作成

まず、話しかけると開くUIです。これは道具屋と同じでいいでしょう。名前はWeaponShop_Welcomeにします。

f:id:kazuhironagai77:20200202231512p:plain

次にテキストに表示するDialogを見てみます。

f:id:kazuhironagai77:20200202231535p:plain

新しいNPCDialogを作成します。

f:id:kazuhironagai77:20200202231605p:plain

f:id:kazuhironagai77:20200202231619p:plain

先程作成したWeaponShop_Welcome内でdialogとして追加します。

f:id:kazuhironagai77:20200202231652p:plain

NPC_ParentのNPCWeaponOwnerDialogとWeaponShop_Welcomeから呼び出したNPCWeaponOwnerDialogが同期してくれません。

うーん。

f:id:kazuhironagai77:20200202231720p:plain

手動でコピーしちゃいました。後でこの問題は考えます。

テストします。

f:id:kazuhironagai77:20200202231744p:plain

文字がはみ出していますが、武器屋のdialogが表示されています。

f:id:kazuhironagai77:20200202231812p:plain

文字をテキスト内に表示する方法を忘れてしまったので、Dialogを短くしました。

突然ですがNPC_ParentのNPCWeaponOwnerDialogとWeaponShop_Welcomeから呼び出したNPCWeaponOwnerDialogが同期しない理由を思い出しました。

NPC_ParentのNPCWeaponOwnerDialogをNPC_ParentのNPCDialogからduplicateで作成したからでした。前回、全く同じ事してC++Shallow Copy云々と言っていたのにすっかりその事を忘れていました。

f:id:kazuhironagai77:20200202231841p:plain

直しました。

会話ボタンや買い物ボタンを押した場合のウィジェットも作成します。

f:id:kazuhironagai77:20200202231935p:plain

f:id:kazuhironagai77:20200202231943p:plain

3.武器の購入

武器をクリックした場合、お金がある場合は、それを購入できるようにします。

まず、最初に解決しなければならないのが、現状では、全ての装備品は購入済みに成っている所です。

f:id:kazuhironagai77:20200202232121p:plain

プレイヤーが操作するキャラクターが保持する装備品の内容を示す時に、data tableのWeaponsを表示しています。

f:id:kazuhironagai77:20200202232142p:plain

が、このdata tableのWeaponsはゲームに存在する全ての装備品を表すデータなので、プレイヤーが操作するキャラクターが保持する装備品の内容ではありません。

どこかにプレイヤーが操作するキャラクターが所有している装備品のデータを保持する変数を作成する必要があります。

f:id:kazuhironagai77:20200202232219p:plain

道具の場合を参考にしてみると、FieldPlayerのArrayItem変数にプレイヤーが所有している道具のデータを保持させています。

f:id:kazuhironagai77:20200202232244p:plain

FieldPlayerには使用していないArrayWeaponsと言う名の変数がありますので、ここにプレイヤーが所有する装備品を保持させる事にします。

装備品の内容を表示するウィジェットであるPause_Equipmentのscrollbarの内容を指定するコードをGetDataTableRowName from Weapons からArrayWeaponsに変更します。

f:id:kazuhironagai77:20200202232308p:plain

テストします。

f:id:kazuhironagai77:20200202232325p:plain

出来てるか分からないですね。

FieldPlayerのEvent BeginPlayの最後に以下のコードを追加します。

f:id:kazuhironagai77:20200202232356p:plain

もう一度テストします。

f:id:kazuhironagai77:20200202232415p:plain

出来ているようですね。

今度は、武器屋で装備品を買えるようにします。

まず、Itemをduplicateしてitem Weaponを作成します。そしてfield playerのInventory Screen変数がfalseの時にボタンがクリックされた場合、クリックされたボタンに書かれている装備品の名前をfield playerのArrayWeapons配列に追加します。

f:id:kazuhironagai77:20200202232515p:plain

これで、武器屋で購入した装備品だけ装備画面に表示されるはずです。

テストします。

装備品を開くと素手以外ありません。

f:id:kazuhironagai77:20200202232615p:plain

武器屋で短剣、オノ、剣、などを購入しました。

f:id:kazuhironagai77:20200202232650p:plain

もう一度、装備品を開いて見ます。

f:id:kazuhironagai77:20200202232710p:plain

今度は、武器屋で購入した武器が表示されています。

f:id:kazuhironagai77:20200202232749p:plain

勿論、購入した武器は装備も出来ます。

4.バグだし

武器屋と装備品のバグだしをします。

  • 同じ武器が何回も購入出来ます。

f:id:kazuhironagai77:20200202232832p:plain

武器が使用回数によって破壊される訳ではないので、一回以上購入出来なくするか、売れる様にするか、もしくは捨てれるようにしないといけないです。

  • ワープすると購入した装備品が消えてしまいます。

f:id:kazuhironagai77:20200202232922p:plain

このバグは道具でもありました。後で直します。

  • 盾なのに武器に装備されている。

f:id:kazuhironagai77:20200202232953p:plain

防具や武器の種類によって装備する箇所は違うはずですが、その区別が出来ていません。

  • 武器の名称がボタンに被っている場合がある。

f:id:kazuhironagai77:20200202233040p:plain

見た目が単純に悪いですね。

  • Healerの状態表示がそのまま残っています。

f:id:kazuhironagai77:20200202233108p:plain

戦闘システムのコードを見ても分かるように、この教科書に書かれているRPGは敵、味方複数を基本にして作成していますが、未だに装備画面にHealerを残しておく必要があるのか考えるべきでしょう。

  • 武器のイラストがない。

f:id:kazuhironagai77:20200202233142p:plain

武器のイラストを作成する必要があります。

  • 装備品の値段が分からない。

f:id:kazuhironagai77:20200202233205p:plain

これは道具の購入時にも言える事ですが、装備品を購入する時に値段が分かりません。

  • 装備した時に今より何が強くなるのか不明。

f:id:kazuhironagai77:20200202233227p:plain

今、短剣(小)を装備していますが、これを短剣(大)にした時に状態がどのように変化するかが不明です。

  • デザインの改善

f:id:kazuhironagai77:20200202233250p:plain

f:id:kazuhironagai77:20200202233257p:plain

これは、バグではないかもしれませんが、全体的にデザインが機能的でも魅力的でもありません。

5.まとめ

今週は、装備品を管理するInventory systemを直しました。実際に行ったのは、

  • 武器屋の作成
  • 武器屋から装備を購入出来るようにする
  • 購入した武器が装備袋内に保存され、装備画面で装備出来るようにする
  • 装備品を管理するInventory systemのバグ出し

です。バグは多すぎなのですが、何が正しい状態なのかが今一分からないので、どのように直すべきかも分からない暗中模索な状態です。そう言えば、RPGの基本を勉強するためにドラゴンクエスト5を携帯にダウンロードしたのですが、全くやってません。Inventory Systemを完成するためには、既存のRPGのInventory systemを総点検する必要があるのかもしれません。