Загрузка текстур из ссылки на встроенный контент в XML-файле

Цель

Я пытаюсь загрузить настраиваемый класс, содержащий Texture2D , из файла xml с помощью импортера по умолчанию (XML Content ), без процессора.


Подход

Многочисленные онлайн-исследования и много работы с другими ошибками привели меня к этому XML:

<?xml version="1.0" encoding="utf-16"?>
<XnaContent xmlns:Components="Entities.Components">
  <Asset Type="EntitiesContentPipeline.EntityTemplateContent">
    <Name>entity name</Name>
    <TestTexture>
      <Reference>#External1</Reference>
    </TestTexture>
  </Asset>
  <ExternalReferences>
    <ExternalReference ID="#External1" TargetType="Microsoft.Xna.Framework.Graphics.Texture2D">C:\Documents and Settings\GDuckett\My Documents\Visual Studio 2010\Projects\Gravitron\Gravitron\Gravitron\bin\x86\Debug\Content\Bullet.xnb</ExternalReference>
  </ExternalReferences>
</XnaContent>

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

Ниже представлена ​​моя версия содержимого класса (используемого конвейером):

[ContentSerializerRuntimeType("Entities.Content.EntityTemplate, Entities")]
public class EntityTemplateContent
{
    public string Name;
    public ExternalReference<Texture2D> TestTexture;

    public EntityTemplateContent()
    {

    }
}

Ниже представлена ​​моя версия среды выполнения:

public class EntityTemplate
{
    public string Name;
    public Texture2D TestTexture;

    public EntityTemplate()
    {

    }
}

Проблема

Если я попробую выполнить var test = Content.Load ("BulletTemplate"); ниже я получаю ошибку:

Ошибка загрузки "Bullet". ContentTypeReader Microsoft.Xna.Framework.Content.Texture2DReader, Microsoft.Xna.Framework.Graphics, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = 842cf8be1de50553 конфликтует с существующим обработчиком Microsoft.Xna.Framework.Content.ReflectiveReader`1 [[Microsoft .Xna.Framework.Graphics.Texture2D, Microsoft.Xna.Framework.Graphics, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = 842cf8be1de50553]], Microsoft.Xna.Framework, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = 842cf8be1de50553 для типа Microsoft.Xna.Framework.Graphics.Texture2D.

Похоже, что программа чтения времени выполнения нашла 2 считывателя для работы с активом Texture2D , считыватель ReflectiveReader и Texture2DReader .


Вопрос

Как я могу решить эту проблему, чтобы в итоге объект был правильно заполнен, а свойство Texture2D ссылается на загруженную текстуру?

Примечание: я не хочу добавить еще одно строковое свойство и создать метод для моего объекта с именем LoadContent или что-то в этом роде. Я бы хотел, чтобы Content.Load был единственным, что мне нужно было позвонить.

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

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

6
задан George Duckett 8 December 2011 в 08:57
поделиться