组件系统的总体思路。铸造太多?像结构一样的联盟?其他方法?

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 类型。不管怎样,相信我,对于您作为初学者正在编写的任何小程序,性能影响都可以忽略不计。

这些不是完整的例子,但希望能给你一些指点。