插件格式
有2种方式
- 以源码方式引用,就是直接放入 cpp 文件,以及相关的头文件,cpp 文件才要放在unity中,头文件可以放在别的地方,只要能引用到就行
编译时本身就会把C#通过IL2CPP反编译成cpp,然后再同插件中的cpp一起使用emscripten编译成最后的.wasm - 编译成静态库
2021.2版本之前,是编译成 .wasm 和 .js 格式
2021.2版本开始,是编译成 .a 和 .jslib 格式
.jslib 就是把 .js 扩展名改一下,都是为了把c++函数导出给js用的,如果你都是在c#中通过 [DllImport(“__Internal”)] 方式导入,那么可以不要这个文件
.wasm 和 .a 就是库文件,只不过需要用 emscripten 工具来编译而不是 gcc
官方示例NativeRenderingPlugin编译
git: https://github.com/Unity-Technologies/NativeRenderingPlugin.git
目录结构
- PluginSource c++插件工程
- UnityProject unity工程
入口
UseRenderingPlugin.cs 调用c++插件进行额外的渲染
编译web库
该示例本身是通过 cpp 源码方式直接做为web插件的,跟 PluginSource 中的头文件是有引用关系的,发布时最好编译成 .a库
由于这里不需要把接口导出给js用,因此不需要编译 .jslib ,只需要编译出 .a
- 通过bat编译
把下面代码放在 PluginSource/build_web_lib.bat 中运行即可:: 把webgl的cpp打包成.a库 :: 把emscriptenDir改成对应unity版本的路径,或直接使用 gaussiansplattingweb 内置的 Tools/BuildWebRenderPlugin 工具进行编译 set emscriptenDir=C:\Program Files\Unity\Hub\Editor\2021.3.25f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\ set srcDir=..\UnityProject\Packages\mg.gaussiansplattingweb\Runtime\Plugins\WebGL\ set emcc=%emscriptenDir%emscripten\emcc.bat set emar=%emscriptenDir%emscripten\emar.bat set EMSDK_PYTHON=%emscriptenDir%python\python.exe set EM_CONFIG=%emscriptenDir%.emscripten set cppPath=%srcDir%RenderingPlugin.cpp set objPath=RenderingPlugin.o set libPath=%srcDir%RenderingPlugin.a call "%emcc%" -c "%cppPath%" -o "%objPath%" call "%emar%" rcs "%libPath%" "%objPath%" del "%objPath%" pause
- 通过unity编辑器脚本编译
加入编辑器脚本 BuildWebRenderPlugin.cs 在插件的 Editor 目录下// 把webgl的cpp打包成.a库 // 对应 source 分支下 PluginSource/build_web_lib.bat 实现的功能 // 使用内置脚本有个好处,直接使用匹配的emscripten进行编译,不需要手动干预 public class BuildWebRenderPlugin: ScriptableObject { [MenuItem("Tools/BuildWebRenderPlugin")] public static void RunEmscriptenBuild() { // 获取 Unity 安装路径 string unityPath = EditorApplication.applicationPath; string unityRoot = Path.GetDirectoryName(unityPath); // 获取当前脚本的 MonoScript 实例 MonoScript script = MonoScript.FromScriptableObject(ScriptableObject.CreateInstance<BuildWebRenderPlugin>()); // 获取当前脚本的路径 string scriptPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(script)