2011-07-21 65 views
4

我目前正在試驗Xna內容管道擴展。在那個實驗中,我試圖加載一個包含另一個需要加載的「內容項」的文件。例如:Xna內容管道擴展 - 在自定義處理器中加載其他內容

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

現在,在我的內容處理器,我可以創造「定製項目」的一個新實例並初始化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 ... 

有誰知道這其實是可能的,如果是這樣,怎麼做呢?如果可能的話,我寧願不要延遲加載其他內容項目的路線,也不要使用二進制閱讀器和編寫器創建自己的自定義內容加載。

回答

5

您不能在內容管道中使用Texture2D。您必須使用Texture2DContent,這是前者的代理類型。反過來,您必須有一種類型的機制,允許成員在內容構建時爲Texture2DContent,但在運行時爲Texture2DThis article爲您提供了三種方法。

您可以使用ContentProcessorContext.BuildAndLoadAsset來獲得您的Texture2DContent對象。該紋理數據將嵌入到您的該資產的.xnb文件中。

如果您實際上不需要使用流水線中的紋理數據,特別是如果您打算在多個資產之間共享相同的紋理,則可以使用ContentProcessorContext.BuildAsset獲取ExternalReference到紋理,該紋理已構建放入其自己的.xnb文件中,在您資產的.xnb文件的外部(並且ContentManager將爲您處理加載)。

+0

爲快速回復而歡呼。我曾經在某處讀過關於Texture2DContent的內容,但希望能有更好的方法去實現它。儘管如此,這篇文章真的很好解釋,所以我完全理解它。 –