VContainerを触ってみた。その3,注入するInputの変更 (Unity初心者)

 前回まで

その1

その2



今回

よくあるPlayerの移動のInputの取得方法を分けてPlayerが参照するInputをDIコンテナ側で注入する際に注入するInputクラスを選ぶことでPlayerの移動方法を変える。


①InputHandlerインターフェイスを作成


public interface IInputHandler 
{
    Vector3 GetInputDirection();
}

このインターフェイスを継承してGetInputDirectionでそれぞれの入力の違いを出していく。


②IInputHandlerを継承したクラスを作成

//方向キーでの移動


public class InputFromArrow : IInputHandler
{
    public Vector3 GetInputDirection()
    {
        if (Input.GetKey(KeyCode.UpArrow))
            return Vector3.up;
        if (Input.GetKey(KeyCode.LeftArrow))
            return Vector3.left;
        if (Input.GetKey(KeyCode.DownArrow))
            return Vector3.down;
        if (Input.GetKey(KeyCode.RightArrow))
            return Vector3.right;
        return Vector3.zero;
    }
}

//WASDでの移動


public class InputFromWASD : IInputHandler
{
    public Vector3 GetInputDirection()
    {
        if (Input.GetKey(KeyCode.W))
            return Vector3.up;
        if (Input.GetKey(KeyCode.A))
            return Vector3.left;
        if (Input.GetKey(KeyCode.S))
            return Vector3.down;
        if (Input.GetKey(KeyCode.D))
            return Vector3.right;
        return Vector3.zero;
    }   
}


③Playerの作成

IInputHandlerをDIコンテナで注入してもらってそこからGetInputDirection()で方向を返してもらって移動する。


using UnityEngine;
using VContainer;

public class Player : MonoBehaviour
{
    [Inject] readonly IInputHandler inputHandler; //注入されるInputHandlerの参照

    void Update()
    {
        if (inputHandler == null) return; //nullなら処理しない
        var direction = inputHandler.GetInputDirection();
        transform.position += direction * Time.deltaTime;
    }
}

このPlayerをアタッチしたGameObject(キューブとかがいいね)をシーンに作成する。


④GameLifetimeScopeでPlayerクラスを登録して、そこに注入するIInputHandlerを継承したクラスを選択して注入する。


public class GameLifetimeScope : LifetimeScope
{
    [SerializeField] HelloScreen helloScreen;
    [SerializeField] Player player;
    protected override void Configure(IContainerBuilder builder)
    {
    	// +++++++++++++++++++++++++++ //
        
        //追記
        //使わない方はコメントアウト
        //ここでどのInputHandlerを使うか選ぶ
        // builder.Register<IInputHandler, InputFromArrow>(Lifetime.Singleton);
        builder.Register<IInputHandler, InputFromWASD>(Lifetime.Singleton);
        builder.RegisterComponent(player); //Playerの登録
    }
}

使わない方をコメントアウトしといてもいいし、どちらも書いていたら下のやつが最終的に反映された。

シーンにあるGameLifetimeScopeにPlayerをアタッチする。

これで再生するとGameLifetimeScopeで注入したIInputHandlerの移動方法で移動できるはず。



まとめ

PlayerとInputHandlerはお互いを知らなくていい実装ができた。

今回は移動に関して行なったが、色々と応用ができそう。

まだまだVContainerを使いこなすまでは行けてないが、これからも使いながら学習していこうと思う。

とりあえず今回はここまで!


コメント