Расширение конвейера содержимого Xna - загрузка другого содержимого в пользовательский процессор - PullRequest
4 голосов
/ 22 июля 2011

В настоящее время я экспериментирую с расширениями 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 Ответ

5 голосов
/ 22 июля 2011

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

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

Если вам на самом деле не нужно использовать данные текстуры в конвейере, и, в частности, если вы собираетесь использовать одну и ту же текстуру для нескольких ресурсов, вы можете использовать ContentProcessorContext.BuildAsset, чтобы получить ExternalReference для текстуры, который встроен в собственный файл .xnb, внешний по отношению к файлу .xnb вашего актива (и ContentManager будет обрабатывать загрузку за вас).

...