6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Unity】動的生成されるGameObjectにInjectする方法

Posted at

概要

疎結合なクラス設計で開発する際に非常に便利なZenject/Extenjectですが、
扱いの難しさ故に、ちょっとしたことでハマってしまいます。

今回は、動的に生成されたGameObjectがInjectされない問題とその解決策を記載していきます。

Prefabを動的生成する

以下のようなPrefabがあります(以下「プレイヤーPrefab」と表記)。
ZenAuto01.png

プレイヤーPrefabにはPlayer.csがアタッチされています。

Player.cs
// ゲームステータスを管理するマネージャ
[Inject] GameManager manager;

void Start()
{
    // ゲームステータスがGOなら処理を行う
    if(manager.GetGameState == "GO"){
        // 好きな処理を書く
    }
}

そしてScene内には位置情報だけのPlayerSpawnerオブジェクトがあり、PlayerSpawner.csがアタッチされています。
ZenAuto02.png

プレイヤーPrefabはHierarchyには設置せず、PlayerSpawner.csによって動的生成される仕様とします。

PlayerSpawner.cs
[SerializeField] GameObject playerPrefab;

void Start()
{
    // プレイヤーPrefabを動的生成する
    Instantiate(playerPrefab, new Vector3(0, 0, 0), Quaternion.identity);
}

以上の条件で実行してみると、Player.csにNullReferenceExceptionのエラーが出ます。

エラーの原因はアタッチ先のプレイヤーPrefabが、PlayerSpawnerから動的生成されたことによりInjectされず、managerがnullになってしまうからですね。

解決策

とても簡単で、ZenAutoInjectorをプレイヤーPrefabにアタッチすればOKです。
ZenAuto03.png

DI Containerを直接使用し、InstantiatePrefabを行うことでも解決できますが、無駄にコードを増やさずに済むのでZenAutoInjectorを使用するのがおすすめです。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?