UE4の勉強記録

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

「Unreal Engine4.xを使用してRPGを作成する」の足りない部分を作成する。足りない部分のリストを作成する

<前文>

f:id:kazuhironagai77:20191229105922p:plain

今週からは、AIやデータサイエンスとUE4によるゲーム作成は別々のブログに書く事にします。このブログはUE4によるゲーム作成専用にします。

前文では、毎週、どうしたらポケモン並みの人気のあるゲームを作成出来るのかについて考えていきたいと思います。

勿論、狙うのは巨大なアメリカ市場です。今、日本のアニメや漫画、ゲームは圧倒的にアメリカの若者の支持を集めています。ここに食い込めるようなRPGゲームを作成するのが目的です。

しかし、私、基本的にゲームはしません。理由は、あんまり興味がないからとゲームをすると疲れるからです。

そんな私でも気が付いた事が一つあります。

アメリカ人もあまり写実的な3Dモデルが好きではない事です。アメリカ人も本音ではアニメっぽいデザインの方が好きであると言う事です。

ポケモン並みの人気のあるゲームを作成するために必要な要素の一つ目は、アニメぽいデザインを採用する事だと思います。

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

<本文>

今週は、どんな機能が足りないのかのリストの作成をします。

取りあえず、ゲームを開始して思いつくままに書いて行きます。

f:id:kazuhironagai77:20191229105955p:plain

これが、スタート画面と言うか、メイン画面ですね。もう少し見た目を良くする必要がありますね。

後、

f:id:kazuhironagai77:20191229110012p:plain

これが、表示されないように設定を変える必要がありますね。

マウスは最初から表示されています。そして画面の外側にマウスを移動する事も出来ます。これってどうなんでしょうね。あんまりPCゲームした事ないので分からないですが、良くない事のような気がします。

スタ―トボタンをカーソルで選択してマウスでクリックするとロード画面に移行します。

ロード機能がない。

f:id:kazuhironagai77:20191229110035p:plain

ロード画面だけ作成して、中身を作っていません。これを作成しないといけませんね。

今回は、最初からを選択してゲームを開始します。

f:id:kazuhironagai77:20191229110054p:plain

こんな感じでゲームは始まります。ゲームが開始した後も、カーソルは表示されっぱなしです。キャラクターのコントロールは全く出来ません。

ゲーム画面上にカーソルを置いて、マウスでクリックするとカーソルが消滅してキーボートとマウスでキャラクターのコントロールが出来るようになります。

f:id:kazuhironagai77:20191229110113p:plain

石畳の上を走ると直ぐに、モンスターが追いかけて来ます。はっきり言って圧巻です。しかしモンスターに捕まっても何も起きません。

戦闘開始の追加が必要です。

f:id:kazuhironagai77:20191229110131p:plain

現状、戦闘はTestCombatとコマンドを打つと始まります。

f:id:kazuhironagai77:20191229110149p:plain

あ、nameが直してなかったです。

f:id:kazuhironagai77:20191229110207p:plain

直しました。

UIのPlayerCharacterCombatPanelのGetTextNameTex0関数と

f:id:kazuhironagai77:20191229110305p:plain

UIのEmenyCharacterCombatPanelのGetTextNameTex0関数を

f:id:kazuhironagai77:20191229110336p:plain

直しました。

まず、攻撃ボタンをクリックします。

f:id:kazuhironagai77:20191229110401p:plain

攻撃の右上にゴブリンと書かれたボタンが表示されました。

ゴブリンをクリックします。

f:id:kazuhironagai77:20191229110441p:plain

ゴブリンのHPが15に下がりました。

f:id:kazuhironagai77:20191229110458p:plain

同時に、ゴブリンからの攻撃を食らって雲のHPも4に下がりました。

雲のHPは100から4に下がって、ゴブリンのHPは20から15に下がったのですから、次に攻撃したら、ゴブリンのHPは10に下がるだけですが、雲はHPが100あったのに5まで下がってしまったので、0になって負けてしまいます。

戦闘を中止したいですが、選択支に逃亡はありません。戦うしかないみたいです。

攻撃をクリックしましたが、何も変化しません。

ゴブリンをクリックします。

f:id:kazuhironagai77:20191229110539p:plain

ゲームオーバーに成りました。

戦闘画面がしょぼい。

いくらターン制の戦闘方法の作成を勉強するためと言え、全体的にしょぼ過ぎます。いくらゲームをあんまりしない私でも、しょぼいと思いました。

はっきり言ってこの教科書のメインの部分がターン制の戦闘の作成だったので、この先このままこの本を基礎にしてRPGを作成していくのかどうか、この部分は重要な判断要素になると思います。

