UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する 新しい機能を追加する

f:id:kazuhironagai77:20200823214016p:plain

<前文>

遂にアプリのショバ代戦争が始まりました。私はアメリカでアプリ開発者や小売り業者が自分たちのWebsiteで同じアプリや商品を安く売り始めているのがトレンドになっているのは聞いていたのと、アップ〇社の創設者が30%のショバ代はOSから全て作成している中で第三者にアプリを販売できる環境を提供している事から決して暴利ではないし、アプリの審査はユーザーの安全を保障するためのものでこれも決してアプリ開発業者を差別するためのものではない。と突然言い始めたのを聞いて、アプリのショバ代戦争の前兆は感じていましたが、まさかUE4を有するEpic Games社が先陣を切るとは思いませんでした。

アップ〇社の言い分は良く分かりますが、マイクロソフ〇社のOSとIEとネットスケー〇社の話を知ってしまうとウーンと思ってしまいますね。個人的にはこの裁判はepic gamesに勝ってほしいと思います。ただ公平に言えばアメリカの世論でもアップ〇を支持する人も多いです。私がいつも情報源にしている人達でもこの裁判をどう思うのかについては意見が割れています。基本的にプログラマーはEpic側、弁護士はアップ〇を支持しています。アップ〇で一度でも働いた事のあるプログラマーgoogleでは働けませんし逆もまたしかりなので、プログラマーにとってはこの二つの会社しか提供していない携帯電話のOSは完全な独占(duopoly)です。その上でそのOS上で動くアプリを提供するプラットホームは自分たち以外には絶対に許可しないとやっていたら、「マイクロソフ〇社もやっていいよね。でもマイクロソフ〇社がそれの何倍も緩い事をやろうとしたときあんたらなって言ったけ。」と言いたくなります。他の職業や消費者にとってはそんなのは関係ないでしょうが。

ただし、私はこれからのコロナ共生時代は携帯電話の価値が大きく下がると思っているんです。コロナ共生時代はテレワークが主力になると考えているからです。自宅でPCが使用出来き、かつ一日の大半を自宅で過ごす時代になったら、基本的に携帯は要らなくなるからです。

だから私はこのアプリのショバ代戦争でEpic Games社がどうにかなるような事は無いと思っています。

それよりもUE4のユーザーが考えなければならないのはどうすれば面白いゲームが作れるか?だと思います。私もやっとUE4の使い方を理解出来ましたが、どうしたら面白いゲームが作れるようになるのかは全く分かりません。結局ゲームってのは、娯楽ですから面白く無ければ駄目なんです。

そこでFall Guysですよ。先週このゲームの実況をずっと見てました。(関係ないですがvtuberも初めて見ました。)ゲームはやらない私ですが、見ているだけでも本当に楽しいゲームです。しかし何でこのゲームが楽しいのか良く分からないんです。みんなでワイワイやるのが楽しいでしょうか。となるとやっぱり次に勉強するのはMMOの作成方法ですかね。

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

<本文>

一応先週で、今まで作成した全ての機能の追加は終了したはずです。

それで今週は全体を見直してどんな機能を追加するか考えていこうと思います。

f:id:kazuhironagai77:20200823214210p:plain

まず、スタート画面ですが、作り直す必要がありますね。

f:id:kazuhironagai77:20200823214225p:plain

プレイ画面ですが、ここにもウィジェットがほしいですね。

後、地面や草もきちんと作成したいです。

f:id:kazuhironagai77:20200823214241p:plain

後は敵との戦闘システムですか。

アイテムや宝箱を拾えるようにもしたいです。

まだまだ直したい事はいっぱいありますがこの辺から直していきます。

. 新しい機能の追加

1.1 スタート画面の作成

スタート画面を作成し直します。

f:id:kazuhironagai77:20200823214312p:plain

f:id:kazuhironagai77:20200823214319p:plain

f:id:kazuhironagai77:20200823214327p:plain

f:id:kazuhironagai77:20200823214334p:plain

取りあえずスタート画面はこんな感じです。

カメラの回転は、新しいアクターを作成してそれに管理させました。

f:id:kazuhironagai77:20200823214353p:plain

f:id:kazuhironagai77:20200823214359p:plain

f:id:kazuhironagai77:20200823214406p:plain

そのクラスのインスタンスをlevel BPから作成して使用するカメラとしてSetViewTargetwithBlend関数にセットします。

f:id:kazuhironagai77:20200823214453p:plain

特に新しい事はしていませんので残りの工程は省略します。

Play画面にウィジェットを追加して簡単な操作が出来るようにしようと思いましたが、そうすると常にマウスのカーソルを表示する必要があります。これはちょっと考える必要がありそうですので今回はパスします。

