团结-依靠依赖注入和单方面行为进行斗争

问题描述 投票:0回答:1

因此,我正在尝试DI,并试图创建GameObject Generator。GameObject Generator会根据一些内部逻辑在场景内生成GameObject。

生成各种类型的GameObject有所不同,并且逻辑可以变化。

我以为我可以创建一个接口并能够根据“唯一逻辑”创建一个类(即,对于每种生成器行为,我都创建了一个类,并且可以在生成许多小对象和几个大对象之间进行切换,而不必使用if语句,而是使用多态的功能。

所以我有类似的东西

GameObjectGenerator : Monobehaviour
IGeneratorType

SmallGenerator : Monobehaviour, IGeneratorType
BigGenerator : Monobehaviour, IGeneratorType

从逻辑角度看,这似乎是有道理的。

问题从这些生成器过渡时出现。我想要某种条件,从IGeneratorType调用方法“ TransitionGenerator”返回一个新的IGeneratorType。从逻辑上讲,它也在工作。

但是,我想跟踪生成的对象(例如,在列表中),因为以后需要销毁它们。过渡时,需要将生成的对象列表传递给新的IGeneratorType。这是我发现自己挣扎的地方。

从IGeneratorType实现的类也需要扩展Monobehaviour,因为我需要调用实例化和销毁。

但是由于它们是从Monobehaviour扩展的,所以我似乎无法创建构造函数。

经过一些研究,我发现很多人都指向Awake / Start或创建Init方法。

问题是,在Awake / Start中我无法传递任何内容,而在Init中,我也需要将其放入接口中,从设计的角度来看,这在我看来并没有太多意义。

示例代码:

public class GameObjectGenerator : Monobehaviour{
    private IGeneratorType generator;
    public void Start(){
        generator = new SmallGenerator();
    }

    public void Update(){
        generator.Generate();
        if(somecondition){
            generator = generator.Transition();
        }
    }
}

public interface IGeneratorType{
    void Generate();
    IGeneratorType Transition();
}

public class SmallGenerator : Monobehaviour, IGeneratorType{
    private List<GameObject> generatedObjects;
    public SmallGenerator(/*List<GameObject> previousObjects*/){
        //generatedObjects = previousObjects;
    }

    public void Generate(){
        //...
        if(somespecificcond){
            generatedObjects.Add(Instantiate(...));
        }
        if(somecondition){
            Destroy(generatedObjects[0])
        }
    }

    public IGeneratorType Transition(){
        return new BigGenerator(/*generatedObjects*/);
    }
}


public class BigGenerator : Monobehaviour, IGeneratorType{
    private List<GameObject> generatedObjects;
    public BigGenerator(/*List<GameObject> previousObjects*/){
        //generatedObjects = previousObjects;
    }

    public void Generate(){
        //...
        if(somespecificothercond){
            generatedObjects.Add(Instantiate(...));
        }
        if(somecondition){
            Destroy(generatedObjects[0])
        }
    }

    public IGeneratorType Transition(){
        return new SmallGenerator(/*generatedObjects*/);
    }
}
c# unity3d dependency-injection
1个回答
0
投票

我刚刚找到了针对此特定情况的最简单的解决方法:

public class BigGenerator : IGeneratorType{
    private List<GameObject> generatedObjects;
    public BigGenerator(/*List<GameObject> previousObjects*/){
        //generatedObjects = previousObjects;
    }

    public void Generate(){
        //...
        if(somespecificothercond){
            generatedObjects.Add(Object.Instantiate(...));
        }
        if(somecondition){
            Object.Destroy(generatedObjects[0])
        }
    }

    public IGeneratorType Transition(){
        return new SmallGenerator(/*generatedObjects*/);
    }
}

这是有效的,因为实例化和销毁是“游戏对象”继承的“对象”的静态方法。

但是,如果一个人真的必须继承单行为,这不能解决问题

© www.soinside.com 2019 - 2024. All rights reserved.