UE4 c++保存asset实例(含创建自定义Asset类)

注意

该文档的目标是创建一个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(
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值