C# C使用泛型和
我正在尝试一个自定义实体系统框架来开发一个游戏。本质上,我试图用它来做的是拥有一个组件,以及可以从中派生出更多类的组件系统类。我真的不确定如何直接解释我要做的是什么,所以我将复制并粘贴我的代码在这里,然后尝试在最后制定一个特定的问题 组成部分C# C使用泛型和,c#,generics,C#,Generics,我正在尝试一个自定义实体系统框架来开发一个游戏。本质上,我试图用它来做的是拥有一个组件,以及可以从中派生出更多类的组件系统类。我真的不确定如何直接解释我要做的是什么,所以我将复制并粘贴我的代码在这里,然后尝试在最后制定一个特定的问题 组成部分 public class Component { public Entity entity; public Component() { } public Component(Entity e) { e.AddCompo
public class Component
{
public Entity entity;
public Component() { }
public Component(Entity e)
{ e.AddComponent(this); }
}
组件系统
public class ComponentSystem<T> where T : Component
{
protected List<T> components;
public void AddComponent(T com)
{
this.components.Add(com);
}
public void RemoveComponent(T com)
{
this.components.Remove(com);
}
public void Update(double timeDelta = 0.0f)
{
}
}
现在有多重要
public Main(string[] args)
{
TagSystem Tags = new TagSystem();
GroupSystem Groups = new GroupSystem();
Entity e = new Entity();
e.AddComponent(new TagComponent("UniqueID"));
e.AddComponent(new GroupComponent());
Tags.AddComponent(e.GetComponent<TagComponent>());
Groups.AddComponent(e.GetComponent<GroupComponent>());
}
我希望梅因看起来怎么样
public Main(string[] args)
{
TagSystem Tags = new TagSystem();
GroupSystem Groups = new GroupSystem();
Entity e = new Entity();
e.AddComponent(new TagComponent(Tags, "UniqueID"));
e.AddComponent(new GroupComponent(Groups));
// Or this?
Entity e = new Entity();
e.AddComponent(new TagComponent<TagSystem>(Tags, "UniqueID"));
e.AddComponent(new GroupComponent<GroupSystem>(Groups));
}
我想我要做的是让组件在生成时自动添加到组件系统中,但我真的不知道如何实现这一点。我尝试了以下方法,但两种方法都不起作用:
public void AddToSystem<T, U>(T sys) where T : ComponentSystem<U>
{ sys.AddComponent(this); }
public void AddToSystem<T>(T sys)
{ sys.AddComponent(this); } // fails because T has no method AddComponent
合理的设计可能是将组件系统转变为工厂 这样,每当查询组件以获取对象的实例时,它都会跟踪它提供的组件实例。您可以使用依赖项注入来初始化组件 有一些开销: 您需要注册工厂生成的对象,以便组件类型不会耦合到组件系统 如果所有组件都将具有相同的功能来实现,那么您需要为组件或基类定义一个接口,以便组件系统知道如何处理它们 您需要一种方法来告诉组件系统删除实例,否则组件系统占用的内存将永远增长
只是一些想法Hm,这可能是未来可行的解决方案,但我最终做了一些不同的事情。我找到了这个答案,这让我开发了一个静态的全局系统列表,它允许我在任何地方使用ComponentSystem,因为它是基类。