<前文>
ここまで、UE4の勉強をして来ますと、ゲームを自作して販売したいという気持ちになって来ます。最初、勉強を始めた時は、ゲームそのものよりもゲームエンジンやPBRに興味があったのですが、今はゲームそのものの制作に興味が移ってしまいました。ゲームを自作する以上は、価値ある物を作成したいです。つまりお金を払っても手に入れたいと思われる物を作成したいです。
ところで、最近ゲームは時間の無駄と言う意見が良く聞かれるようになりました。これってどうなんでしょうか?正しいんでしょうか?賛否両論あるようですが結構正しい部分もあるような気がします。となると幾ら良いゲームを自作してもお金を稼ぐ事は出来なくなるかもしれません。そればかりかゲームそのものが無くなってしまうかもしれません。
そこで私は考えたんですが、ゲームと学習をくっつけて、ゲームをすると何かの学習も出来ると言うのはどうでしょうか?例えば、ゲームと英語学習をくっつけてゲームが上達すると同時に英語も上達する、と言うアプリです。今まで英語学習用のアプリはありましたが効果があるのかも怪しいですし、ゲームとしての面白さもありませんでした。ゲームとして面白い物を作成出来れば、時間の無駄でも人は遊ぶはずです。そして遊べば、その時間が学習に変換されるので時間の無駄にもならないと言うわけです。
中々面白いアイデアと思います。もっと発展させてみたいと思います。
それでは、今週の勉強を始めます。
<本文>
今週は装備品の整理を行いたいと思います。
現状、全ての種類の装備品はプレイヤーが操作するキャラクターの装備袋内に入っています。これを道具と同じように買う事が出来る様に改良します。
1.武器屋の作成
まず、武器屋を作成します。
しました。
単に、道具屋をコピーしただけです。
話しかけても、道具屋と全く同じ事をしゃべります。
のevent graphを開いて見ると
RPGGameInstanceの変数Talk Shopをtrueにセットしています。
更にMap1内のレベルブループリントを開くと、TalkShopがTrueの場合、
ShopWindowウィジェットを開く仕組みになっていました。
よし。大体分かりました。
まず、RPGGameInstance.hにboolean変数でTalkWeaponShopを作成します。
UPROPERTYはTalkShop変数と全く同じにします。
ビルドします。
成功しました。
次に、NPC_ShopOwnerをDuplicateしてNPC_WeaponShopOwnerを作成します。
NPC_WeaponShopOwner のevent graphを開き、Set TalkShopをSetTalkWeaponShopに変更します。
Map1にある武器屋の主になる予定のNPC_ShopOwnerをNPC_WeaponShopOwnerで置き換えます。
更に、Map1のeventGraphにSetTalkWeaponShopがtrueだった場合のコードを追加します。
テストしてみます。
普通に動いていますね。大丈夫なようです。
あれ。エラーが出てしまいました。
エラーを読んでみると、FieldPlayerのEventGraphからRPGGameInstance のGameGoldの値をセットしているのですが、そこでRPGGameInstance のGameGoldが呼び出せないといっています。
良く分からないので、RPGGameInstance のGameGoldをもう書き直してみました。
もうエラーは出なくなりました。何だったんでしょうか?
2.武器屋のUIの作成
まず、話しかけると開くUIです。これは道具屋と同じでいいでしょう。名前はWeaponShop_Welcomeにします。
次にテキストに表示するDialogを見てみます。
新しいNPCDialogを作成します。
先程作成したWeaponShop_Welcome内でdialogとして追加します。
NPC_ParentのNPCWeaponOwnerDialogとWeaponShop_Welcomeから呼び出したNPCWeaponOwnerDialogが同期してくれません。
うーん。
手動でコピーしちゃいました。後でこの問題は考えます。
テストします。
文字がはみ出していますが、武器屋のdialogが表示されています。
文字をテキスト内に表示する方法を忘れてしまったので、Dialogを短くしました。
突然ですがNPC_ParentのNPCWeaponOwnerDialogとWeaponShop_Welcomeから呼び出したNPCWeaponOwnerDialogが同期しない理由を思い出しました。
NPC_ParentのNPCWeaponOwnerDialogをNPC_ParentのNPCDialogからduplicateで作成したからでした。前回、全く同じ事してC++のShallow Copy云々と言っていたのにすっかりその事を忘れていました。
直しました。
会話ボタンや買い物ボタンを押した場合のウィジェットも作成します。
3.武器の購入
武器をクリックした場合、お金がある場合は、それを購入できるようにします。
まず、最初に解決しなければならないのが、現状では、全ての装備品は購入済みに成っている所です。
プレイヤーが操作するキャラクターが保持する装備品の内容を示す時に、data tableのWeaponsを表示しています。
が、このdata tableのWeaponsはゲームに存在する全ての装備品を表すデータなので、プレイヤーが操作するキャラクターが保持する装備品の内容ではありません。
どこかにプレイヤーが操作するキャラクターが所有している装備品のデータを保持する変数を作成する必要があります。
道具の場合を参考にしてみると、FieldPlayerのArrayItem変数にプレイヤーが所有している道具のデータを保持させています。
FieldPlayerには使用していないArrayWeaponsと言う名の変数がありますので、ここにプレイヤーが所有する装備品を保持させる事にします。
装備品の内容を表示するウィジェットであるPause_Equipmentのscrollbarの内容を指定するコードをGetDataTableRowName from Weapons からArrayWeaponsに変更します。
テストします。
…
出来てるか分からないですね。
FieldPlayerのEvent BeginPlayの最後に以下のコードを追加します。
もう一度テストします。
出来ているようですね。
今度は、武器屋で装備品を買えるようにします。
まず、Itemをduplicateしてitem Weaponを作成します。そしてfield playerのInventory Screen変数がfalseの時にボタンがクリックされた場合、クリックされたボタンに書かれている装備品の名前をfield playerのArrayWeapons配列に追加します。
これで、武器屋で購入した装備品だけ装備画面に表示されるはずです。
テストします。
装備品を開くと素手以外ありません。
武器屋で短剣、オノ、剣、などを購入しました。
もう一度、装備品を開いて見ます。
今度は、武器屋で購入した武器が表示されています。
勿論、購入した武器は装備も出来ます。
4.バグだし
武器屋と装備品のバグだしをします。
- 同じ武器が何回も購入出来ます。
武器が使用回数によって破壊される訳ではないので、一回以上購入出来なくするか、売れる様にするか、もしくは捨てれるようにしないといけないです。
- ワープすると購入した装備品が消えてしまいます。
このバグは道具でもありました。後で直します。
- 盾なのに武器に装備されている。
防具や武器の種類によって装備する箇所は違うはずですが、その区別が出来ていません。
- 武器の名称がボタンに被っている場合がある。
見た目が単純に悪いですね。
- Healerの状態表示がそのまま残っています。
戦闘システムのコードを見ても分かるように、この教科書に書かれているRPGは敵、味方複数を基本にして作成していますが、未だに装備画面にHealerを残しておく必要があるのか考えるべきでしょう。
- 武器のイラストがない。
武器のイラストを作成する必要があります。
- 装備品の値段が分からない。
これは道具の購入時にも言える事ですが、装備品を購入する時に値段が分かりません。
- 装備した時に今より何が強くなるのか不明。
今、短剣(小)を装備していますが、これを短剣(大)にした時に状態がどのように変化するかが不明です。
- デザインの改善
これは、バグではないかもしれませんが、全体的にデザインが機能的でも魅力的でもありません。
5.まとめ
今週は、装備品を管理するInventory systemを直しました。実際に行ったのは、
- 武器屋の作成
- 武器屋から装備を購入出来るようにする
- 購入した武器が装備袋内に保存され、装備画面で装備出来るようにする
- 装備品を管理するInventory systemのバグ出し
です。バグは多すぎなのですが、何が正しい状態なのかが今一分からないので、どのように直すべきかも分からない暗中模索な状態です。そう言えば、RPGの基本を勉強するためにドラゴンクエスト5を携帯にダウンロードしたのですが、全くやってません。Inventory Systemを完成するためには、既存のRPGのInventory systemを総点検する必要があるのかもしれません。