XNA 4中的管道装配是什么?

问题描述 投票:3回答:2

我正在尝试构建TiledLib by Nick Gravelyn的演示。我下载了the ZIP from BitBucket并在Visual Studio 2010中将其打开。尝试构建时,出现以下错误:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9FNzlBbS5wbmcifQ==” alt =“错误XNA 4”>

本质上,这是三个项目中的每一个的错误:

错误1加载管道程序集“ C:\ Users \ Moshe \ Downloads \ TiledLib_GS4 \ TiledLib GS4 \ References \ ContentPipeline \ TiledPipelineExtensions.dll错误”。演示[Windows]

。NET的新手,所以我确定我缺少一些基本概念。在哪里可以引用此依赖关系,为什么不加载程序集?该文件位于指定的路径。

XNA 4中的管道程序集是什么,为什么Visual Studio无法加载它?

visual-studio-2010 xna dependencies xna-4.0
2个回答
6
投票

更新:对您的内容项目,添加对以下内容的引用: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,视频,音频内容类型也有类似的类。

管道装配就是这样:作为允许您导入某种类型内容的装配。在深入了解之前,请注意,所有内容都在一个特殊的Content Project中,并且该项目引用的程序集包含一堆从基础Content处理器和importer类派生的即用型导入器。这些类使Content项目类型可以填充可用于特定类型的导入器列表,并可使用属性窗口对其进行更改。检查下面的屏幕截图。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9wTUoyai5wbmcifQ==” alt =“属性窗口中的内容导入选项”>“>

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS82OFlDNS5wbmcifQ==” alt =“内容项目中的内容导入引用”>

正如我上面给出的示例,有预定义的XNA内容导入器。 XNA还允许您使用自己的导入实现来扩展内容管道。为此,XNA为您提供了两个要在Content Pipeline Extension项目中扩展的类。第一个是内容导入器,另一个是内容处理器。

Content Importer是从Microsoft.Xna.Framework.Content.Pipeline.ContentImporter派生的类,它重写了称为Import的方法,该方法传递了字符串文件名和导入上下文对象,并返回某种类型的对象(通用类型T)在游戏中使用:Texture2D,字符串或您自己的复杂类型。加载内容时首先调用它。

内容处理器是提供用于转换内容或将一种类型的内容转换为另一种类型的方法的类。在XNA中,它是Microsoft.Xna.Framework.Content.Pipeline.ContentProcessor的子类,该子类重写名为Process的方法,该方法采用TInput对象和导入上下文对象并返回TOutput。内容导入后称为秒。如果您以某种单一方式导入单一类型的内容,但是对于如何进一步处理它有很多选择,这将很有用。

要查看实际效果,只需添加一个Content Pipeline Extension项目,并向其中添加一个Content Processor和Content Importer类。通过添加一个新项目来做到这一点,这两种类型的类都有项目模板,因此您可以轻松地建立一个基本的未实现管道。尽管如此,您仍需要您的Content Project来引用此Content Pipeline Extension项目,然后才能使用它。添加此引用后,自定义内容管道将作为选项显示在资产属性窗口中出现的内容处理器/进口商列表中。扩展名与ContentImporterAttribute中定义的扩展名相匹配的资产(自动修饰您的内容导入器类)会自动选择导入器/处理器。

//[using statements omitted for brevity]
// TODO: replace this with the type you want to import.
using TImport = System.String;

namespace ContentPipelineExtension1
{
    /// <summary>
    /// This class will be instantiated by the XNA Framework Content Pipeline
    /// to import a file from disk into the specified type, TImport.
    /// 
    /// This should be part of a Content Pipeline Extension Library project.
    /// 
    /// TODO: change the ContentImporter attribute to specify the correct file
    /// extension, display name, and default processor for this importer.
    /// </summary>
    [ContentImporter(".abc", DisplayName = "ABC Importer", DefaultProcessor = "AbcProcessor")]
    public class ContentImporter1 : ContentImporter<TImport>
    {
        //Microsoft.Xna.Framework.Content.Pipeline.ContentImporter<T>
        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.";
        }
    }
}

// TODO: replace these with the processor input and output types.
using TInput = System.String;
using TOutput = System.String;

namespace ContentPipelineExtension1
{
    /// <summary>
    /// This class will be instantiated by the XNA Framework Content Pipeline
    /// to apply custom processing to content data, converting an object of
    /// type TInput to TOutput. The input and output types may be the same if
    /// the processor wishes to alter data without changing its type.
    ///
    /// This should be part of a Content Pipeline Extension Library project.
    ///
    /// TODO: change the ContentProcessor attribute to specify the correct
    /// display name for this processor.
    /// </summary>
    [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!!!!";
        }
    }
}

我再次提到,您的内容导入程序扩展必须由您的内容项目引用。在下面查看我的解决方案资源管理器的快照。

“内容项目引用了内容管道扩展”

此外,现在还可以选择内容导入器来处理您的资产。根据资产的扩展名自动选择资产的进口商和处理器。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9qZHhhUU5wbmcifQ==” alt =“在属性窗口中扩展的内容导入选项。”>

如果您希望其他人在您的游戏中以非编程方式与您合作,这是一个很棒的工具。例如,您希望关卡设计人员创建描述您的关卡的XML文件或文本文件。现在,您让他们这样做,然后创建内容导入器,将这些文件导入并将其放入您在游戏中使用的游戏对象中,就像您首先以编程方式创建它们一样。

现在您看到的错误来自哪里? “内容项目”中的某些内容的“内容导入器”和“内容处理器”属性被设置为某些程序集中不存在的内容,但某些资产的设置将其指向该内容导入器。内容管道扩展在您下载的ZIP中以DLL的形式存在,有关路径,请参见文章的第一条声明。

哇,真是个帖子!必须在我的博客中使用它! :D

真的很棒,很好。我非常喜欢


0
投票

真的很棒,很好。我非常喜欢

© www.soinside.com 2019 - 2024. All rights reserved.