UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する 前のプロジェクトで自作した機能を追加する

f:id:kazuhironagai77:20200802215539p:plain

<前文>

もう中国とアメリカが戦争するのは避けられないPhaseに入ったなと思うのは私だけじゃないみたいで、ネットでもそこかしこに呟いている人がいるみたいです。トータルで10年アメリカに住んでいた私はかなりのアメリカの事情に通じていますが、そんな私は、今度の戦争はアメリカが負けるんじゃないかと言う気がしてかなり心配しています。私はアメリカにいる中国人を介してしか中国を知りませんから、中国が単なる張りぼての虎なのか実際凄いのかは分かりません。だから実際の中国は滅茶苦茶弱くて全く問題なかった。と言う可能性も勿論あります。しかしアメリカに限って言えば問題山積みで、BLMや新型コロ〇の対応を見ても「日本よりマシなのか?」と言う感じでひょっとするとベトナム戦争以上の泥沼化するとんでもない事態になるかもしれません。

正しComputer Scienceの分野に関してはアメリカの大学は依然として世界のトップを独走してますので留学する価値は断然あります。何事もリスクを取らなければ利益は得る事は出来ないのも真実で、これからの日本人は大局観を持たないと生きていけない時代になったのだと腹を括るしかないですね。

そう言えばアメリカ人のプログラマーが大学でComputer関連を勉強したい人向けにしたアドバイスで中々素晴らしいなと思ったのが2つほどあったのでそれを紹介します。アメリカの大学でcomputer scienceを勉強するために留学を考えてる高校生が私のこのブログを読んでいる可能性は0かもしれませんが、かなり含蓄を含んでいるアドバイスで、誰にでも参考になる内容でもあります。

最初のアドバイスはComputer science+別のメジャーのダブルメジャーの進めです。アメリカではプログラマーは花形中の花形の職業で競争が滅茶苦茶激しいです。他の学部なら奨学金が貰えた学生でもComputer scienceに専攻を変えたら成績が真ん中になるなんでザラです。そんな中で勝ち抜いた一握りの人だけが、Googleのような企業に就職出来る訳で大変な競争率な訳です。更に今、アメリカで話題になっているビザの問題も海外から留学した学生の場合は考えないといけません。これはアメリカ人の上司が外国人の部下の成果を奪うためにワザとビザの申請を忘れてアメリカから追い出す事です。何故これが明らかになったかというとフェイス〇ックで中国人の従業員がビザの申請がされていないのでアメリカから出国しなければならない事を知ってその場で飛び降り自殺した事件があったからです。(私が中国とアメリカの戦争が避けられないと思っているのはこういう事件がアメリカ中で起こっているからでもあります。)

こんな過当競争の中に身を置くより、ダブルメジャーになって他の分野でプログラマーとしてやって行く方が仕事もあるし収入も実際は安定しているらしいです。Computer scienceで上位の成績を維持できる生徒ならダブルメジャーも簡単ですし。実際、私は化学とcomputer scienceのダブルメジャーだったですがこんな経験もしています。ある物理化学の研究室で実験で得たスペクトラムキャリブレーション用のスペクトラムを比較するのに、それまでは1枚は水に濡らして窓ガラスに貼ってもう1枚を窓ガラスの反対側から重ねて一致する点を探していたのを、私が同じ事をパソコン上で出来るソフトを作成したら、その研究室のみんなから、パソコンに関する質問を山のように受けました。そのほとんどはExcelのデータの上下を逆にしたいがやり方が分からないみたいなパソコンの大先生でも解決出来るような内容で1日もかからずに解決したのですが、その後、その研究室のメンバーからの強烈な支持を受けました。彼らは元々量子化学の専門家なのでパソコンの専門家でいる必要がないんです。だからパソコンの専門家として別人を推薦しても自分の仕事が無くなる可能性が全くないのでいくらでもポジティブな推薦をしてくれるのです。その後、理論量子化学の研究室(こっちは1日中パソコン使って量子化学の計算をしているので化学者の間ではパソコンの専門家と思われている。)から意地悪されたのと、Computer scienceの3d graphicsの研究室に入れる事が決まったので化学とは疎遠になってしまいましたが、ダブルメジャーならパソコン関連の専門家として重宝されるのは間違いないです。