次は、マップを使用して道具屋に移動します。

f:id:kazuhironagai77:20191229110617p:plain

道具屋とのやり取りをします。

まず、近づいてEを押します。

f:id:kazuhironagai77:20191229110808p:plain

この画面ははっきり言って悪くないですね。戦闘画面のしょぼさと比較して、単純ですが、UIとしての機能美を備えています。ここから、デザインを発展させる事も出来ますし、悪くないです。

会話を押してみます。

f:id:kazuhironagai77:20191229110828p:plain

表示されている会話の内容が変化しました。これを発展させることで、更に面白く出来そうです。

戻るを押したら、

f:id:kazuhironagai77:20191229110859p:plain

画面が消えてしまいました。これは戻るではなく、止めるですね。

もう一度、Eを押して、道具屋とのやりとりを表示させます。

f:id:kazuhironagai77:20191229113747p:plain

今度は、買い物をクリックします。

f:id:kazuhironagai77:20191229113810p:plain

買い物の画面が表示されました。

この画面の見た目は悪いですね。

f:id:kazuhironagai77:20191229113835p:plain

まずバグですが、この画面に入ってもキャラクターを動かす事が出来ます。

これは直さないと駄目ですね。

戻るをクリックしたら、

f:id:kazuhironagai77:20191229113857p:plain

会話の時と同じで、UIウィジェットが消えてしまいました。

もう一度画面に戻って、今度は回復薬を買ってみます。

f:id:kazuhironagai77:20191229114000p:plain

回復薬の値段は-10ゴールドに設定していたので、買うたびに持っている硬貨の数が10増えます。硬貨でなくて金貨でしたね。まあこれは後で直します。

回復薬とイーサーの値段だけは直しました。Item_shopから以下に示すように直しました。

f:id:kazuhironagai77:20191229114130p:plain

後、買い物する時に道具の値段が見えないと買いにくいですね。これも直さないといけません。

初期の金貨の数を110に変えました。

f:id:kazuhironagai77:20191229114156p:plain

取りあえず、10個ほど買いました。

f:id:kazuhironagai77:20191229114233p:plain

f:id:kazuhironagai77:20191229114242p:plain

ワープしてモンスターがいる位置に戻ったら

f:id:kazuhironagai77:20191229114307p:plain

買った道具が消えてました。

まあ、これはしょうがないですね。二つの違うチュートリアルを合わせて何の調節もしなかったのですから。

今度は短剣を装備してモンスターと戦ってみます。

装備画面は最初から武器が揃っています。

f:id:kazuhironagai77:20191229114345p:plain

短剣(小)を選択します。

f:id:kazuhironagai77:20191229114446p:plain

これでモンスターと戦ってみます。

今度は勝ちました。

f:id:kazuhironagai77:20191229114506p:plain

金貨も10枚増えていますね。

f:id:kazuhironagai77:20191229114549p:plain

道具屋にワープしました。

今回は、HPも金貨の量も変化していませんね。

何故でしょうか?

f:id:kazuhironagai77:20191229114616p:plain

まあ、いいです。回復薬を試してみます。

f:id:kazuhironagai77:20191229114650p:plain

十個ほど購入しました。

使用してみます。

f:id:kazuhironagai77:20191229114716p:plain

5個ほど使用するとHPが前回しました。それ以上使用してもHPは変化しません。2個ほど残しておきます。

もう一度、Pを押して、ポーズ画面を表示すると

f:id:kazuhironagai77:20191229114741p:plain

HPは回復しています。

f:id:kazuhironagai77:20191229114804p:plain

お金も減っています。

f:id:kazuhironagai77:20191229114824p:plain

道具袋を開くと、あれ、使用した回復薬がそのまま残っています。

道具を消費しても、戻っている。

新たなバグですね。

はあ。何これ?

まあいいです。今週は、これから直すリストを作成するのが目的なので、問題がある事が分かるだけでも大切です。

更に以下の事を追加しようと思っています。

  • 武器の売買、もしくは拾えるようにする。
  • ランドスケープを改良する。
  • 音楽、効果音。

<まとめと感想>

今週はこれからやらないといけない部分のリストの作成をしました。

これらがこれからやるリストです。

  • ロード機能の追加
  • 戦闘開始の追加
  • 戦闘画面の改良
  • 道具を消費しても、戻っているバグの修復
  • 武器の売買、もしくは拾えるようにする。
  • ランドスケープを改良する。
  • 音楽、効果音の追加

です。

結構バグが見つかりました。教科書通りに作成したにもかかわらずバグになっている個所があるのがちょっとショックでした。

