Xna内容管道扩展-在自定义处理器中加载其他内容

本文关键字:处理器 其他 自定义 加载 管道 扩展 Xna | 更新日期: 2023-09-27 18:03:09

我目前正在尝试Xna内容管道扩展。在这个实验中,我试图加载一个包含另一个需要加载的"内容项"的文件。例如:

public class CustomItem
{
    public string Name;
    public Texture2D Texture;
}

现在,在我的内容处理器中,我可以创建一个'CustomItem'的新实例并初始化Name字段,因为它只是一个字符串。然而,我不能在内容编译期间加载纹理文件(注意:纹理只是一个例子,理想情况下我希望能够加载任何其他内容类型)。

我要找的东西是这样的:

// ... 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 ...

有没有人知道这是可能的,如果是,如何去做?如果可能的话,我宁愿不选择延迟加载其他内容项的路线,或者使用二进制读取器和写入器创建我自己的自定义内容加载。

Xna内容管道扩展-在自定义处理器中加载其他内容

您不能在内容管道中使用Texture2D。您必须使用Texture2DContent,它是前者的代理类型。反过来,您必须在类型中具有一种机制,允许成员在内容构建时为Texture2DContent,而在运行时为Texture2D。本文为您提供了三种方法。

您可以使用ContentProcessorContext.BuildAndLoadAsset来获取Texture2DContent对象。此纹理数据将嵌入到该资产的.xnb文件中。

如果你实际上不需要在管道中使用纹理数据,特别是如果你打算在多个资产之间共享相同的纹理,你可以使用ContentProcessorContext.BuildAsset来获取纹理的ExternalReference,这是内置到自己的.xnb文件中,在你的资产的.xnb文件之外(ContentManager将为你处理加载)。