もう一つは「コンテンツクリエーターになる。」です。ひと昔前は、優れたソフトを開発すればすぐに売れたのですが、今はそれよりも誰が使っているかが重要になっているそうです。SNSで有名な人が使っているソフトは直ぐに何十万もダウンロードされますが、そのソフトより優れた機能があっても有名な人が使わないソフトは誰もダウンロードしないそうです。更に自分が有名なコンテンツクリエーターになれば、作成したソフトウェアは勝手に大量にダウンロードされるようになるらしいです。だからプログラマーと言えども今までのように裏方に回っていれば良いのではなく、真剣にコンテンツクリエーターとして自分を売り出す必要があるとの事です。

この意見は、半分だけ正解な気もします。最も人気が出るコンテンツはYouTubeでも高校生向けのコンテンツだからです。これは視聴者の知識と知性の平均が見事に高校生のそれとマッチしているからです。だから人気がある事と正しい事は必ずしも一致しないとも言えます。しかし有名なコンテンツクリエーターの存在は、ソフトの性能以上に重要な要素である事もまた事実で、もし有名なコンテンツクリエーターになれるのならダブルメジャーになるより遥かに効果があるでしょう。

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

<本文>

ブログを見直すと去年の10月頃から新しい機能を追加していました。そんな昔からやっていたのかと結構ショックでした。このブログからです。そして3月1日のこのブログが最後です。数えてみたらその間に16回ブログを書いていました。流石に16回分のブログをここでやり直したら、更に4カ月かかってしまいます。

どうしようかな?

取りあえず今週はそのままやってみます。

1.自作した機能を今回のプロジェクトに追加する

1.1  10月24日のブログの内容を追加する。

ブログを読んでみると、この週では3つのレベルを自作してそれぞれのレベルに地図からワープ出来るような機能を作成しています。Fast Travel Within A single Level and Multiple Levels - (UE4)をそのまま使用して作成しています。その他にSetInputModeGameAndUI()BP関数とSetInputModeGameOnly()BP関数についての考察を行っていて自分で書いておいてアレなんですが結構興味深い内容でした。

まず、Fast Travel Within A single Level and Multiple Levels - (UE4)のワープするマップを追加します。

流石に前回のマップは適当すぎるのでまた作り直しました。ボタンは前回作成したものをそのまま使用します。

f:id:kazuhironagai77:20200802215701p:plain

2つのenum、Mapとzoneも作成しました。

f:id:kazuhironagai77:20200802215725p:plain

ここでチュートリアルはlandScaleを作成しますが、このプロジェクトには作成しません。

このチュートリアルではLighting need to be rebuiltが表示されているので以下の事をして消しています。

Light source とSkyLightのMobilityをMovableにセットする。

f:id:kazuhironagai77:20200802215757p:plain

前回、この部分はスキップしたのですが、この方法を採用するとLightingのrebuilt をしなくて良くなるそうです。なんでなんでしょうか?後で調べます。

Mapをコピーしてmap2とmap3を作成します。

f:id:kazuhironagai77:20200802215818p:plain

f:id:kazuhironagai77:20200802215832p:plain

f:id:kazuhironagai77:20200802215842p:plain

区別がつくようにちょっとだけ色を変えました。

後、Reflection captures …と表示されていて結局buildしないといけないみたいですね。この事も後で検討します。

Waypointを作成します。前回作成したのをそのまま使用するのが簡単なのですが、このwaypoint、アクター内で2つ以上のStatic Mesh Componentを使用して形状を作成するという、結構大事なポイントがあるので一応今回も作成する事にします。

f:id:kazuhironagai77:20200802215902p:plain

MeshよりもTextRenderを使用したりConstructionScriptを使用したりするところがあり、そっちの方が勉強になりました。

f:id:kazuhironagai77:20200802215922p:plain

Waypointを配置しました。

f:id:kazuhironagai77:20200802215943p:plain

W_mapを作成しました。

f:id:kazuhironagai77:20200802220023p:plain

ThirdPersonCharacterに以下のコードを追加する事でMを押すとマップが表示されるようにしました。

f:id:kazuhironagai77:20200802220050p:plain

SetInputModeGameAndUIとSetInputModeGameOnlyはここで使用しています。

f:id:kazuhironagai77:20200802220108p:plain

このように使用する事で、

W_mapを閉じた瞬間にマウスのcursorが消えます。

スクリーンショットはマウスのcursorが消えてしまうので取れなかった。)

このやり方は全部のウィジェットに適用すべきで、後で直します。

ここから先はほとんど前回と同じなので省いて結果だけ示します。

