UnityのMonoBehaviourエラーを解決する方法:MVPモデルの実践的アプローチ
1. 今回のエラーとその解決
エラー内容
UnityのMVP(Model-View-Presenter)パターンを用いて敵キャラ管理のコードを書いていた際、MonoBehaviourを自作クラスで使用しようとしたところ、次のエラーが発生しました。
(出力エラーの一部)
You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all UnityEngine.MonoBehaviour:.ctor () …
このエラーメッセージは、MonoBehaviourをnewキーワードでインスタンス化することができないというもので、AddComponentメソッドを使ってゲームオブジェクトに追加する必要があることを示しています。
解決策
Viewクラス側の修正
AddComponentメソッドを使用することで、Unityのライフサイクルに準じたオブジェクトの管理やシリアライズが可能となりました。
(Viewスクリプト_変更前)
_presenter = new EnemyDataPresenter(model, this);
(Viewスクリプト_変更後)
_presenter = gameObject.AddComponent<EnemyDataPresenter>();
_presenter.Initialize(model, this);
Presenterクラス側の修正
初期化処理をコンストラクタからInitializeメソッドに移行し、依存関係を注入する設計に変更した。
(Presenterスクリプト_変更前)
public Presenter ()
{
初期化処理
}
(Presenterスクリプト_変更後)
public void InitPresenter ()
{
初期化処理
}
2. 初期化の目的
初期化メソッドを用いる理由は、以下の3つに要約できます。
依存関係の設定
Initializeメソッドを使用して、オブジェクトが必要とする依存関係(モデルやビュー)を適切に設定することで、オブジェクトが正常に機能します。状態の初期設定
変数の初期化や必要なリソースの読み込みなど、オブジェクトの初期状態を正しく設定します。一貫性の確保
初期化メソッドを使うことで、オブジェクトの状態が常に一貫した状態になるようにします。これにより、予期しない動作を防ぐことができます。
3. なぜ初期化が必要か
依存関係の注入
コンストラクタやInitializeメソッドを用いることで、必要なデータや外部リソースを柔軟に渡すことができ、オブジェクトのテストがしやすくなります。遅延初期化
リソースやデータの初期化が必要なタイミングで行えるように、Initializeメソッドを利用して、遅延初期化を実現します。コードの可読性と保守性の向上
初期化関連の処理をInitializeメソッドに集約することで、コードがより読みやすく、また保守もしやすくなります。
4. 専門用語の解説
MonoBehaviour
Unityのすべてのスクリプトが継承する基本的なクラス。オブジェクトのライフサイクルやイベントを管理する。AddComponentメソッド
Unityのゲームオブジェクトにコンポーネント(スクリプトや他の機能)を追加するためのメソッド。Initializeメソッド
オブジェクトの初期化を行うメソッド。特に、依存関係の設定やリソースの読み込みなどに使用される。依存関係注入
オブジェクトが必要とする他のオブジェクトやデータを外部から渡すデザインパターン。