Что такое конвейерная сборка в XNA 4? - PullRequest
3 голосов
/ 29 января 2012

Я пытаюсь создать демо-версию TiledLib от Ника Грейвелина .Я скачал ZIP из BitBucket и открыл его в Visual Studio 2010. Когда я пытаюсь собрать, я получаю следующую ошибку:

Error XNA 4

По сути, этоошибка для каждого из трех проектов:

Ошибка 1 Ошибка загрузки конвейерной сборки "C: \ Users \ Moshe \ Downloads \ TiledLib_GS4 \ TiledLib GS4 \ References \ ContentPipeline \ TiledPipelineExtensions.dll".Демо [Windows]

Я новичок в .NET, поэтому я уверен, что мне не хватает некоторых базовых понятий.Где может быть ссылка на эту зависимость, и почему сборка не загружается?Файл существует по указанному пути.

Что такое конвейерная сборка в XNA 4 и почему Visual Studio не может его загрузить?

1 Ответ

6 голосов
/ 29 февраля 2012

Обновление: в свой контент-проект добавьте ссылку на: TiledLib_GS4 \ TiledLib GS4 \ References \ ContentPipeline \ TiledPipelineExtensions.dll

Настройка конвейера контента - это сложная тема для разработки игр, но это совсем не сложно (конечно, в зависимости от того, что и как вы обрабатываете контент).

Content Pipeline - это последовательность шагов, которые выполняются для включения контента в вашу игру. Например, звуковой файл волны обрабатывается через конвейер содержимого, поэтому вы можете использовать его в своей игре в качестве объекта SoundEffect. То же самое относится к изображениям, которые включены в вашу игру в качестве текстур (Texture2D или Texture3D).

Когда вы загружаете контент, скажем, 2D-текстуру, в вашей игре XNA с помощью Content.Load вы вызываете импортер контента и процессор, которые уже определены в рамках XNA, а именно Microsoft.Xna.Framework.Content.Pipeline. Processors.TextureProcessor и Microsoft.Xna.Framework.Content.Pipeline.TextureImporter. Существуют также похожие классы для типов контента FBX, Video, Audio.

Сборка конвейера - это всего лишь сборка, которая позволяет импортировать содержимое определенного типа. Прежде чем мы углубимся в детали, обратите внимание, что весь ваш контент находится в специальном контент-проекте, и этот проект ссылается на сборки, которые содержат набор готовых импортеров, которые происходят от базового обработчика контента и класса импортера. Эти классы позволяют типу проекта Content заполнять список импортеров, которые можно использовать для определенного типа и которые можно изменить с помощью окна свойств. Проверьте снимки экрана ниже.

Content import options in properties window

Content import references in a content project

Как я привел пример выше, есть предопределенные импортеры контента XNA. XNA также позволяет расширять конвейер содержимого с помощью собственных реализаций импорта. Для этого XNA предоставляет вам два класса для расширения в проекте Content Pipeline Extension. Первый - это импортер контента, а другой - контент-процессор.

Content Importer - это класс, производный от Microsoft.Xna.Framework.Content.Pipeline.ContentImporter, который переопределяет метод с именем Import, которому передается строковое имя файла и объект контекста импорта, и возвращает некоторый тип объекта (универсальный тип T ) для использования в вашей игре: Texture2D, строка или ваш собственный сложный тип. Сначала вызывается при загрузке контента.

Content Processor - это класс, который предоставляет метод преобразования контента или преобразования одного типа контента в другой. В 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!!!!";
        }
    }
}

Я еще раз упоминаю, что на ваше расширение для импорта контента должна ссылаться ваш контент-проект. Проверьте снимок моего обозревателя решений ниже.

Content project references content pipeline extension

Кроме того, импортер контента теперь может выбирать обработку ваших ресурсов. Импортер и процессор актива выбираются автоматически в соответствии с его расширением.

Content import options extended in properties window.

Это отличный инструмент, если вы хотите, чтобы другие люди не программно сотрудничали с вами в вашей игре. Например, вы хотите, чтобы дизайнеры уровней создавали XML-файлы или текстовые файлы, которые описывают ваши уровни. Теперь вы позволяете им это делать, а затем создаете импортеры контента, которые импортируют эти файлы и помещают их в игровые объекты, которые вы используете в своей игре, как если бы вы изначально создавали их программно.

Теперь, откуда возникла ошибка, которую вы видите? В вашем Content Project есть контент, свойства Content Importer и Content Processor которого настроены на те, которые существуют в некоторой сборке, на которую нет ссылок, но на которую параметры некоторых ресурсов указывают как на импортер контента. Расширение конвейера содержимого существует в виде DLL в загруженном ZIP-файле, путь к нему см. В первом утверждении публикации.

Ух ты, получается довольно пост! Должен использовать это в моем блоге! : D

...