Получение типа контента из ContentManager в XNA

#.net #xna #content-pipeline

#.net #xna #контент-конвейер

Вопрос:

Я создаю редактор контента для игры XNA, и у меня готовы программы для чтения контента и его авторов. В моем редакторе я буду перебирать все файлы в моей папке, чтобы отобразить список объектов в окне моего редактора. У меня все настроено, но я застрял с тем, что я буду делать после получения списка файлов моей папки содержимого.

Все файлы имеют расширение XNB, и единственный (не хакерский) способ прочитать их — это использовать программу чтения содержимого XNA. Но я хотел бы знать тип содержимого файлов (является ли это картой или шаблоном игрового объекта или чем-либо из множества других типов, которые я определил) заранее, не загружая их все по одному и не пытаясь загрузить каждый с каждым из возможных типов содержимого, это практически невозможно (или, скажем, худшая практика программирования за всю историю).

Как я могу получить что-то вроде этой функциональности:

ContentManager.ContentTypeOf(string assetPath); это возвращает тип, поэтому я могу заранее знать, что загружать (и не загружать) куда. Не будет хорошей идеей загружать все карты игры только для редактирования одного шаблона объекта. Должен быть практический способ различать типы файлов содержимого.

Ответ №1:

Вы можете получить доступ к xnb, чтобы получить имя программы чтения содержимого.

Вот вам файл спецификации формата xnb

Комментарии:

1. не существует ли предоставляемого API способа выполнить эту задачу? я не думаю, что спецификация формата xnb останется неизменной в течение многих лет и в разных версиях

2. возможно, но (1) вы также можете проверить версию и проверить, поддерживается ли она или нет… (2) xna studio меняется нечасто… (3) формат xnb четко определен, трудно поверить, что он скоро изменится… (4) Ваша игра будет зависеть от версии xna studio, поэтому ваш редактор контента тоже будет зависеть, в чем дело?

3. @Blau Я не уверен, что это сработает. Из памяти спецификации не описывают используемое сжатие (подробно), и поэтому встроенные в режим выпуска XNB-файлы не читаются.

4. мой игровой ДВИЖОК (это не игра, это движок, который я создаю) не будет зависеть от версии xna, по крайней мере, жестко запрограммированным способом, поэтому жесткое кодирование программы чтения контента не является хорошей идеей. я просто хотел узнать, существует ли встроенный механизм для определения типа контента БЕЗ загрузки.

Ответ №2:

Может быть, немного поздно, но у меня была та же проблема.

Я просто использовал свой собственный обработчик контента, добавив пустой файл в выходной каталог «[modelfilename].model». И перечислил в моем коде все файлы *.model, затем загрузил модель только по имени файла без расширения. Вы также могли бы легко поместить дополнительную информацию в этот файл, если это необходимо.

Код для пользовательского процессора контента:

  string Name = Path.GetFileNameWithoutExtension(context.OutputFilename);
 FileStream fs = File.Create(Path.GetDirectoryName(context.OutputFilename)   @""   Name   @".model");
 fs.Close();
  

Ответ №3:

Это довольно просто, просто загрузите его как type Object :

 Type type = content.Load<Object>("MyContent").GetType();
  

Единственным недостатком является то, что вам нужно загрузить весь ресурс, чтобы определить его тип.

Чтобы реализовать другую политику срока службы для контента, загружаемого таким образом, рассмотрите возможность использования отдельного ContentManager экземпляра или даже получения собственного класса из ContentManager и изучите защищенный ReadAsset метод.

Комментарии:

1. у меня будет много файлов, и загружать их все в память только для того, чтобы узнать, к какому типу они относятся, практически не является хорошим решением. я думаю, что буду использовать предопределенную структуру папок в моей папке содержимого и обрабатывать файлы XNB под ними как соответствующий тип содержимого. я не думаю, что это создаст проблему, пока люди используют редактор карт, который я создаю, который в любом случае будет «официальным способом» редактирования вещей 🙂

Ответ №4:

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