0
0
実現したいこと
- ゲームインスタンスが肥大化してしまったので機能を分割したい
- ゲームインスタンスに対する依存を減らしたい
- 以上のことを実現するうえで、C++/ブループリントどちらでも可だが、ブループリントからもアクセスできるようにしたい
前提/発生している問題
制作中のゲームで使用しているゲームインスタンスが非常に肥大化していて、他のブループリントからの依存性も多くなってしまいました。
30近くのブループリントが自作ゲームインスタンスに依存していて、その中にはプレイヤークラスなど変更の多いクラスも含まれます。
また、ゲームインスタンス自体が多くの構造体やEnumに依存しています。構造上、構造体やEnumは他のブループリントに依存しませんが、構造体に少し手を加えただけでゲームインスタンスやその他ゲームインスタンスに依存するブループリントに影響がでてしまいます。
ゲームインスタンス自体も変更が多いので、他のブループリントに影響が出やすいです。このような状態を改善したいので、ゲームインスタンスの機能を他に分けたり、依存性を減らす具体的な方法を知りたいです。
※具体的なゲームインスタンスの機能は質問の最後に記載しています。いくつかゲームインスタンス外に移行できるものもありますが、複数のレベルで使用するデータや処理が多いです。
また、UnrealEngineではDependency Injectionやサービスロケーターなどがあまり一般的に使用されていないイメージなのですが、良い使用例やサンプルがあれば知りたいです。
C++/ブループリントどちらでも大丈夫ですが、主にブループリントを使っているため、ブループリントからアクセス可能な方法が望ましいです。一応、ゲームインスタンスやプレイヤーなどメインのオブジェクトはカスタムC++クラスの子としてブループリントを作成しています。
検討していること
- 複数のマネージャークラスに分割する
ゲームインスタンスが持つ複数の機能ごとにマネージャーブループリントを作って、処理やデータを分散させる方法です。
ゲームインスタンスの肥大化が防げるというメリットがある一方、マネージャー自体の管理は結局ゲームインスタンスで行う必要があります。というのは、レベル遷移しても保持すべきデータが多いためです。
また、マネージャーはアクターではなくUObjectベースでなければなりませんが、そうなるとGetActorOfClass関数などでは取得できないので結局ゲームインスタンス経由で取得することになってしまいます。
結局ゲームインスタンスへの依存は減らせないので悩ましいです。
- Game Singleton Class
非推奨みたいですのでとりえあず使用は考えていません。
https://forums.unrealengine.com/t/using-game-singleton-class/445430
補足情報(FW/ツールのバージョンなど)
UE5.1.1
Windows 11
自作ゲームインスタンスの主な機能
- データテーブルの管理
ゲームスタート初期化時にデータテーブルを読み込み、保持させています。
データはゲーム中にも何度も使うものなので、ゲームの
そんなに大容量のデータではないですが、ゲーム中にも何度も使うものなので、ゲーム終了時まで保持できるゲームインスタンスに管理させています。
- ゲーム情報のセーブ/ロード
標準のゲーム設定、カスタムゲーム設定、セーブデータなどの管理です。
ロードしたデータは複数のレベルで使われるので、ゲームインスタンスに管理させています。
- ゲーム内の状態管理
ゲームスコアのような、ゲームプレイして変化した状態はレベルをまたいで使用するのでゲームインスタンスに管理させています。
同時に、さまざまな種類のスコアから算出される評価の計算処理などもゲームインスタンスで行っています。
- 複数のレベルにまたがるゲームフェーズの管理
複数のレベルにまたがるゲームフェーズの管理なので、ゲームモードではなくゲームインスタンスで管理しています。
- カスタムコントローラーの管理
エンジンの標準機能では扱えないカスタムコントローラーを扱っているのですが、このコントローラーからシリアル通信でデータを読み取り、エンジン上で使えるデータに変換する専用のプラグインを自作しました。
マニュアルでシリアルポートの開閉やコントローラーの接続処理などを行わないといけないので、ゲームの初期化、シャットダウン時にゲームインスタンスにやらせています。
- フェイドイン・アウトの処理
レベル遷移するときにフェイドイン・アウトする機能があるのですが、フェイドイン・アウト用のウィジェットをゲームインスタンスに持たせています。
現在はフェイド中なのか、フェイドイン後なのか、フェイドイン後なのか、などの情報をレベルをまたいで保持したかったのでゲームインスタンスに管理させています。
- レベルのロードやストリーミングの処理
ロードすべきパーシスタントレベルやサブレベルは、ユーザーがゲーム中に選択した情報、保存していたゲーム情報、ゲームフェーズなどによって決まるため、ゲームインスタンスに機能をもたせています。
- キャプチャ機能
スクリーンショットのようなゲーム内キャプチャ機能があるのですが、キャプチャした画像などは複数のレベルで使用する必要があるため、キャプチャ機能やキャプチャ情報の管理はゲームインスタンスが行っています。
- 印刷機能
ゲーム内印刷機能があり、ロードしたゲーム情報などを使うのでゲームインスタンスが行っています。
回答1件
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。