UE4でのゲーム制作で気をつける事をまとめてみました。
あくまでも自分の経験と好みなので、必ずしもこの通りが良いというものではありません。
自分の忘備録的な意味合いもあるので、追々追記していきます。
フォルダ
フォルダの構成は良く考えて決めたいところですが、基本的にはアセットの種類と関連性で分類します。その辺はプロジェクトによりますが、個人的意見では
- BlueprintやBlueprint Classをあちこちにばらまかないで、なるべくフォルダにまとめる。
- ゲームに組み込むまでのテストはデベロッパーフォルダーで作業し、十分テストしてから正式なフォルダに移動。
デベロッパーフォルダはデフォルトでは表示されていないので、コンテンツブラウザの右下の「表示オプション」をクリックし、「デベロッパーフォルダを表示」にチェックを入れることで表示されます。
自分のユーザー名のフォルダがあるので、そこを使用します。
参照
参照について基本的な知識として
- ハード参照とソフト参照がある
- ハード参照されているアセットは参照元のアセットが読み込まれると自動的に読み込まれる
- ソフト参照されているアセットは使用前にプログラムやBlueprintから読み込む必要がある
レベルやGameInstanceなどからハード参照されているものは一緒に読み込まれてしまうので、なるべく不要なものはハード参照にしないようにしましょう。
ハード参照かソフト参照かは、アセットを右クリックして、「リファレンスビューアー」を選択すると確認できます。白い線でつながっているのがハード参照、マゼンタの線でつながっているのがソフト参照です。
注意が必要なのは、BlueprintからClassを参照しただけで、そのClassからハード参照されているアセットが全て読み込まれてしまいます。
具体的には、Blueprintが特定のClassの変数を持っている場合や、BlueprintでCastやGetAllActorsOfClassでClassに指定している場合です。
どうしてもGetAllActorsを使う場合は、TagやGamePlayTagで検索するようにして、Classでの検索を使わないようにしましょう。
参照に気をつけないと、エディタでプロジェクトを開くのにかかる時間がどんどん増大します。
マテリアルの階層
マテリアルはマテリアルに機能を実装して、そのマテリアルのインスタンスを作成して、インスタンスにパラメーターを設定するのが一般的です。後の機能変更などを考慮して、マテリアルを直接使わず、マテリアルインスタンスを使うようにしましょう。
詳しくは下記のリンクを見てください。
Unreal Engine Material Management Deep Dive
この時点のUE4と違い、現在のUE4ではマテリアルの共有部分が進化しているので、そこまでメモリに大きな影響は無くなりましたが、ポイントは
- ある程度共通の機能を持ったベースマテリアルを作る
- ベースマテリアルの機能をSwitchで切り替えた機能別のマテリアルインスタンスを作る
- 機能別のマテリアルインスタンスのインスタンスをつくり、パラメータなどを設定して使用する
という使い方が良いと思います。
Blueprint
Blueprintは便利ですが、落とし穴もたくさんあります。
Unreal Festでのバイキングさんの講演などを参考にしてください。
最初のうちはBlueprintでも良いのですが、プロジェクトが進むにつれて、メモリやパフォーマンス的に厳しくなってくることが多いです。
特にTick内など、毎フレーム実行される処理をBlueprintで書く場合は注意が必要です。
GetAllActors系など、重たい処理をTickに書かないように注意が必要です。
また、Blueprintの変数は全てUObjectを継承しているので、大量のBlueprintで大量の変数を使用すると、メモリの使用が増大し、ガベージコレクションの時間が増大するので、不用意に変数を増やさない方が良いです。
Load関連
ロード関連は闇が深いので、適宜加筆します。
注意点としては
レベルをロードする際には、レベル名だけを指定せずに、フルパスで名前を指定する。
パッケージされた状態でレベル名だけを指定すると、パッケージ内を頭から検索するのですが、同じレベル名が複数ある場合に、先に見つかったほうが読み込まれます。また、この検索に非常に時間がかかる場合があり、プラットフォームによっては数十秒かかることがあります。