本文章使用引擎版本:4.11 當我們將png或其他格式的圖檔放到Content這個folder下面,我們會發現引擎會自動把它轉成uassets的格式,之後我們就可以在editor中很方便的對它進行各種操作。但是,我們到底該怎麼樣用C++把這個檔案動態的讀進來?官方文件對這方面的文件實在是少的可憐,不過沒關係,原始碼就是我們最好的文件,深入引擎源碼閱讀之後,還是可以找到相關的方法。 簡單來說,引擎中所有的asset分為被控管(managed)以及沒被控管(unmanaged)二種: 被控管(managed)的asset副檔名為.uasset、.umap,會出現在editor的content browser中,我們可以直接在editor中對它進行各種操作,這些檔案包UMG、blueprint、material或匯進來的圖檔……等等。另外一些則是沒被控管(unmanaged)的檔案,如png、json……等等其他不是經過引擎處理所產生的檔案。 被控管(managed)跟沒被控管(unmanaged)的檔案其實都是可以動態的用C++讀進引擎裡面的,只是不同的是它們所要求的檔案路徑不同。前者要求的是LongPackageName,而後者要求的是實際的檔案路徑。 被控管檔案(managed)的讀取方法 讀取的方法目前我所知的有二種。 第一種是先在constructor中先拿到Class,然後再NewObject,下面的範例展示如果把一個做好的UMG讀進來: https://gist.github.com/dorgonman/b669fbc6382e938dc4262d80cb46b56e 其中CreateWidget只是對NewObject做一些檢查跟Widget相關的設定,最終還是會呼叫UUserWidget* NewWidget = NewObject<UUserWidget>(Outer, UserWidgetClass);。widget->AddToViewport()這個方法可以讓這個UMG顯示在營幕上。 只是這個方法有個缺點,就是所有需要用到的uasset都必須要先在constructor中先把其class讀進來。若是在其他地方呼叫ConstructorHelpers::FClassFinder的話則會馬上噴出一個錯誤:UE_CLOG(!ThreadContext.IsInConstructor, LogUObjectGlobals, Fatal, TEXT(“FObjectFinders can’t be used outside of constructors to find %s”), ObjectToFind); 因此要做到真正的動態讀取的話,我們可以使用第二種方法:FStringAssetReference。以下的code試著去讀取UMG、umap、flipbook跟UTexture2D: https://gist.github.com/dorgonman/700b83f04da2ca8865745d9430759e6e 我們可以看到FPackageName::LongPackageNameToFilename,從範例中應該大概可以看出來這個方法的用途是什麼。它把我們餵入的package path轉換成檔案路徑。 餵入PackageFileNamePath: /Game/UMG/NewWidgetBlueprint 轉成FileNamePath: ../../../../../../Users/dorgon/Documents/Unreal Projects/MyProject/Content/UMG/NewWidgetBlueprint.uasset 上述的方法雖然我們可以發現在editor模式下可以運行的很好,但是在打包出來的版本卻發現會無法讀入UMG或blueprint這二個asset。這是因為在cooked … Continued