VContainerは何のため?を流れを追って見ていく
ここでは一例を挙げて説明していく。
このPJではMVPを採用しているものとする。
例えば、ガチャで排出確率0.1%のものにバグがないか確認したい時があるとすると、本番と同じ設定で行おうとした場合、該当のものを引き当てるまで引き続けるという無駄な行動が増えてしまい、バグ検証どころではなくなってしまう。
そのため、本番とは違うインスタンス(ガチャで該当のものが必ず出るような設定)を作りデバッグをスムーズに進めたい。
この時ガチャの実装をModelで実装していたとする。
↓
すると、Prsenterでは状況(本番かさまざまなデバッグを行うための設定か)に応じてどのインスタンスを使用するか受け取りたい
↓
Modelにインターフェースを作り、本番とデバッグする設定の型を統一することでPresenterで呼び出す際に同じ型で呼び出すことができるようにする(入れ物を作って置ける状態)
↓
条件分岐で呼び出すインスタンスを変える
ここでPresenter内でインスタンスを呼び出したくなく(DI実装にするため)、Prsenterにインスタンスを引数として渡し、コンストラクタでインスタンスを読み込む形にしたい
↓
PresenterにはMonobihaviorがありコンストラクタが機能しない!!
そこで出てくるのがDIコンテナのVContainer
...という流れでVContainerが必要になってくるらしい。
下記、間違いもあるかもしれないがイメージがつきやすいようにコード記載
public interface IModel
{
int CalcNewVal(int currentVal);
PadlockStatus CalcNewStatus(List<int> currentVals);
}
public class ModelS: IModel
{
public int CalcNewVal(int currentVal)
{
if (currentVal == 9) return 0;
return currentVal + 1;
}
public PadlockStatus CalcNewStatus(List<int> currentVals)
{
if (currentVals[0] == 1 && currentVals[1] == 1 && currentVals[2] == 2 && currentVals[3] == 3) return PadlockStatus.Unlocked;
return PadlockStatus.Locked;
}
}
public class StubModelS : IModel
{
public int CalcNewVal(int currentVal)
{
if (currentVal == 9) return 0;
return currentVal + 1;
}
public PadlockStatus CalcNewStatus(List<int> currentVals)
{
if (currentVals[0] == 1 && currentVals[1] == 1 && currentVals[2] == 2 && currentVals[3] == 3) return PadlockStatus.Unlocked;
return PadlockStatus.Locked;
}
}
public enum PadlockStatus
{
Locked,
Unlocked
}
public class PresenterS : MonoBehaviour
{
private IModel model;
[SerializeField] private IView view;
//[SerializeField] private ViewS view;
//private ModelS model = new ModelS();
bool debugflag = true;
private readonly List<int> initialValue = new List<int>() { 0,0,0,0 };
private PresenterS(IModel model,IView view)
{
this.model = model;
this.view = view;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
恐らくここで用いられているインターフェイスの使い方は
ここで言う疎結合を目的としたインターフェイスであると思う。