组件系统的总体思路。铸造太多?像结构一样的联盟?其他方法?
General Idea Of Component System. Too much casting? Union like structs? other methods?
我一直在研究基于组件的系统的想法。想象一下我把它们变成了这样:
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 framework. There are lots of Dependency Injection 框架。甚至内置于 ASP.NET 核心中。
如果这对您来说太过分了,不过对于您的情况还有许多更简单的选择。首先,你可能会想到字典:
private static readonly Dictionary<Type, object> _components = new();
public T GetComponent<T>() => (T)_components[typeof(T)];
或者,为了更高效,使用静态泛型 class:
private class ComponentCache<T>
{
public static T Component { get; set; }
}
public T GetComponent<T>() => ComponentCache<T>.Component;
此外,boxing 仅适用于 value 类型。不管怎样,相信我,对于您作为初学者正在编写的任何小程序,性能影响都可以忽略不计。
这些不是完整的例子,但希望能给你一些指点。
我一直在研究基于组件的系统的想法。想象一下我把它们变成了这样:
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 framework. There are lots of Dependency Injection 框架。甚至内置于 ASP.NET 核心中。
如果这对您来说太过分了,不过对于您的情况还有许多更简单的选择。首先,你可能会想到字典:
private static readonly Dictionary<Type, object> _components = new();
public T GetComponent<T>() => (T)_components[typeof(T)];
或者,为了更高效,使用静态泛型 class:
private class ComponentCache<T>
{
public static T Component { get; set; }
}
public T GetComponent<T>() => ComponentCache<T>.Component;
此外,boxing 仅适用于 value 类型。不管怎样,相信我,对于您作为初学者正在编写的任何小程序,性能影响都可以忽略不计。
这些不是完整的例子,但希望能给你一些指点。