更新:在您的内容项目中添加引用:TiledLib_GS4\TiledLib GS4\References\ContentPipeline\TiledPipelineExtensions.dll
自定义内容管道是一项高级游戏开发主题,但它并不难(当然取决于您处理内容的方式和内容本身)。
内容管道是将内容包含到游戏中所执行的一系列步骤。例如,波形声音文件会通过内容管道进行处理,以便您可以将其作为SoundEffect对象在游戏中使用。同样适用于作为纹理(Texture2D或Texture3D)包含在游戏中的图像。
当您使用Content.Load在XNA游戏中加载内容,比如说一个2D纹理时,您正在调用已经在XNA框架中定义的内容导入器和处理器,即Microsoft.Xna.Framework.Content.Pipeline.Processors.TextureProcessor和Microsoft.Xna.Framework.Content.Pipeline.TextureImporter。FBX、视频、音频等类型的内容也有类似的类。
管道程序集就是这样:一个允许您导入某种类型内容的程序集。在我们深入了解之前,请注意,所有您的内容都在一个特殊的内容项目中,并且此项目引用了包含大量基于基础内容处理器和导入器类派生的预设导入器的程序集。这些类允许内容项目类型填充您可以用于某种类型的导入器列表,并且您可以使用属性窗口更改这些列表。请参阅下面的屏幕截图。
![属性窗口中的内容导入选项](https://istack.dev59.com/pMJ2j.webp)
![内容项目中的内容导入引用](https://istack.dev59.com/68YC5.webp)
如上所述,XNA有预定义的内容导入器。XNA还允许您使用自己的导入实现扩展内容管道。为此,XNA为您提供了两个类,在内容管道扩展项目中进行扩展。第一个是内容导入器,另一个是内容处理器。
内容导入器是一个从Microsoft.Xna.Framework.Content.Pipeline.ContentImporter派生的类,覆盖了一个名为Import的方法,该方法传递了一个字符串文件名和一个导入上下文对象,并返回一些类型的对象(通用类型T),以在游戏中使用:Texture2D、字符串或您自己复杂的类型。这是在加载内容时首先调用的。
内容处理器是一个提供将内容转换或将一种类型的内容转换为另一种类型的方法的类。在XNA中,它是Microsoft.Xna.Framework.Content.Pipeline.ContentProcessor的子类,覆盖了一个名为Process的方法,该方法接受一个TInput对象和一个导入上下文对象,并返回TOutput。在导入内容后第二次调用。如果您以某种单一方式导入单一类型的内容,但是有许多选项可以进一步处理它,则这非常有用。
要看到这个实际效果,只需要添加一个内容管道扩展项目,并向其中添加内容处理器和内容导入器类。通过添加新项来完成此操作,这两种类型的类都有项目模板,因此您可以轻松地创建一个基本的无实现管道。但是,在使用之前,您需要让您的内容项目引用此内容管道扩展项目。一旦添加了此引用,您的自定义内容管道将出现在资产属性窗口中出现的内容处理器/导入器列表中。对于其扩展名与您的内容导入器类中的ContentImporterAttribute定义的扩展名匹配的资产,将自动选择您的导入器/处理器。
using TImport = System.String;
namespace ContentPipelineExtension1
{
[ContentImporter(".abc", DisplayName = "ABC Importer", DefaultProcessor = "AbcProcessor")]
public class ContentImporter1 : ContentImporter<TImport>
{
public override TImport Import(string filename, ContentImporterContext context)
{
return "This the simplest importer ever that doesn't even take into account the file being imported.";
}
}
}
using TInput = System.String;
using TOutput = System.String;
namespace ContentPipelineExtension1
{
[ContentProcessor(DisplayName = "ContentPipelineExtension1.ContentProcessor1")]
public class ContentProcessor1 : Microsoft.Xna.Framework.Content.Pipeline.ContentProcessor<TInput, TOutput>
{
public override TOutput Process(TInput input, ContentProcessorContext context)
{
return input + "processed!!!!";
}
}
}
我再次提醒您,您的内容导入扩展必须被您的内容项目所引用。请查看下面我解决方案资源管理器的快照。
此外,现在已经可以选择使用内容导入器来处理您的资产。资产的导入器和处理器是根据其扩展名自动选择的。
如果您想让其他人以非编程方式与您协作创建游戏,那么这是一个很好的工具。例如,您希望关卡设计师创建描述关卡的 XML 文件或文本文件。现在您可以让他们这样做,然后创建内容导入器将这些文件导入并将它们放置到游戏对象中,就好像您在一开始就是以编程方式创建它们一样。
那么,您看到的错误信息是从哪里来的呢?您的内容项目中存在内容,其内容导入器和内容处理器属性设置为某个未被引用的程序集中的设置,但某些资产的设置指向该程序集作为内容导入器。内容管道扩展作为 DLL 存在于您下载的 ZIP 文件中,请参见本帖子第一句话中给出的路径。
哇,结果是一篇相当长的帖子!我得在我的博客中使用它!:D