Level内のマップのデザインですが、デザインをどこまで自分で勉強するかはまだ考え中なのでこれも今回はパスします。

1.2  落ちているアイテムを拾う

もう大体、UE4の機能も大体理解して来たので自分で考えて作成してみます。

出来ました。

まず結果から示します。

f:id:kazuhironagai77:20200823214515p:plain

アイテムは3Dモデルがまだなかったので取りあえず武器だけ作成しました。

上のスクリーンショットに示したように木の盾(小)と短剣(小)が落ちています。

短剣(小)に近づいてEを押すと以下のUIが表示されます。

f:id:kazuhironagai77:20200823214532p:plain

「拾う」をクリックすると

f:id:kazuhironagai77:20200823214547p:plain

短剣(小)の3Dイメージが消えて

f:id:kazuhironagai77:20200823214602p:plain

装備品に短剣(小)が追加されます。

こんな感じで作成しました。

まずDropItemBaseクラスを作成します。

f:id:kazuhironagai77:20200823214618p:plain

マップ上にこのクラスのインスタンスを、拾えるアイテムとして配置します。そのためには、

f:id:kazuhironagai77:20200823214635p:plain

f:id:kazuhironagai77:20200823214641p:plain

3Dアイテムを表示するためのStaticMeshとキャラが近づいてきた事を知らせるBoxのtriggerを追加します。

更に、以下に示した3つの変数を追加します。

f:id:kazuhironagai77:20200823214658p:plain

RPGGameInstanceにアイテムを拾うために必要な幾つかの変数を追加しました。(後で説明します。)のでMyGameInstanceでassignする必要があります。Name変数はアイテムの名前です。IsWeaponはこのアイテムが武器か道具かを示すためのBooleanです。

f:id:kazuhironagai77:20200823214715p:plain

このクラスのインスタンスが作成されたらEvent BeginPlayで直ぐにNameからMeshを作成し、それをStaticMeshにセットします。

f:id:kazuhironagai77:20200823214734p:plain

関数、ReturnStaticMeshOfItemsは上記に示した実装をしています。これで武器の名前から該当する3Dモデルを返します。

このインスタンスのボックス内でEを押すと以下のlevel内に実装されたコードからPickUpItemWIdgetが呼ばれます。

f:id:kazuhironagai77:20200823214752p:plain

基本的に全てのユーザーからのインプットはThirdPersonCharacterクラスが管理するはずなのですが、何故かLevel BPで管理されています。後で直します。

以下にPickupItemウィジェットを示します。

f:id:kazuhironagai77:20200823214808p:plain

実装するに当たって特に新しい事はしませんでした。ので実装部は省略します。

課題を以下に示します。

DropItemBaseのインスタンスを置く場合、ボックスが重ならない様に設置する必要があります。

f:id:kazuhironagai77:20200823214825p:plain

重なるとたまに変な挙動を示す事があります。

以上です。

あまりうまく説明出来ませんね。次回からは、やりながらまとめる事にします。きちんと完成するか不安だったので取りあえずやってみたらブログに記録するのをすっかり忘れて終りまで進んでしまいました。

宝箱とアイテムは3Dモデルがないので後で作成します。

1.3  NPC(村人)との会話

武器屋や道具屋の主人との会話は出来ましたが単なる村人との会話システムはまだ作っていませんでした。

これは、基本的には武器屋や道具屋の主人との会話の簡易版でいいはずです。道具屋の主人をどうやって作成したのか忘れてしまったのでその復習から始めます。

Characterクラスから作成していますね。

f:id:kazuhironagai77:20200823214858p:plain

中を見てみます。

f:id:kazuhironagai77:20200823214916p:plain

f:id:kazuhironagai77:20200823214922p:plain

うーん。ボックスぐらいですかね。特に追加してあるのは。

f:id:kazuhironagai77:20200823214938p:plain

当然ですが、ボックス内にプレイヤーの操作するキャラが入った時にeventが発動します。

f:id:kazuhironagai77:20200823214954p:plain

正し、RPGGameInstanceBPのTalkShop変数の値を変更しているだけですね。

ここでTalkShop変数がTrueになるとプレイヤーがEを押した時にイベントが始まります。勿論、私はlevel BP内にその事を実装したと覚えていますからlevel BPを開きますが、本当ならThirdPersonCharacterに実装すべきですね。

f:id:kazuhironagai77:20200823215010p:plain

WidgetのShopWelcomeを開いているだけですね。

f:id:kazuhironagai77:20200823215027p:plain