<inventory system>

f:id:kazuhironagai77:20191229115011p:plain

どうせ、フリーのinventory systemがあるのだから、自分で位置から作成するのとどう違うのか勉強しておこうと思いました。

f:id:kazuhironagai77:20191229115031p:plain

これが、documentですね。これを見ながらやってみます。

f:id:kazuhironagai77:20191229115054p:plain

まず、Create ProjectからProjectを一個作成しろとあるので作成しました。

f:id:kazuhironagai77:20191229115131p:plain

f:id:kazuhironagai77:20191229115138p:plain

そしたら、Inventory systemを使用するプロジェクトを開くように書いてあるので、それ用のプロジェクトを作成します。

作成しました。名前はMy_IS_Studyです。

f:id:kazuhironagai77:20191229115236p:plain

そしたら、Project SettingからInputを選択して右上にあるimportをクリックしてInventorySystemInputを選択しろとあります。

f:id:kazuhironagai77:20191229115310p:plain

どっちでもいいとありましたので、InventorySystemInput(for example project).iniを選択しました。

今度はInventory Systemに戻って

f:id:kazuhironagai77:20191229115334p:plain

InventorySystem全部を選択して、migrateします。

My_IS_StudyにInventorySystemが出来ました。

f:id:kazuhironagai77:20191229115356p:plain

まず、最初にする事はPlayerStateにInventoryManagerSystemComponentを追加する事とありました。

PlayerStateてなんだっけ。

f:id:kazuhironagai77:20191229115657p:plain

之の事か。

一回も使用した事ないやつか。

Officialなサイトでは、 こんな説明がされてました。

f:id:kazuhironagai77:20191229115720p:plain

Playerの名前、スコア、などを保持するクラスみたいですね。GameMode内に保持しているんじゃいけないんでしょうか?

取りあえず、作ってから考えます。

f:id:kazuhironagai77:20191229115740p:plain

を選択します。

何かその下にBP_InventoryPlayerStateがありました。これ使えば作る必要なさそうだったのですが、今はこれは無視しておきます。

f:id:kazuhironagai77:20191229115759p:plain

作りました。

f:id:kazuhironagai77:20191229115824p:plain

これも変えました。

それで、PlayerStateって何するクラスなのか一寸調べます。

UE4のAPIには、

f:id:kazuhironagai77:20191229115844p:plain

となってますね。

ネットワークゲームをしないなら関係なさそうですが。

これ以外にあまりネットの情報が見つからないですね。

きになるのがこの関数。

f:id:kazuhironagai77:20191229115904p:plain

これってEpic Gameに登録した私の名前を返すの?

f:id:kazuhironagai77:20191229120015p:plain

試してみました。

f:id:kazuhironagai77:20191229120038p:plain

思いっきり名前が表示されてます。一体どこから私の名前の情報を得ているのか分かりませんが、私の名前が表示されています。

まあ、名前ぐらいならいいでしょう。

InventoryManagerComponetを追加します。

f:id:kazuhironagai77:20191229120105p:plain

InventoryFunctionLibを開き、Cast to BP_InvenotryPlayStateをCast to MyPlayStateに交換します。

f:id:kazuhironagai77:20191229120157p:plain

CH_InventorySystemCharacterを開きます。

f:id:kazuhironagai77:20191229120229p:plain

次にThirdPersonCharacterを開きます。

f:id:kazuhironagai77:20191229120252p:plain

Event BeginPlayを追加します。

f:id:kazuhironagai77:20191229120327p:plain

何か警告が出ているみたいですが、無視して先に進みます。

f:id:kazuhironagai77:20191229120350p:plain

変数を新たに作成し名前をInventoryManagerにします。タイプは、BP Inventory Managerです。

f:id:kazuhironagai77:20191229120443p:plain

f:id:kazuhironagai77:20191229120503p:plain

InventorySystemCharacterに戻り、以下のコードからevent beginplayを抜いた部分をコピーします。

f:id:kazuhironagai77:20191229121136p:plain

ThirdPersonCharacterに戻り、event beginplayの後にペーストして繋げます。

f:id:kazuhironagai77:20191229121223p:plain

次にBooleanタイプの変数、IsBeingControlledを作成します。

f:id:kazuhironagai77:20191229121304p:plain

更に以下のノードを作成します。

f:id:kazuhironagai77:20191229121323p:plain

UIWidgetを開いている間、キャラクターがプレイヤーからコントロール出来たら困るので、これを全てのinput eventの間に挟むそうです。

そうか。

こうすればいいのか。

Gamepad inputに追加します。

f:id:kazuhironagai77:20191229121418p:plain

