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

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

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам