文章目录
注意
该文档的目标是创建一个uasset文件,用来保存类的实例,而不是蓝图类,类似存储在内容中的图片。
该文档是实践记录,具体理论查看参考。
如果要通过C++创建蓝图类,可以先新建C++类,然后在UE编辑器中有C++ Classes
文件夹,进入后找到自己新建的C++类,右键创建蓝图类即可
参考
UE4.26.2
《大象无形》第10章,对象模型,第16章,自定义资源和编辑器
资产管理
UE4资源加载1
Creating new uasset files in code/CPP
UE中创建自定义Asset类
package 与 asset
一个资源在文件中对应uasset,在内存中对应UPackage。
UPackage序列化到本地后就是uasset文件。关于序列化详情看《大象无形》第十章。
在UE编辑器中创建一个资源,此时资源是存在内存上的,打开文件管理器是看不到资源的,只有点击了保存之后才能在文件管理器中看到asset。
保存uasset的样例
为了方便,新建一个C++第三人称项目,新建c++类MyObject
继承于UObject,该类用来保存为uasset,里面可以什么都不写。这里不可以直接用UObject,UObject是抽象类,直接存会报错。而继承UObject,多了UCLASS()一系列东西。
然后在对应Character 类下实现
.h 文件添加代码
UFUNCTION(BlueprintCallable)
bool TestCreateAsset();
bool GetFolderToSaveDatas(FString& OutFolderName);
.cpp 文件添加代码
bool AMyProjectCharacter::TestCreateAsset()
{
// 获取文件保存位置
FString saveFolder;
if(!GetFolderToSaveDatas(saveFolder))
{
return false;
}
FString objectName = TEXT("MyCreateObject");
// 创建包
FString packageName = TEXT("/Game/") + saveFolder + "/" + objectName;
UPackage* package = CreatePackage(*packageName);
package->FullyLoad();
// 创建实例
UMyObject* myCreateObject = NewObject<UMyObject>(package, *objectName, RF_Public | RF_Standalone);
if (IsValid(myCreateObject))
{
// 添加细节
}
// 保存Package
FAssetRegistryModule::AssetCreated(myCreateObject);
package->SetDirtyFlag(true);
return true;
}
// 打开文件夹,获取保存的文件名
bool AMyProjectCharacter::GetFolderToSaveDatas(FString& OutFolderName)
{
IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get();
if(DesktopPlatform)
{
if (
DesktopPlatform->OpenDirectoryDialog(
nullptr,
TEXT("Choose a folder to save asset which created, must inside Content folder"),
FPaths::ProjectContentDir(