記錄一下配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
話說這年頭找工作真不容易,有沒有大佬指點一下,游戲、幾何都可以做,工作方向仍然迷茫中。