在上一篇博客中(【UE C++】蓝图调用C++函数),我们用C++创建了一个蓝图函数库,本篇文章在这个蓝图函数库基础上增加一个方法,该方法只需输入一个文件目录路径,就可在场景中生成该目录下得所有静态网格体。(如果不想写C++的话,可以用这篇文章的方法:UE4 | BP | 使用蓝图获取Uasset资源_ue4 蓝图加载uasset资产)
在.cpp文件中增加如下代码:
TArray<UObject*> UMyBlueprintFunctionLibrary::FindOrLoadAssetsByPath(const FString& FilePath)
{
TArray<UObject*> LoadedObjects;
EngineUtils::FindOrLoadAssetsByPath(FilePath, LoadedObjects, EngineUtils::ATL_Regular);
return LoadedObjects;
}
在.h文件中添加如下代码:
UFUNCTION(BlueprintCallable, Category="LibraryFunction")
static TArray<UObject*> FindOrLoadAssetsByPath(const FString& FilePath);
编译后,打开虚幻编辑器,新建一个父类为Actor的蓝图类,这里命名为“BP_CreateStaticMesh”
打开“BP_CreateStaticMesh”,添加一个静态网格体组件
添加一个变量,这里命名为“Mesh”
“Mesh”变量的变量类型是静态网格体的对象引用。勾选可编辑实例、生成时公开
在构造函数中添加如下节点,这样在“BP_CreateStaticMesh”生成时,就能根据传入给Mesh的模型来生成静态网格体
再新建一个Actor蓝图,这里命名为“BP_CreateStaticMeshByPath”
打开“BP_CreateStaticMeshByPath”,在事件图表中添加如下节点
如下是我静态网格体的存放路径
将“BP_CreateStaticMeshByPath”拖入视口
运行游戏可以看到生成了静态网格体
有时候用户想自己改变这个静态网格体,该如何做?我目前进展是:
首先打包设置中,取消勾选“使用Pak文件”,这样打包后Content文件夹中就不再仅是一个.pak文件,而是和打包前工程目录中的Content文件夹一样。
打包后,比如我删除了“Key”这个文件夹,场景中确实不会出现对应的静态网格体,还原后也还是能生成之前的静态网格体。
但是让人头大的是打包后的模型不再是FBX或是obj之类的模型,而是变成了.uasset格式文件,这样用户就不能直接向文件夹中导入一个3D模型让引擎调用。
我特地搜了一下如何将FBX转.uasset格式文件,例如:[UE4 convert .fbx to .uasset commandlet] - #7 by nyudeb - Pipeline & Plugins - Epic Developer Community Forums
,但是即使生成了.uasset文件还是不行,我将.uexp文件删除后,打包后的exe就无法运行并且弹出报错的窗口。
如果路过的大佬有什么见解,还希望在评论区指点一下,谢谢~
参考文章
1. UE4 根据文件夹路径生成文件夹下的所有静态网格体(蓝图)_ue4将静态网格体转换成蓝图
2. UE4 替换打包后的项目资源 - 知乎
3. UE4 | BP | 使用蓝图获取Uasset资源_ue4 蓝图加载uasset资产