因此,我正在尝试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*/);
}
}
我刚刚找到了针对此特定情况的最简单的解决方法:
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*/);
}
}
这是有效的,因为实例化和销毁是“游戏对象”继承的“对象”的静态方法。
但是,如果一个人真的必须继承单行为,这不能解决问题