【Unity】동적 생성되는 GameObject에 Inject하는 방법

2985 단어 ZenjectUnity

개요



느슨하게 결합된 클래스 설계로 개발할 때 매우 편리한 Zenject/Extenject입니다만,
취급의 어려움 때문에, 약간의 일로 빠져 버립니다.

이번에는 동적으로 생성된 GameObject가 Inject되지 않는 문제와 그 해결책을 설명하겠습니다.

Prefab 동적 생성



다음과 같은 Prefab이 있습니다 (이하 "플레이어 Prefab"이라고 표기).


플레이어 Prefab에는 Player.cs가 연결되어 있습니다.

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

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

그리고 Scene 내에는 위치 정보만의 PlayerSpawner 객체가 있으며, PlayerSpawner.cs가 첨부되어 있습니다.


플레이어 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입니다.


DI Container를 직접 사용하고 InstantiatePrefab을 수행하여 해결할 수 있지만 코드를 낭비하지 않고도 ZenAutoInjector를 사용하는 것이 좋습니다.

좋은 웹페이지 즐겨찾기