Расширение конвейера содержимого Xna - загрузка другого содержимого в пользовательский процессор
В настоящее время я экспериментирую с расширениями Xna Content Pipeline. В рамках этого эксперимента я пытаюсь загрузить файл, содержащий еще один "элемент контента", который необходимо загрузить. Например:
public class CustomItem
{
public string Name;
public Texture2D Texture;
}
Теперь в моем обработчике контента я могу создать новый экземпляр CustomItem и инициализировать поле "Имя", поскольку это просто строка. Тем не менее, я не могу загрузить файл текстуры во время компиляции контента (ПРИМЕЧАНИЕ: текстура - это просто пример, в идеале я хотел бы иметь возможность загружать любой другой тип контента).
Я ищу что-то вроде:
// ... start class ...
public override CustomItem Process(SomeInputFormat input, ContentProcessorContext context)
{
return new CustomItem()
{
Name = input.ItemName,
Texture = context.LoadAsset<Texture2D>(input.ItemTexturePath) // I realise LoadAsset<T>() does not exist - it's an example of what would be ideal
};
}
// ... end class ...
Кто-нибудь знает, возможно ли это на самом деле, и если да, то как это сделать? Я бы предпочел не идти по пути поздней загрузки других элементов содержимого, если это возможно, или создания собственной пользовательской загрузки содержимого с использованием двоичных программ чтения и записи.
1 ответ
Вы не можете использовать Texture2D
в конвейере контента. Вы должны использовать Texture2DContent
, который является прокси-типом для первого. В свою очередь, у вас должен быть механизм в вашем типе, позволяющий члену быть Texture2DContent
во время создания контента, но Texture2D
во время выполнения. Эта статья дает вам три способа сделать это.
Ты можешь использовать ContentProcessorContext.BuildAndLoadAsset
чтобы получить ваш Texture2DContent
объект. Эти данные текстуры будут включены в ваш .xnb
файл для этого актива.
Если вам на самом деле не нужно использовать данные текстуры в конвейере, и, в частности, если вы собираетесь использовать одну и ту же текстуру для нескольких ресурсов, вы можете использовать ContentProcessorContext.BuildAsset
чтобы получить ExternalReference
на текстуру, которая встроена в свою .xnb
файл, внешний по отношению к вашему активу .xnb
файл (и ContentManager
будет обрабатывать загрузку для вас).