我一直在研究基于组件的系统的概念。想象一下,我把它们做成这样:
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;
同样,装箱只适用于值类型。不管怎样,相信我,对于你作为初学者编写的任何小程序来说,性能损失都是可以忽略不计的。
这些不是完整的例子,但我希望能给你一些提示。