VContainerを触ってみた。その3,注入するInputの変更 (Unity初心者)
前回まで
今回
よくある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を使いこなすまでは行けてないが、これからも使いながら学習していこうと思う。
とりあえず今回はここまで!
コメント
コメントを投稿