インターンでUnrealEngine5を学びました

こんにちは、この度5日間のインターンを体験させていただいた横田と申します。
拙い文章ではありますが、どのような事を行ったのかブログとして書き留めようと思います、よろしくお願いします。

 

1日目

まずは社員の方からオフィスの建物のデータを受け取りUnrealEngine5上に配置するという作業をしました。
インポート自体難しい物ではなく、またFBX形式でマテリアルや位置関係もそのまま残っていたためドラッグアンドドロップですぐに作業を終えることが出来ました。

次に家具のデータを受け取りオフィスと同じように家具を配置する作業に入りました。この時、自社のサービスであるメタバースプラットフォームのシェルパワールドにも同じオフィスが再現されていたためそれを見ながらUE5で忠実に再現しました。
この時渡されたデータはマテリアルの適用がされてなかったためテクスチャを使用したマテリアルの作成も行いました。

仕切りのマテリアルの作成中にテクスチャが思っていたよりも大きいことに気づきサイズを小さくした方が良いという場面に出会いました、なのでマテリアル関数を使いTexCoordのUVtilingを行うことで上下左右に画像をループさせ結果的に縮小したように見せかけることが出来ました。まぁテクスチャの端同士がくっついても違和感のないテクスチャでなければできない方法ですが…

エンジニアの方々がいる部屋とモデリングなど3DCG作成をしている方々がいる部屋と多目的室の計3部屋の家具の配置が終わりライティングの作業に移ることにしました。
しかしUE5から実装されたLumenというグローバルイルミネーション機能が想定より重く、自身のライティングの知識技量不足も合わさってエディタ上で10~20fps程度しか出ない状態になってしまいました。
なのでこの日はライティングの作業までで終わることになりました。

2日目

2日目は前日にできなかったライティングの作業を行います。
しかしこのままではPCが重すぎるのでグラフィックボードをGeForce GTX980からGTX1080へと換装していただきました。
自分が昔使っていたPCの構成とほぼ一緒だなと個人的な思いで感慨にふけりながら軽くなったUnrealEngine5を手にライティングの作業に入りました。

当初は蛍光灯と同じ光り方がするだろうとレクトライトを使用していましたが出来上がったビジュアルがあまり良くなかったのでポイントライトに変更しました。パフォーマンスもポイントライトの方が良いらしいと小耳にはさんだのもライトを変更した理由のうちの一つです。

次にライトのオンオフ機能を実装しました。
作って欲しいと言われた仕様が部屋の中に入った状態で画面上のボタンを押したらその部屋の電気をオンオフできる機能とだったので最初は3部屋分のライト点灯ボタンを作成しそのボタンごとに部屋の割り当てをしようかと思いましたが全然スマートじゃないので止めました。
ではどうしたのかというとそれぞれの部屋にプレイヤーが入ったかどうかを判定するコリジョンを置いておきレベルブループリントからその衝突情報を取得しボタンのルーム割り当てを動的に行う処理を行うことで一つのボタンでオンオフ機能を実装することが出来ました。
また蛍光灯のマテリアルにエミッシブが掛かっており電気を消した際にも自己発光していたのでライトを消す際に同時にマテリアルを変更する事で対応しました。

動画が載せられないので伝えづらいですがアニメーションを付ける事で視覚的に分かりやすいUIになるよう工夫しました。
またドアの自動開閉も実装しました。
ドアの周りに判定を置きそこに触れているかどうかで動かすだけの簡単な仕組みです。
2日目はここまでで終わりました。

3日目

3日目は主に家具のオンオフ機能を作りました。
部屋を見渡すときに家具が置かれてある状態とない状態を見られるような機能を作るため家具を大まかに分類し指定したものだけ消すという機能を作りました。
しかし見た目があまり面白くなかったのでCinema4Dのような判定を動かしその判定内に入ったオブジェクトが自動的に視覚の範囲外まで上昇するといった機能を作りました。個人的に一番力を入れて気に入っている部分です。

次にオブジェクトのコリジョンを調整しました。
現状だと見えない壁に阻まれる部分が多々あるので一つ一つ問題のあるコリジョンを直そうと思いました。
しかし現状だとどの壁の判定に拒まれているのか分からないため表示オプションからプレイヤーコリジョンを表示することでどのアクタのコリジョンが原因なのかが分かりやすくなりました。
この機能をそれまで知らなかったためドアのコリジョンと謎のコリジョンに阻まれてわけのわからないまま身動きが取れないこともありました。動いてないのに狭いよ~。
これを解消するためにスタティックメッシュのコリジョンを消し作業量が多かったのでオートコンベックスコリジョンで大まかな衝突判定をとることにしました。

謎の透明な壁の原因
自動で大まかな衝突判定を付けた後

3日目はこれで終わりました。

4日目

自分が一番苦戦した1日でした。
この日は家具のレイアウトのセーブとロード機能を実装予定でした。
普段はプレイ内でGameInstanceを利用してデータの保存などをやっていましたがプレイ外でもデータを保存しておく必要があり
SaveGameを利用して外部にデータを残そうと思いました。
更にエディタ上からもセーブロードできるように初めてエディタユーティリティを使用してエンジンの拡張に挑戦しました。

右側が拡張した部分

エディタの拡張は上手くいき実装が出来たかと思いましたが読み込みをするときになぜか必ず何個かのオブジェクトの位置がずれるという現象が起こりました。
テストマップで少数のオブジェクトで試したり保存されてるデータが一致しているかどうかやデータの破損がないか、読み込む順番などが間違っていないかなどテストしましたが解けず1日中苦戦しました。

実装に時間が掛かると思ったので映像を流す機能を作成しました。
しかしここでもトラップがありUE5.0ではデフォルトのメディアプレイヤーでは再生することが出来ずElectraというプラグインを利用しなければなりませんでした。ここでかなり躓いたのと動画が保存されているMoviesフォルダのディレクトリに日本語が入っていたため正常に読み込むことが出来ず一旦ネットワークからストリーミングで映像を流して対処しました。
このあとディレクトリを変更しローカルの映像も読み込めるようになったのでどちらの映像も流せるようになりました。

4日目はこれで終わりました。

5日目

5日目は昨日のレイアウト変更機能のバグ修正を少し行いました。
この日は全体的なまとめの日になったため今までの成果を動画に起こしプレゼンテーション用のパワーポイントとこのブログを書く作業を主に行いました。

この5日間どのような事をやったのか振り返ることが出来ました。
新しいことに挑戦したり自分が強いこだわりがあった部分には時間を掛けたりなどとても楽しく学びになる時間になったと感じました。スケジュールの管理が元々苦手だったが最終日までには少しは改善したと思います。

この度は本当に貴重な経験をさせていただき本当にありがとうございました!

会社の方の雰囲気も柔らかく気さくに会話が出来るので興味のある方はインターンへ参加しては如何でしょうか?
まだまだ募集中だそうです(2022/11/18現在)https://sherpa-recruit.jp/index.html