【发布时间】:2011-07-16 13:37:46
【问题描述】:
在使用 XNA 完成基于 C# 的基于组件的游戏引擎之前,我认为这是最后一次重大的逻辑飞跃。我定义了我的实体类和抽象组件。我的问题出现在我的 EntityFactory 中。
当我想创建一个新实体时,我将一个 EntityType 枚举传递给工厂中的一个静态方法,然后它会通过一个 switch/case 语句来查找要放在一起的组件。问题是,我正在尝试创建一种方式,使组件可以与同一实体中的其他组件共享字段,而无需它们访问所有内容。例如,如果两个组件具有表示位置的 Vector2 字段,则它们应该都指向同一个 Vector2。
我可以通过初始化实体工厂中的所有字段并要求将它们传递到组件的构造函数中来做到这一点(并使用 ref 作为原语),但这将非常难以维护,因为任何时候我扩展或更改组件,我将不得不在工厂中使用该组件的每个地方重写代码。我很想避免这种解决方案,但如果我找不到更好的方法,我会忍受它。
我目前的解决方案是创建一个名为 Attribute 的包装类。它包含两个字段:
private AttributeType type;
private Object data;
属性类型是一个枚举,表示属性的用途。所以Position、Rotation、Texture等的枚举中有条目。
EntityFactory 创建一个空的属性列表,并将其传递给每个组件构造函数。 setField 方法将由组件的构造函数调用,而不是初始化字段。这里是 Attribute 类和 setField 方法。
public class Attribute
{
private AttributeType type;
private Object data;
public AttributeType Type
{
get { return this.type; }
}
public Object Data
{
get { return this.data; }
}
public Attribute(AttributeType type, Object data)
{
this.type = type;
this.data = data;
}
public static void setField<T>(List<Attribute> attributeList, AttributeType type, out T field, T defaultValue)
{
bool attributeFound = false;
field = defaultValue;
foreach (Attribute attribute in attributeList)
{
if (attribute.Type == type)
{
field = (T)attribute.Data;
attributeFound = true;
break;
}
}
if (!attributeFound)
{
attributeList.Add(new Attribute(type, field));
}
}
}
我的问题是当属性包含原始类型的数据时。我考虑在
的 Attribute 类中写一个方法public void getData<T>(out T field) { field = this.data; }
但是我似乎无法使用 ref 将数据传递给 Attribute 构造函数。我不能使 Attribute 通用,因为它不会进入列表。我只是想知道是否有一种方法可以处理值类型和引用类型数据,或者我在整个事情的某个地方犯了一个逻辑错误。
【问题讨论】: