我目前正在实现Level
内容类型,它应该代表游戏关卡的内容(最重要的是,参考单独存储的纹理)。输入级别数据包含源纹理资源的完整路径。
问题:如何确定可以写出到编译级别内容中的结果内容"名称"?纹理应该被重复使用,所以将它们烘焙到关卡内容中将是一个坏主意(浪费空间)。在内容创建过程中(例如在关卡编辑器中)无法提供名称。
举个例子:源文件Levels/Level01.level
使用其完整路径名引用Textures/Granite.png
和Textures/Dirt.png
。我想在编译时从这些数据推断出Textures/Granite
和Textures/Dirt
。
正确的解决方案是使用(文档不那么充分)ExternalReference<T>
类而不是纯字符串名称。
在编写器方面,关卡内容对象包含ExternalReference<TextureContent>
(甚至List<ExternalReference<TextureContent>>
)实例。当序列化(通过ContentWriter
)时,这负责正确调整引用。
读卡器方面简化为普通ContentReader.ReadObject<>
调用,例如
public sealed class LocationReader : ContentTypeReader<Location>
{
protected override Location Read(ContentReader input, Location existingInstance)
{
List<Texture2D> textures = input.ReadObject<List<Texture2D>>();
}
}
注意:注意正确覆盖编写器类中的GetRuntimeType()
方法;这对我来说是古怪ReflectionReader<T>
问题的根源。