<前文>
今週からは、AIやデータサイエンスとUE4によるゲーム作成は別々のブログに書く事にします。このブログはUE4によるゲーム作成専用にします。
前文では、毎週、どうしたらポケモン並みの人気のあるゲームを作成出来るのかについて考えていきたいと思います。
勿論、狙うのは巨大なアメリカ市場です。今、日本のアニメや漫画、ゲームは圧倒的にアメリカの若者の支持を集めています。ここに食い込めるようなRPGゲームを作成するのが目的です。
しかし、私、基本的にゲームはしません。理由は、あんまり興味がないからとゲームをすると疲れるからです。
そんな私でも気が付いた事が一つあります。
アメリカ人もあまり写実的な3Dモデルが好きではない事です。アメリカ人も本音ではアニメっぽいデザインの方が好きであると言う事です。
ポケモン並みの人気のあるゲームを作成するために必要な要素の一つ目は、アニメぽいデザインを採用する事だと思います。
それでは、今週の勉強を始めます。
<本文>
今週は、どんな機能が足りないのかのリストの作成をします。
取りあえず、ゲームを開始して思いつくままに書いて行きます。
これが、スタート画面と言うか、メイン画面ですね。もう少し見た目を良くする必要がありますね。
後、
これが、表示されないように設定を変える必要がありますね。
マウスは最初から表示されています。そして画面の外側にマウスを移動する事も出来ます。これってどうなんでしょうね。あんまりPCゲームした事ないので分からないですが、良くない事のような気がします。
スタ―トボタンをカーソルで選択してマウスでクリックするとロード画面に移行します。
ロード機能がない。
ロード画面だけ作成して、中身を作っていません。これを作成しないといけませんね。
今回は、最初からを選択してゲームを開始します。
こんな感じでゲームは始まります。ゲームが開始した後も、カーソルは表示されっぱなしです。キャラクターのコントロールは全く出来ません。
ゲーム画面上にカーソルを置いて、マウスでクリックするとカーソルが消滅してキーボートとマウスでキャラクターのコントロールが出来るようになります。
石畳の上を走ると直ぐに、モンスターが追いかけて来ます。はっきり言って圧巻です。しかしモンスターに捕まっても何も起きません。
戦闘開始の追加が必要です。
現状、戦闘はTestCombatとコマンドを打つと始まります。
あ、nameが直してなかったです。
直しました。
UIのPlayerCharacterCombatPanelのGetTextNameTex0関数と
UIのEmenyCharacterCombatPanelのGetTextNameTex0関数を
直しました。
まず、攻撃ボタンをクリックします。
攻撃の右上にゴブリンと書かれたボタンが表示されました。
ゴブリンをクリックします。
ゴブリンのHPが15に下がりました。
同時に、ゴブリンからの攻撃を食らって雲のHPも4に下がりました。
雲のHPは100から4に下がって、ゴブリンのHPは20から15に下がったのですから、次に攻撃したら、ゴブリンのHPは10に下がるだけですが、雲はHPが100あったのに5まで下がってしまったので、0になって負けてしまいます。
戦闘を中止したいですが、選択支に逃亡はありません。戦うしかないみたいです。
攻撃をクリックしましたが、何も変化しません。
ゴブリンをクリックします。
ゲームオーバーに成りました。
戦闘画面がしょぼい。
いくらターン制の戦闘方法の作成を勉強するためと言え、全体的にしょぼ過ぎます。いくらゲームをあんまりしない私でも、しょぼいと思いました。
はっきり言ってこの教科書のメインの部分がターン制の戦闘の作成だったので、この先このままこの本を基礎にしてRPGを作成していくのかどうか、この部分は重要な判断要素になると思います。
次は、マップを使用して道具屋に移動します。
道具屋とのやり取りをします。
まず、近づいてEを押します。
この画面ははっきり言って悪くないですね。戦闘画面のしょぼさと比較して、単純ですが、UIとしての機能美を備えています。ここから、デザインを発展させる事も出来ますし、悪くないです。
会話を押してみます。
表示されている会話の内容が変化しました。これを発展させることで、更に面白く出来そうです。
戻るを押したら、
画面が消えてしまいました。これは戻るではなく、止めるですね。
もう一度、Eを押して、道具屋とのやりとりを表示させます。
今度は、買い物をクリックします。
買い物の画面が表示されました。
この画面の見た目は悪いですね。
まずバグですが、この画面に入ってもキャラクターを動かす事が出来ます。
これは直さないと駄目ですね。
戻るをクリックしたら、
会話の時と同じで、UIウィジェットが消えてしまいました。
もう一度画面に戻って、今度は回復薬を買ってみます。
回復薬の値段は-10ゴールドに設定していたので、買うたびに持っている硬貨の数が10増えます。硬貨でなくて金貨でしたね。まあこれは後で直します。
回復薬とイーサーの値段だけは直しました。Item_shopから以下に示すように直しました。
後、買い物する時に道具の値段が見えないと買いにくいですね。これも直さないといけません。
初期の金貨の数を110に変えました。
取りあえず、10個ほど買いました。
ワープしてモンスターがいる位置に戻ったら
買った道具が消えてました。
まあ、これはしょうがないですね。二つの違うチュートリアルを合わせて何の調節もしなかったのですから。
今度は短剣を装備してモンスターと戦ってみます。
装備画面は最初から武器が揃っています。
短剣(小)を選択します。
これでモンスターと戦ってみます。
今度は勝ちました。
金貨も10枚増えていますね。
道具屋にワープしました。
今回は、HPも金貨の量も変化していませんね。
何故でしょうか?
まあ、いいです。回復薬を試してみます。
十個ほど購入しました。
使用してみます。
5個ほど使用するとHPが前回しました。それ以上使用してもHPは変化しません。2個ほど残しておきます。
もう一度、Pを押して、ポーズ画面を表示すると
HPは回復しています。
お金も減っています。
道具袋を開くと、あれ、使用した回復薬がそのまま残っています。
道具を消費しても、戻っている。
新たなバグですね。
はあ。何これ?
まあいいです。今週は、これから直すリストを作成するのが目的なので、問題がある事が分かるだけでも大切です。
更に以下の事を追加しようと思っています。
- 武器の売買、もしくは拾えるようにする。
- ランドスケープを改良する。
- 音楽、効果音。
<まとめと感想>
今週はこれからやらないといけない部分のリストの作成をしました。
これらがこれからやるリストです。
- ロード機能の追加
- 戦闘開始の追加
- 戦闘画面の改良
- 道具を消費しても、戻っているバグの修復
- 武器の売買、もしくは拾えるようにする。
- ランドスケープを改良する。
- 音楽、効果音の追加
です。
結構バグが見つかりました。教科書通りに作成したにもかかわらずバグになっている個所があるのがちょっとショックでした。
<inventory system>
どうせ、フリーのinventory systemがあるのだから、自分で位置から作成するのとどう違うのか勉強しておこうと思いました。
これが、documentですね。これを見ながらやってみます。
まず、Create ProjectからProjectを一個作成しろとあるので作成しました。
そしたら、Inventory systemを使用するプロジェクトを開くように書いてあるので、それ用のプロジェクトを作成します。
作成しました。名前はMy_IS_Studyです。
そしたら、Project SettingからInputを選択して右上にあるimportをクリックしてInventorySystemInputを選択しろとあります。
どっちでもいいとありましたので、InventorySystemInput(for example project).iniを選択しました。
今度はInventory Systemに戻って
InventorySystem全部を選択して、migrateします。
My_IS_StudyにInventorySystemが出来ました。
まず、最初にする事はPlayerStateにInventoryManagerSystemComponentを追加する事とありました。
PlayerStateてなんだっけ。
之の事か。
一回も使用した事ないやつか。
Officialなサイトでは、 こんな説明がされてました。
Playerの名前、スコア、などを保持するクラスみたいですね。GameMode内に保持しているんじゃいけないんでしょうか?
取りあえず、作ってから考えます。
を選択します。
何かその下にBP_InventoryPlayerStateがありました。これ使えば作る必要なさそうだったのですが、今はこれは無視しておきます。
作りました。
これも変えました。
それで、PlayerStateって何するクラスなのか一寸調べます。
UE4のAPIには、
となってますね。
ネットワークゲームをしないなら関係なさそうですが。
これ以外にあまりネットの情報が見つからないですね。
きになるのがこの関数。
これってEpic Gameに登録した私の名前を返すの?
試してみました。
思いっきり名前が表示されてます。一体どこから私の名前の情報を得ているのか分かりませんが、私の名前が表示されています。
まあ、名前ぐらいならいいでしょう。
InventoryManagerComponetを追加します。
InventoryFunctionLibを開き、Cast to BP_InvenotryPlayStateをCast to MyPlayStateに交換します。
CH_InventorySystemCharacterを開きます。
次にThirdPersonCharacterを開きます。
Event BeginPlayを追加します。
何か警告が出ているみたいですが、無視して先に進みます。
変数を新たに作成し名前をInventoryManagerにします。タイプは、BP Inventory Managerです。
InventorySystemCharacterに戻り、以下のコードからevent beginplayを抜いた部分をコピーします。
ThirdPersonCharacterに戻り、event beginplayの後にペーストして繋げます。
次にBooleanタイプの変数、IsBeingControlledを作成します。
更に以下のノードを作成します。
UIWidgetを開いている間、キャラクターがプレイヤーからコントロール出来たら困るので、これを全てのinput eventの間に挟むそうです。
そうか。
こうすればいいのか。
Gamepad inputに追加します。
Mouse Inputにも追加しました。
Jumpも変えます。
何でJumpに警告が出ているのでしょうね。
Inputを見てみます。
Jumpがない!
ひょっとして最初にやったInputにInventorySystemInputをimportしたから。
あー。
InputにInventorySystemInputをimportするのはそう言う事なんですね。
Touch Input、Movement Input、そしてVRにも追加しました。
InventorySystemCharacterの以下の部分をコピーします。
Third Person characterにペーストします。
エラーになりました。よく見たら、IsBeingControlled?がエラーになってます。IsBeingControlledは作成したはずと思ってよく見てみたら?がなかったです。
?を足したらエラーは消えました。
Craftingがしたい場合は、
をコピーペーストせよ。と言ってます。
Craftingがゲーム内の何を具体的に指すのか不明なのですが、これも追加しておきます。
しました。
今度は、InputActtionOpenChestです。説明書にはRayCastingを使用しているので、BPが複雑になっています。コピーの失敗をしないようにと忠告されていました。
そんな大変ならば、少しずつやって行きます。
まず、以下の部分からやります。
InputAction OpenChestとはCustom Eventなのでしょうか?
InputActionみたいですね。と思ったらInputActionと書かれていました。
でも、
ないじゃん。
試しに追加してみます。
のエラーが消えました。
一個ずつ理解しながらやって行こうと思ったのですが、メンドクサイのでコピーで済ましてしまいました。
ThirdPersonCharacterのGraphsに新しいGraph、HotbarControlを追加しました。
CH_InventorySystemCharacterのHotbarControlのノードをそのままコピーしました。
説明書によるとこれで一応完成らしいのでテストします。
何か結構重いです。がそれなりには動きます。
ゲーム画面を停止したらこんなにエラーが表示されました。
エラー表示をみたら、WBP_CraftingWIdgetの
がエラーになっているみたいです。
Get Inventory ManagerのノードとCast to MyPlayerStateのノードが繋がってなかったです。
繋げました。
もう一度テストします。
今度はエラーは出ませんでした。
今度は、Eを押してみます。
左上に5×5のマスが表示されました。
成功なんでしょうか。取りあえず次をやります。
これを配置します。
取りあえず、2個ほど配置しました。
設定をAppleとBurgerにしました。
ゲームを開始して白いボールにぶつかると、ボールが消えます。
そしてEを押して5×5のマスを開くと、
と表示されました。
コントロールの確認
Eを押します。Inventoryが開いたり閉じたりするそうです。
もう一度Eを押します。
5×5のマスがinventoryを表しているみたいですね。
Iを押します。Craftingを開くそうです。
右上に以下の図が表示されました。
マウスをrifleの上に置くと、リンゴ5個とハンバーガー1個でライフル1個作成出来るみたいです。
やってみますか。
何か出来たみたいですね。
Oを押してChestを開きます。Chestがどれなのか分からないですね。
BP_ExampleChestを置いてみました。
Oを押しても何も反応しませんでした。
これは良く分からないのでパスします。
1-9もしくはスクロールウィルを使用してスロットのホットバーを選択します。
これ最初何を言っているのか分からなかったですが、上の図が示したように、赤いマークを自由に動かせる事でした。
Qを押してアイテムを落とします。
出来ました。
一応は動いているようですね。
<オリジナルなアイテムを追加>
EItem enumを開きます。
これですね。
こんな感じです。
新しいアイテムを追加しました。
更に、DT_Itemsを開き、MyFirstItemを追加しました。
テストしてみます。
Imageは表示されましたね。
アイテムをドロップしてみました。
うーん。出来ているのでしょうか?
<UIのカスタム化>
UMG内の以下の変数の値をいじる事でUIのカスタム化が出来るとあります。
しかしこの変数、存在はしているのですが、使用されていません。唯一使用している箇所は、
WBP_HotbarSlotだけでした。
良く分かりません。この方法は今のバージョンでは出来ないのかもしれませんね。
次の方法はスロットの見た目を変えるとありました。
の設定を変えてみましたが特に何も変わりませんでした。
こちらも良く分かりません。
これ以外の変更をする場合は、公式のサポートはしませんと書かれていたので、この個所はこれ以上はやらない事にします。
<クラフト機能の使用>
まず最初にする事はクラフト機能を追加する事です。これをするためにDT_Craftingを開きます。
MyFirstItemCraftingを追加します。
直ぐ使用するので、IsUnlockedにチェックを入れます。
Save file をはずします。
これを消せばいいみたいです。
ゲームを開始してIボタンを押してみます。
出来ていますね。
Appleが1個、Pearが1個ある状態でMyFirstItemCraftingボタンをクリックします。
MyFirstItemが作成されました。
これ作成のアニメーションを追加出来たらいいんですが。その機能はないみたいですね。
<Chestの機能の使用>
Chestの使用方法が分からなかったですが、ここで分かるのでしょうか。
BP_StorageChestを親クラスとするBPを作成します。
作成しました。
行列の値を以下に示すRow size とRowsで変更出来ますとあります。
これが何を指しているのか不明なのでこのままで行きます。
これで完成みたいです。これをレベル上に置いて、キャラクターがchestを向いた状態でOを押すと、ItemをChestに保存出来るようになるみたいです。
いくらOを押しても反応しませんね。
色々調べて分かったのは、Chestをray tracingがキャッチしていないですね。まあ一個ぐらい動かなくてもいいでしょう。
<感想とまとめ>
このInventory systemを直接使用したいとは思いませんが、ブループリントのコードは参考になります。Ray tracingはOpenGLでも組んだことがありますし、自分で勉強してBP上で動くようにしたいです。
最後まで書いて気が付いたですが、Chestの部分でoを押していましたが、設定ではcにセットしていました。来週、この部分はもう一度トライします。