UE5 Assimp 自用
记录一下配assimp库到ue中的过程。因为想在ue里面实现一些几何处理(虽然ue好像有相关的geo的代码),遂配置了一下assimp。
1. 编译+整理生成自己所需要的文件。cmake编译,下载github 的官方的assimp-master,然后cmake都是默认的就行(我是vs2022,x64其他应该也行的,见图一)。具体可以参考这个大佬(下面的链接)。我是做到了大佬的第六步那边。
在编译完的结果中(我是保存到新建的一个assimp-build的文件夹中了)取bin、lib两个文件夹,分别提供dll和lib文件。然后那些头文件啥的得从原来的assimp-master库里面给include复制出来。(图二)。讲道理其他不用的在复制出这些文件夹后都可以删了好像。~-~
tip1:注意!!!编译生成的文件夹里,也有include文件夹(assimp-build/include),那里面一个config.h也得拿出来,不然后面会报错缺少该文件。
最后这一步结束我就得到了一个待会要去build.cs里面声明路径的一个很简单轻快的文件夹:图三。包含assimp-build中的bin、lib,assimp-master中的include(偷偷把config.h也放到其中去了)。
[虚幻引擎][UE][C++]Assimp库安装编译,UE_Assimp插件安装使用,各种三维格式转换_ue assimp-CSDN博客
图一:
图二:
图三:
2. build.cs配置
代码主要参考这篇大佬:
[UE5 Runtime Editor]1.运行时模型资源导入(上篇) - 哔哩哔哩
按照1中的配置,我最后的cs代码如图四:
(请无视其他的库啥的,主要是path那几段,Geo是我的项目名,ThirdParty自己创的)
(ps,自己vs中用的release版本编译的,所以路径里面都带个release)
图四:
using System;
using System.IO;
using UnrealBuildTool;public class Geo : ModuleRules
{public Geo(ReadOnlyTargetRules Target) : base(Target){PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput","MeshDescription","StaticMeshDescription","MeshConversion","ProceduralMeshComponent","DynamicMesh","GeometryCore","GeometryScriptingCore","GeometryFramework","UMG",});PrivateDependencyModuleNames.AddRange(new string[] { });string assimpPath= Path.Combine(ModuleDirectory, "../ThirdParty/assimp");string includePath = Path.Combine(assimpPath, "include");PublicIncludePaths.Add(includePath);//System.Console.WriteLine("assimp include path:" + includePath);string libPath = Path.Combine(assimpPath, "lib/Release/assimp-vc143-mt.lib");PublicAdditionalLibraries.Add(libPath);string dllPath = Path.Combine(assimpPath, "bin/Release/assimp-vc143-mt.dll");RuntimeDependencies.Add(dllPath);//System.Console.WriteLine("assimp dll path:" + dllPath);if (Target.Type == TargetType.Editor){string dllOutputPath = Path.Combine(ModuleDirectory, "../../Binaries", "Win64", "assimp-vc143-mt.dll");if (!File.Exists(dllOutputPath)){File.Copy(dllPath, dllOutputPath);}}}
}
3. 测试的话我用的也是procedural mesh+assimp(貌似还可以用dynamic mesh,和static mesh对应的,我还没搞明白)。同样参考下面这篇,但是copy代码的时候要注意。比方斯坦福中国龙那种model,里面没有normal?,很神奇,所以图五里面的HasNormals()要去掉,不然导入的模型会消失捏。
[UE5 Runtime Editor]1.运行时模型资源导入(上篇) - 哔哩哔哩
图五:
4. UE项目中的问题。一开始还能用,但是后来我要修改一下game mode啥的,新建的c++类在UE项目的编辑器中找不到,但通过VS代码debug-本地调试器生成的那个编辑器中找得到。查了半天不知道为啥(现在也不太清楚核心原因)。
从工程上解释下我个人的理解:
UE项目编辑器中右下角有个living coding啥的(图六),那玩意一点就报错。我猜是VS写的很好了,但是编辑器看不到里面的东西。living coding编译总会报这个错:
Assimp4UE.cpp.obj : error LNK2019:
无法解析的外部符号 "void __cdecl std::_Xlength_error(char const *)" (?_Xlength_error@std@@YAXPEBD@Z),
函数 "void __cdecl std::_Xlen_string(void)" (?_Xlen_string@std@@YAXXZ) 中引用了该符号
E:\UE\Projects\Geo\Binaries\Win64\UnrealEditor-Geo.patch_0.exe : fatal error LNK1120: 1 个无法解析的外部命令
我问了deepseek,说是md和mt的问题。但实际上assimp官方的cmake文件里就都是mt,而且我也不太敢改cmake文件。反正就是很麻烦。官方论坛也有人讨论living coding的问题,一大堆总之就是好像std的库和UE适配有点大病?最后的解决方式也很简单,图六那个旁边不是有3个点嘛,把启动实时代码编写关掉,重新点一下左侧的那个重新编译就ok了。我记得这个好像哪个视频里老师讲过,但是现在不记得了。
图六:
5. 都看到这了,推荐一个很好玩的纯蓝图的UE5 RPG项目教程:
https://www.youtube.com/playlist?list=PLiSlOaRBfgkcPAhYpGps16PT_9f28amXi
话说这年头找工作真不容易,有没有大佬指点一下,游戏、几何都可以做,工作方向仍然迷茫中。