facebook twitter hatena line email

Unity/DIフレームワーク/Extenject/非MonoBehavior

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

非MonoBehavior

MonoBehaviorではないが、MonoBehaviorのようなライフサイクルで、動かせるクラスをDIする方法。

参考:https://light11.hatenadiary.com/entry/2019/02/28/001135

サンプル

MonoBehaviourInstaller.cs

using Zenject;
using System;

public class MonoBehaviourInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        Container
            .Bind(
                typeof(MonoBehaviourLogic),
                typeof(IInitializable),
                typeof(ITickable),
                typeof(ILateTickable),
                typeof(IFixedTickable),
                typeof(IDisposable)
            )
            .To<MonoBehaviourLogic>()
            .AsTransient();
    }
}

MonoBehaviourMain.cs

using UnityEngine;
using Zenject;

public class MonoBehaviourMain : MonoBehaviour
{
    [Inject] MonoBehaviourLogic _logic;
}

MonoBehaviourLogic.cs

using UnityEngine;
using Zenject;
using System;

public class MonoBehaviourLogic : IInitializable, ITickable, ILateTickable, IFixedTickable, IDisposable
{
    public void Initialize()
    {
        Debug.Log("initialize.");
    }

    public void Tick()
    {
        Debug.Log("Tick.");
    }

    public void LateTick()
    {
        Debug.Log("LateTick.");
    }

    public void FixedTick()
    {
        Debug.Log("FixedTick.");
    }

    public void Dispose()
    {
        Debug.Log("dispose.");
    }
}

記述を簡単に

BindInterfacesAndSelfToを使うと、上記ライフサイクルが自動で、ついてくる。 以下は、上記と同じ、処理となる。

MonoBehaviourInstaller.cs

using Zenject;
using System;

public class MonoBehaviourInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        Container
            .BindInterfacesAndSelfTo<MonoBehaviourLogic>()
            .AsTransient();
    }
}