Mouse Inputにも追加しました。

f:id:kazuhironagai77:20191229121435p:plain

Jumpも変えます。

f:id:kazuhironagai77:20191229121655p:plain

何でJumpに警告が出ているのでしょうね。

Inputを見てみます。

f:id:kazuhironagai77:20191229121715p:plain

Jumpがない!

ひょっとして最初にやったInputにInventorySystemInputをimportしたから。

f:id:kazuhironagai77:20191229121737p:plain

あー。

InputにInventorySystemInputをimportするのはそう言う事なんですね。

Touch Input、Movement Input、そしてVRにも追加しました。

f:id:kazuhironagai77:20191229121800p:plain

f:id:kazuhironagai77:20191229121807p:plain

f:id:kazuhironagai77:20191229121815p:plain

InventorySystemCharacterの以下の部分をコピーします。

f:id:kazuhironagai77:20191229121833p:plain

Third Person characterにペーストします。

f:id:kazuhironagai77:20191229122133p:plain

エラーになりました。よく見たら、IsBeingControlled?がエラーになってます。IsBeingControlledは作成したはずと思ってよく見てみたら?がなかったです。

?を足したらエラーは消えました。

Craftingがしたい場合は、

f:id:kazuhironagai77:20191229122213p:plain

をコピーペーストせよ。と言ってます。

Craftingがゲーム内の何を具体的に指すのか不明なのですが、これも追加しておきます。

f:id:kazuhironagai77:20191229122301p:plain

しました。

今度は、InputActtionOpenChestです。説明書にはRayCastingを使用しているので、BPが複雑になっています。コピーの失敗をしないようにと忠告されていました。

そんな大変ならば、少しずつやって行きます。

まず、以下の部分からやります。

f:id:kazuhironagai77:20191229122416p:plain

InputAction OpenChestとはCustom Eventなのでしょうか?

InputActionみたいですね。と思ったらInputActionと書かれていました。

でも、

f:id:kazuhironagai77:20191229122446p:plain

ないじゃん。

f:id:kazuhironagai77:20191229122523p:plain

試しに追加してみます。

f:id:kazuhironagai77:20191229122548p:plain

のエラーが消えました。

一個ずつ理解しながらやって行こうと思ったのですが、メンドクサイのでコピーで済ましてしまいました。

f:id:kazuhironagai77:20191229122616p:plain

ThirdPersonCharacterのGraphsに新しいGraph、HotbarControlを追加しました。

f:id:kazuhironagai77:20191229122638p:plain

CH_InventorySystemCharacterのHotbarControlのノードをそのままコピーしました。

f:id:kazuhironagai77:20191229122700p:plain

説明書によるとこれで一応完成らしいのでテストします。

f:id:kazuhironagai77:20191229122728p:plain

何か結構重いです。がそれなりには動きます。

f:id:kazuhironagai77:20191229122745p:plain

ゲーム画面を停止したらこんなにエラーが表示されました。

エラー表示をみたら、WBP_CraftingWIdgetの

f:id:kazuhironagai77:20191229122814p:plain

がエラーになっているみたいです。

f:id:kazuhironagai77:20191229122841p:plain

Get Inventory ManagerのノードとCast to MyPlayerStateのノードが繋がってなかったです。

f:id:kazuhironagai77:20191229122859p:plain

繋げました。

もう一度テストします。

f:id:kazuhironagai77:20191229122924p:plain

今度はエラーは出ませんでした。

今度は、Eを押してみます。

f:id:kazuhironagai77:20191229123205p:plain

左上に5×5のマスが表示されました。

成功なんでしょうか。取りあえず次をやります。

f:id:kazuhironagai77:20191229123224p:plain

これを配置します。

f:id:kazuhironagai77:20191229123307p:plain

取りあえず、2個ほど配置しました。

f:id:kazuhironagai77:20191229123337p:plain

f:id:kazuhironagai77:20191229123345p:plain

設定をAppleとBurgerにしました。

ゲームを開始して白いボールにぶつかると、ボールが消えます。

そしてEを押して5×5のマスを開くと、

f:id:kazuhironagai77:20191229123404p:plain

と表示されました。

コントロールの確認

Eを押します。Inventoryが開いたり閉じたりするそうです。

f:id:kazuhironagai77:20191229123426p:plain

もう一度Eを押します。

f:id:kazuhironagai77:20191229123508p:plain

5×5のマスがinventoryを表しているみたいですね。

Iを押します。Craftingを開くそうです。

右上に以下の図が表示されました。

f:id:kazuhironagai77:20191229123534p:plain