f:id:kazuhironagai77:20200802220145p:plain

f:id:kazuhironagai77:20200802220158p:plain

f:id:kazuhironagai77:20200802220208p:plain

f:id:kazuhironagai77:20200802220217p:plain

f:id:kazuhironagai77:20200802220225p:plain

f:id:kazuhironagai77:20200802220235p:plain

ハイ出来ました。

このチュートリアルで真に重要なのはSetInputModeGameAndUIとSetInputModeGameOnlyを使用する事でプレイ画面に切り替えた瞬間からマウスのカーソルを表示させない事です。pause画面を表示した場合もこの機能を使用してマウスのカーソルを消すべきです。

1.2 ブログの内容(11月3を追加する

うーん。一読したら、一体何しているのか良く分からないです。よくよく読んで理解出来たのですが、要するに先週は、Fast Travel Within A single Level and Multiple Levels - (UE4)を真っ新なプロジェクトに作成したので、今度は今までゲームを作成しているプロジェクトであるch2に追加する。と言う事みたいです。と言う事はこの週の内容は既に終わらせていると言う事になりますね。

さらっとだけ復習して終わりにします。

f:id:kazuhironagai77:20200802220320p:plain

とありますが、この時はゲーマーがどんな人達なのは知らないからこんな呑気な事を言っているんでしょうね。ゲーマーなんて隙あらばチートするんだからもうこれは絶対消した方がいいに決まっています。

f:id:kazuhironagai77:20200802220341p:plain

前回のプロジェクトではスタート画面はUE4C++で作成していました。今回はBPから作成しています。

どっちが良いと言うわけではないですが、両方のやり方を覚えておいた方がいいですね。

あれ、でもRPGGameModeBaseクラスでBeginPlay関数を

f:id:kazuhironagai77:20200802220403p:plain

こうやって書いたからBPであるRPGGameModeBaseBPからEventBeginPlayは呼べなかったんじゃなかったのかな。

確認します。

f:id:kazuhironagai77:20200802220424p:plain

レベルBPから呼んでました。うーん。成程。

この週のブログはこれで終わりですね。

1.3 ブログの内容(11月10日)を追加する。

プレイヤーが操作するキャラの3Dモデルの交換を行っていました。これは最初にやった時で、かなりおっかなびっくりやっています。

f:id:kazuhironagai77:20200802220507p:plain

このブログの内容は既に終わっているのでスキップします。

1.4 ブログの内容(11月17日)を追加する

プレイヤーが操作するキャラに武器を持たせられるか試していますが、実際にコードを書いて変更する処まではやっていないみたいですね。

それ以外は既にch4_3でも実装されている内容なのでこのブログもスキップします。

1.5 ブログの内容(11月24日)を追加する。

UIの日本語化を行っています。やります。

全部やりましたが以下に一部示します。

f:id:kazuhironagai77:20200802220548p:plain

f:id:kazuhironagai77:20200802220556p:plain

f:id:kazuhironagai77:20200802220608p:plain

f:id:kazuhironagai77:20200802220617p:plain

f:id:kazuhironagai77:20200802220627p:plain

f:id:kazuhironagai77:20200802220649p:plain

UIのデザインが教科書のそれなので作り直さないと醜いですね。

店主のセリフを大量に追加していますが、これは後で考えるので今回はやりません。

次に店主の3Dモデルを変えます。

f:id:kazuhironagai77:20200802220719p:plain

今度はこんなのにして見ました。

お店も作成します。

f:id:kazuhironagai77:20200802220741p:plain

最初なんで、こんなもんです。

この後、武器を追加していますが既にやっているのでこの週のブログの内容は全て追加出来ました。

1.6 ブログの内容(12月1日)を追加する。

この週のブログではモンスターを追加しています。

モンスターは既に追加しているのですが、そのモンスターにAIはまだ搭載していませんのでその辺を作って行きます。

ぱっと読んだんですがやり方を忘れてしまっていてどうすればいいのか分かりません。

取りあえず、AutoPossessAIをPlacedinWorldorSpawnedに変更しました。

f:id:kazuhironagai77:20200802220812p:plain

空中に浮いていたモンスターが地面に足を付けています。

f:id:kazuhironagai77:20200802220838p:plain

正確に言うと今でも僅かに浮いていますが、前と比べてると地面に足を付けていると言って良いです。(以下に前の状態を示します。)

f:id:kazuhironagai77:20200802220903p:plain

これでこの週のブログは終です。

1.7 ブログの内容(12月8日)を追加する。

こっちのブログにモンスターのAIの作成方法が詳しく説明されていました。これに沿ってAIも実装してみます。

出来ました。モンスターが追いかけて来ます。

f:id:kazuhironagai77:20200802220940p:plain

出来たんですが、何をやっているのか全く忘れてしまいました。後でAIの復習をする事にします。

1.8 ブログの内容(12月15日)を追加する。

この週のブログはAIの勉強だけしていますね。後でやります。

1.9 ブログの内容(12月22日)を追加する。

この週もAIの勉強だけしています。どうもUE4のAIがIF-statementだけで構成されているのでそれがAIなのか心配になって色々なAIの本を読んでいたみたいです。普通AIと言えば機械学習とか深層学習とかを指していると思われるからその辺を突っ込まれても大丈夫にしたかったみたいです。

今考えればそんな事はどうでも良くて、UE4で敵のモンスターが私が希望したように動いてくれる事のみが大事です。

1.10 ブログの内容(12月29日)を追加する。

これから直すリストを作成しています。後、無料のinventory systemを試していますね。そんだけです。

1.11 ブログの内容(1月12日)を追加する。

色々書いていますが、やったのは道具を使用した時にアイテムが消費されないバグを直す事だけです。これはch4_3でも既に直しています。

1.12 ブログの内容(1月19日)を追加する。

この週のブログではそれぞれのアイテムにイメージを追加してそれを買い物中に表示するようにしていますね。この機能をch4_3に追加します。

ブログに詳しい説明が書かれているのでそのまま作成します。

f:id:kazuhironagai77:20200802221035p:plain

出来ました。

ブログではマウスが外れた時に、このウィジェットを消す機能は作成していないですがその部分も作成しました。

この週のブログは他にも色々やっていて一個ずつ潰していきましょう。

1.12.1 道具の効果にHP以外も追加

これは既に作成したと思いますが確認します。

f:id:kazuhironagai77:20200802221112p:plain

イーサーを使用したらMPが0から20になりました。出来ています。

1.12.2 ワープしても所有している道具が消えないようにする。

しました。

これは単にThirdPersonCharacterで作成したアイテムを保持する配列の代わりに元々、アイテムを保持するためにRPGGameInstanceの変数Itemsにアイテム名を保持させるだけで出来るはずです。

f:id:kazuhironagai77:20200802221142p:plain

アイテムを使用したので配列から名前を消去する場合、ThirdPersonCharacterのText配列と違って以下に示したように非常に簡単に出来ました。

f:id:kazuhironagai77:20200802221202p:plain

テストします。

f:id:kazuhironagai77:20200802221220p:plain

アイテムを所持した状態でワープします。

ワープした後でpauseを開くと

f:id:kazuhironagai77:20200802221240p:plain

所持しているアイテムはそのまま持っています。はい出来ました。

1.12 ブログの内容(2月2日)を追加する。

武器屋を作成します。

この週のブログに詳しい作成方法が載っていますので同じようにやります。

うーん。完成した結果だけ載せようと思っていたのですが、この週のブログ結構説明が抜けています。説明が足りない部分の補足をここに示しておきます。

f:id:kazuhironagai77:20200802221305p:plain

ここで説明されている新しいNPCDialogですが、WeaponShop_Welcomeウィジェット内に作成するのではなくWeaponShop_Welcomeウィジェットの親クラスであるNPC_Parentクラス内に作成します。

テキスト内の文字がはみ出してしまうが直し方が分からないと言っています。

Textboxを選択して以下の箇所にチェックを入れれば文字はテキストボックス内に表示されます。

f:id:kazuhironagai77:20200802221325p:plain

f:id:kazuhironagai77:20200802221333p:plain

次に武器屋で買い物が出来る様にします。

あんまりコードを変えたので結果だけ示します。

f:id:kazuhironagai77:20200802221356p:plain

武器屋で短剣を買いました。それを装備します。

f:id:kazuhironagai77:20200802221416p:plain

短剣(小)を装備した時は攻撃値が10上がりました。

f:id:kazuhironagai77:20200802221439p:plain

短剣(大)を装備した時は攻撃値が15上がりました。

これでこの週のブログの内容は一応終わりました。

2.まとめと感想

今週はここまでとします。流石に一回やった物かつブログに詳細な手順が書かれていると簡単に再現出来ます。ひょっとすると来週には終わるかもしれません。