HEXA BLOG

プログラム

HEXA BLOGプログラム2019.12.3

UnrealEngineでレベルロードをc++でコーディング

気づけばもう12月。12月は師走といいますが昔は師匠が走り回った月だったのでしょうか❓
11月の後半から急に冬らしくなってきて急いで👘衣替えしたコンドウです。

ところでゲーム開発と言えば今やゲームエンジンですよね❗
大手のデベロッパーなら自社で独自のゲームエンジンを開発していたりしますが、なかなかメンテナンスコスト、仕様変更、拡張など本来のゲーム開発以外の部分でコストがかかりますね。
ゲームエンジンはこの部分を用意しますので、ゲーム開発に専念して下さいというスタンスから流れてきている感じがしますね❗

ちょっと前置き長くなってしまいましたが、ゲームエンジンのひとつであるUnrealEngine(以下UE)でシームレスなレベル遷移をc++で作成してみようと思います。

UEではパーシスタントレベルという親レベルとその下にぶら下がるサブレベルから構成されており、
このサブレベルは動的なロード/アンロードを行える機構があります。
それがLoadStreamLevel関数とUnloadStreamLevel関数です。
ブループリントでこれらを解説しているサイトは沢山ありますが、c++での制御があまり見つかりませんでしたのでご紹介したいと思います。

LoadStreamLevel/UnloadStreamLevelはどちらも非同期型の関数ですぐに動作が完了しません。(アセット等のロードが入る為確かにそうですね)
その為、動作の完了を確認する必要があるのですが、一般的なUEの非同期ならデリゲートに登録してイベントを呼び出して、、、というお馴染みの処理がなぜかLoadStreamLevel/UnloadStreamLevelではちょっと違っています。

ではどうやって終了を検知するのかというと引数で渡す構造体に「文字列として」関数名を渡すのです。
これらの制御をActorから行うとこんな感じです。

LoadLevel/UnloadLevel関数は非同期関数で実行完了確認は、IsCompleted関数から取得します。完了結果をイベント通知等に変更した方が処理もすっきりします。
おまけでロードしてきたレベルの表示/非表示関数も用意しました。こちらもすぐには処理が完了しない場合があるので戻り値がtrue返ってくるまで呼び出す必要があります。
今回は書き方の理解の為、簡易なコーディングですが実際に組み込むのであれば複数レベルまとめて処理できる機構に変えて結果をイベント通知にするとブループリントでも扱いやすくなります。


レベルの動的ロードをネットで検索してみると他にもLoadLevelInstance関数など事前にサブレベルになっていないレベルのロードも行える関数などあり、興味深いです。(但し4.22の時点ではUnloadLevelInstance関数は公開されていませんが💦)

UEはゲーム開発に必要なほぼすべての機能が網羅されており日々進化しているとても素晴らしいゲームエンジンです。
まだ使われた事の無い方は是非この機会に体験してみてはいかがでしょうか❓

公式サイト(日本語): https://www.unrealengine.com/ja/feed

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE