【问题标题】:General Idea Of Component System. Too much casting? Union like structs? other methods?组件系统的一般概念。选角过多?像结构一样的联合?其他方法?
【发布时间】:2021-12-09 21:20:26
【问题描述】:

我一直在研究基于组件的系统的想法。想象一下我把它们变成了这样:

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

【问题讨论】:

  • 可能是Dictionary&lt;Type, List&lt;object&gt;&gt;?然后public T GetComponent&lt;T&gt;() =&gt; _components[typeof(T)].OfType&lt;T&gt;()
  • 谢谢。明白了:D!

标签: c# data-structures components computer-science


【解决方案1】:

您似乎正在尝试实现自己的IoC 框架。那里有很多Dependency Injection 框架。甚至内置在 ASP.NET Core 中。

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

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;

另外,boxing 仅适用于 类型。不管怎样,相信我,对于您作为初学者现在正在编写的任何小程序来说,性能损失都可以忽略不计。

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

【讨论】:

  • 谢谢!是的,性能并不那么重要,但在练习中记住这一点仍然很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 2010-10-04
相关资源
最近更新 更多