Связывание с 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>();
}
}
Но это не обязательно, поэтому я склонен использовать первый подход