组件系统总体思想.选角太多?类联合结构?其他方法吗?



我一直在研究基于组件的系统的概念。想象一下,我把它们做成这样:

public class CObject
{
public Component[] components;
public T GetComponent<T>(string name = string.empty)
{
foreach(var c in components) if(c is T) if(name != string.empty || c.name == name) return c as T;
}
}

,然后我们就可以从脚本中获得一个组件,像这样:

// ... some code
DragonComponent dragonComponent = dragonObject.GetComponent<DragonComponent>();
// some code ...

但是正如你所看到的,它将需要对每个调用进行装箱…我可以通过为之前的调用创建一个静态字典来提高效率,如果给出了类似的调用,我可以让它只使用字典。但是,它仍然非常混乱,效率也不高……

有一个类似并集的结构,我听说GetComponent可以这样实现:

public class CObject
{
private class CTypes {
public DragonComponent[] dragonComponents;
public CameraFocus[] cameraFocuses;
}
CTypes components;
public T GetComponent<T>()
{
switch(T)
{
case DragonComponent:    return components.dragonComponents[0];
case CameraFocus:        return components.cameraFocuses[0];
}
}
}

性能非常好,但是很难实现…我不知道如何自动化在类联合结构中创建新类型的过程。

最好的方法是什么?

谢谢:D

看起来您正在尝试实现自己的IoC框架。现在有很多依赖注入框架。甚至内置于ASP中。网络核心。

如果这对你来说太过分了,还有许多更简单的选择。首先,您可能会想到字典:

private static readonly Dictionary<Type, object> _components = new();
public T GetComponent<T>() => (T)_components[typeof(T)];

或者,使用一个静态泛型类来提高性能:

private class ComponentCache<T>
{
public static T Component { get; set; }
}
public T GetComponent<T>() => ComponentCache<T>.Component;
同样,装箱只适用于类型。不管怎样,相信我,对于你作为初学者编写的任何小程序来说,性能损失都是可以忽略不计的。

这些不是完整的例子,但我希望能给你一些提示。

相关内容

  • 没有找到相关文章

最新更新