マウスをrifleの上に置くと、リンゴ5個とハンバーガー1個でライフル1個作成出来るみたいです。

f:id:kazuhironagai77:20191229123557p:plain

やってみますか。

f:id:kazuhironagai77:20191229123633p:plain

何か出来たみたいですね。

Oを押してChestを開きます。Chestがどれなのか分からないですね。

f:id:kazuhironagai77:20191229123701p:plain

BP_ExampleChestを置いてみました。

f:id:kazuhironagai77:20191229123747p:plain

Oを押しても何も反応しませんでした。

これは良く分からないのでパスします。

1-9もしくはスクロールウィルを使用してスロットのホットバーを選択します。

f:id:kazuhironagai77:20191229123858p:plain

これ最初何を言っているのか分からなかったですが、上の図が示したように、赤いマークを自由に動かせる事でした。

Qを押してアイテムを落とします。

f:id:kazuhironagai77:20191229123919p:plain

出来ました。

一応は動いているようですね。

<オリジナルなアイテムを追加>

EItem enumを開きます。

f:id:kazuhironagai77:20191229123959p:plain

これですね。

f:id:kazuhironagai77:20191229124029p:plain

こんな感じです。

f:id:kazuhironagai77:20191229124052p:plain

新しいアイテムを追加しました。

更に、DT_Itemsを開き、MyFirstItemを追加しました。

f:id:kazuhironagai77:20191229124124p:plain

f:id:kazuhironagai77:20191229124131p:plain

テストしてみます。

f:id:kazuhironagai77:20191229124153p:plain

Imageは表示されましたね。

f:id:kazuhironagai77:20191229124230p:plain

アイテムをドロップしてみました。

うーん。出来ているのでしょうか?

<UIのカスタム化>

UMG内の以下の変数の値をいじる事でUIのカスタム化が出来るとあります。

f:id:kazuhironagai77:20191229124602p:plain

しかしこの変数、存在はしているのですが、使用されていません。唯一使用している箇所は、

WBP_HotbarSlotだけでした。

f:id:kazuhironagai77:20191229124621p:plain

良く分かりません。この方法は今のバージョンでは出来ないのかもしれませんね。

次の方法はスロットの見た目を変えるとありました。

f:id:kazuhironagai77:20191229124641p:plain

の設定を変えてみましたが特に何も変わりませんでした。

こちらも良く分かりません。

これ以外の変更をする場合は、公式のサポートはしませんと書かれていたので、この個所はこれ以上はやらない事にします。

<クラフト機能の使用>

まず最初にする事はクラフト機能を追加する事です。これをするためにDT_Craftingを開きます。

f:id:kazuhironagai77:20191229124718p:plain

f:id:kazuhironagai77:20191229124728p:plain

MyFirstItemCraftingを追加します。

f:id:kazuhironagai77:20191229124800p:plain

直ぐ使用するので、IsUnlockedにチェックを入れます。

f:id:kazuhironagai77:20191229124822p:plain

Save file をはずします。

f:id:kazuhironagai77:20191229124849p:plain

これを消せばいいみたいです。

ゲームを開始してIボタンを押してみます。

f:id:kazuhironagai77:20191229124933p:plain

出来ていますね。

Appleが1個、Pearが1個ある状態でMyFirstItemCraftingボタンをクリックします。

f:id:kazuhironagai77:20191229125006p:plain

MyFirstItemが作成されました。

これ作成のアニメーションを追加出来たらいいんですが。その機能はないみたいですね。

<Chestの機能の使用>

Chestの使用方法が分からなかったですが、ここで分かるのでしょうか。

BP_StorageChestを親クラスとするBPを作成します。

f:id:kazuhironagai77:20191229125033p:plain

作成しました。

行列の値を以下に示すRow size とRowsで変更出来ますとあります。

f:id:kazuhironagai77:20191229125052p:plain

これが何を指しているのか不明なのでこのままで行きます。

これで完成みたいです。これをレベル上に置いて、キャラクターがchestを向いた状態でOを押すと、ItemをChestに保存出来るようになるみたいです。

f:id:kazuhironagai77:20191229125120p:plain

いくらOを押しても反応しませんね。

色々調べて分かったのは、Chestをray tracingがキャッチしていないですね。まあ一個ぐらい動かなくてもいいでしょう。

<感想とまとめ>

このInventory systemを直接使用したいとは思いませんが、ブループリントのコードは参考になります。Ray tracingはOpenGLでも組んだことがありますし、自分で勉強してBP上で動くようにしたいです。

最後まで書いて気が付いたですが、Chestの部分でoを押していましたが、設定ではcにセットしていました。来週、この部分はもう一度トライします。