1

我认为最好通过代码来制定问题。我有一个基类。

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")

现在我只是在 Aracher 里面做这个。

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

但也许 Zenject 中有一些东西可以解决这个问题。

4

1 回答 1

0

像这样使用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>();
    }
}

但这不是必需的,这就是为什么我倾向于使用第一种方法

于 2018-04-11T11:58:33.527 回答