質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Unreal Engine

Unreal Engineは、Epic Games社によって開発されたゲームエンジンです。高レベルの移植性を持っており、様々なプラットフォームのゲーム開発が可能。GitHubアカウントを登録すれば無料でダウンロードできます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

意見交換

クローズ

1回答

772閲覧

[UE4/5]ゲームインスタンスの肥大化・密結合を解決したい

torano

総合スコア92

Unreal Engine

Unreal Engineは、Epic Games社によって開発されたゲームエンジンです。高レベルの移植性を持っており、様々なプラットフォームのゲーム開発が可能。GitHubアカウントを登録すれば無料でダウンロードできます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2023/09/21 12:51

編集2023/09/21 12:56

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

自作ゲームインスタンスの主な機能

  • データテーブルの管理

ゲームスタート初期化時にデータテーブルを読み込み、保持させています。
データはゲーム中にも何度も使うものなので、ゲームの
そんなに大容量のデータではないですが、ゲーム中にも何度も使うものなので、ゲーム終了時まで保持できるゲームインスタンスに管理させています。

  • ゲーム情報のセーブ/ロード

標準のゲーム設定、カスタムゲーム設定、セーブデータなどの管理です。
ロードしたデータは複数のレベルで使われるので、ゲームインスタンスに管理させています。

  • ゲーム内の状態管理

ゲームスコアのような、ゲームプレイして変化した状態はレベルをまたいで使用するのでゲームインスタンスに管理させています。
同時に、さまざまな種類のスコアから算出される評価の計算処理などもゲームインスタンスで行っています。

  • 複数のレベルにまたがるゲームフェーズの管理

複数のレベルにまたがるゲームフェーズの管理なので、ゲームモードではなくゲームインスタンスで管理しています。

  • カスタムコントローラーの管理

エンジンの標準機能では扱えないカスタムコントローラーを扱っているのですが、このコントローラーからシリアル通信でデータを読み取り、エンジン上で使えるデータに変換する専用のプラグインを自作しました。
マニュアルでシリアルポートの開閉やコントローラーの接続処理などを行わないといけないので、ゲームの初期化、シャットダウン時にゲームインスタンスにやらせています。

  • フェイドイン・アウトの処理

レベル遷移するときにフェイドイン・アウトする機能があるのですが、フェイドイン・アウト用のウィジェットをゲームインスタンスに持たせています。
現在はフェイド中なのか、フェイドイン後なのか、フェイドイン後なのか、などの情報をレベルをまたいで保持したかったのでゲームインスタンスに管理させています。

  • レベルのロードやストリーミングの処理

ロードすべきパーシスタントレベルやサブレベルは、ユーザーがゲーム中に選択した情報、保存していたゲーム情報、ゲームフェーズなどによって決まるため、ゲームインスタンスに機能をもたせています。

  • キャプチャ機能

スクリーンショットのようなゲーム内キャプチャ機能があるのですが、キャプチャした画像などは複数のレベルで使用する必要があるため、キャプチャ機能やキャプチャ情報の管理はゲームインスタンスが行っています。

  • 印刷機能

ゲーム内印刷機能があり、ロードしたゲーム情報などを使うのでゲームインスタンスが行っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答1

#1

torano

総合スコア92

投稿2023/09/25 03:48

複数のGameInstanceSubsystemに分割することにしました。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問