Связывание с Zenjection

Я думаю, что лучше сформулировать проблему с помощью кода. У меня есть BaseClass.

public abstract class BaseUnit {

    [System.Serializable]
    public class Settings
    {
    }
}

И некоторые производные классы, например.

public class Archer : BaseUnit {

    public ArcherSettings Settings;

    [System.Serializable]
    public class ArcherSettings : Settings
    {
           //CanWalk is a MonoBehaviour and WalkSettings is a Serrializable class
            public CanWalk.WalkSettings WalkSettings;
    }
}

Итак, как вы можете видеть, я хочу иметь несколько типов юнитов с соответствующими WalkSettings, которые будут установлены из ScriptableObject.

public class ScriptableLevelInstaller : ScriptableObjectInstaller<ScriptableLevelInstaller>
{


    public Archer.AracherSettings Aracher;
    public Knight.KnightSettings Knight;
    //Some more...
}

Таким образом, вопрос в том, как внедрить соответствующие настройки в соответствующие классы с помощью Zenject, любая помощь или разъяснение было бы очень полезно.

--- UPD ---

Я плохо выражаюсь с первого раза. Я хочу привязать CanWalk.WalkSetting к соответствующим настройкам. Так что я могу сделать

Container.Bind<CanWalk.WalkSettings>().FromInstance(Archer.WalkSettings);

Но это неправильно, потому что последняя привязка будет просто переопределять настройки ходьбы для каждого класса. Так что мне нужно что-то вроде

Container.Bind<CanWalk.WalkSettings>().FromInstance(Archer.WalkSettings).WhenInjectInto("CanWalk which is attached to an Archer")

Пока я просто делаю это внутри Арахера.

GetComponent<CanWalk>().Settings = _settings.WalkSettings;

Но, возможно, в Zenject есть что-то, чтобы решить эту проблему.

1 ответ

Просто используйте Container.BindInstance как это:

public class ScriptableLevelInstaller : ScriptableObjectInstaller<ScriptableLevelInstaller>
{
    public Archer.AracherSettings Aracher;
    public Knight.KnightSettings Knight;

    public override void InstallBindings()
    {
        Container.BindInstance(Aracher);
        Container.BindInstance(Knight);
    }
}

Если вы хотите, вы также можете указать класс, который должен получить к нему доступ следующим образом:

public class ScriptableLevelInstaller : ScriptableObjectInstaller<ScriptableLevelInstaller>
{
    public Archer.AracherSettings Aracher;
    public Knight.KnightSettings Knight;

    public override void InstallBindings()
    {
        Container.BindInstance(Aracher).WhenInjectedInto<Archer>();
        Container.BindInstance(Knight).WhenInjectedInto<Knight>();
    }
}

Но это не обязательно, поэтому я склонен использовать первый подход

Другие вопросы по тегам