Получение типа контента из ContentManager в XNA - PullRequest
0 голосов
/ 13 ноября 2011

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

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

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

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

Ответы [ 4 ]

1 голос
/ 16 декабря 2011

Возможно, немного поздно, но у меня возникла та же проблема.

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

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

 string Name = Path.GetFileNameWithoutExtension(context.OutputFilename);
 FileStream fs = File.Create(Path.GetDirectoryName(context.OutputFilename) + @"\" + Name + @".model");
 fs.Close();
1 голос
/ 14 ноября 2011

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

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

0 голосов
/ 29 ноября 2011

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

0 голосов
/ 14 ноября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...