これを見るとShopWelcomeウィジェットの親クラスはNPC_Parentですね。どんなウィジェットだったのか覚えていません。見てみます。

f:id:kazuhironagai77:20200823215044p:plain

何これ、なんもないじゃん。

f:id:kazuhironagai77:20200823215108p:plain

思い出しました。ここでNPCのセリフを一括管理しているんでした。

f:id:kazuhironagai77:20200823215124p:plain

後、このTextの配列(array)をduplicateするとshallowコピーになるのか知りませんが、子クラスからその配列が参照出来なくなるんでした。

うん。作り方は分かりました。

まず村人を作成します。

f:id:kazuhironagai77:20200823215140p:plain

NPC_ItemShopOwnerkからduplicateしました。

f:id:kazuhironagai77:20200823215153p:plain

RPGGameInstanceクラスにあるTalkShop変数の代わりになる変数を作成するのですが、この方法で管理すると50人NPCを作成したら50回UE4C++のRPGGameInstanceクラスを書き直して一々buildしなければならなくなります。ちょっと管理方法を考えます。今回はRPGGameInstanceBPクラスに作成する事にします。

f:id:kazuhironagai77:20200823215211p:plain

f:id:kazuhironagai77:20200823215220p:plain

今度はLevel BP内から

f:id:kazuhironagai77:20200823215240p:plain

その村人と会話する場合に開くWidgetを指定します。

f:id:kazuhironagai77:20200823215318p:plain

Level BPで管理している事を差し置いてももうグダグダになっています。上から道具屋、武器屋、アイテムを拾う場合、そして村人との会話です。後でSwitchをつかって綺麗に書き直します。

NPC_Parentに村人用のdialogを作成します。

f:id:kazuhironagai77:20200823215336p:plain

f:id:kazuhironagai77:20200823215342p:plain

子クラス、Oldman_Welcomeを作成します。

f:id:kazuhironagai77:20200823215358p:plain

f:id:kazuhironagai77:20200823215405p:plain

Level BPからこのウィジェットを作成します。

f:id:kazuhironagai77:20200823215421p:plain

テストします。

f:id:kazuhironagai77:20200823215436p:plain

出来ました。

1.4  ナレーション用のウィジェット

会話だけでなくナレーション用のウィジェットも一つほしいですね。作ります。

出来ました。やり方は今までと同じなので特に記録する必要はないと思い省きました。

f:id:kazuhironagai77:20200823215503p:plain

以下に示したように、Box内にプレイヤーが操作するキャラが侵入するといきなり表示されます。

f:id:kazuhironagai77:20200823215527p:plain

2. 今後の展開

現在作成しているRPGは沢山の機能が追加されましたが、ゲームとしてはまだ足りない部分が沢山あります。ただしどの部分が足りないのかが把握していません。どうしたら良いでしょうか。ゲームとして完成させるのが足りない部分を把握する一番の近道かもしれません。ので今後は、実際にプレイ出来るゲームとして足りない部分を追加する事にします。

ただし、ここで大きな問題があります。それはアートの部分です。私はプログラマーで3Dモデルや音楽を作成する能力はありませんので、その辺が必要な時にどうするか決めておく必要があります。

3Dモデル、音楽、ストーリーの3つの分野についてどうするか以下にまとめました。

2.1 3Dモデル

単純に3Dモデルと言いましたが以下の分野を総合して言っています。

2.1.1 Level デザイン

街や村、迷宮や城から、草原、森、沼地などの作成を総合しています。PostProcessingもここに含める事にします。

2.1.2 キャラクターやモンスターの3Dモデルやそのアニメーション

現状は無料でもらった3Dモデルと付属のアニメーションを使用しています。基本的に今は足りていますが、村人などのNPCはいません。3Dモデルの作成は勉強したい分野でかつBlenderを使用すれば無料で出来るので時間が許されれば自作したいです。マテリアルの作成もここに含まれます。

2.1.3 物の作成

ここで言う物とは本や巻物、ランプなどから木や家などを含みます。基本的にLevelデザインで配置するそれぞれのユニットの作成です。2.1.2 のキャラクターとの違いはrigがない事です。

2.1.4 魔法などのエフェクト

これはNiagara systemもそろそろ勉強しないといけないので勉強します。

これ以外もあるかもしれませんが今思いついたのを書き出しました。

2.2 ストーリーはどうするのか?

読書家な私としてはストーリーは自分で考えたいですが、それに拘ってUE4の勉強がおろそかになる事は避けたいです。

2.3 音楽はどうするのか?

ここだけははっきりしています。私は音楽に全く興味がないです。市販のものか無料で商業利用可能なものを適当に追加します。

3.まとめと感想

今週はこれだけです。