初探Godot的三种C++集成、运行调试以及Spine官方运行库的集成

## 本文主要介绍环境搭建部分,代码部分不会过多涉及
## 前置需求
### 只想要用别人现成的C++模块,比如Spine运行库
- 能捣鼓明白Scons
- 会自己装各种C++编译环境
- 会看官方文档(官方文档大多都写明白了,只不过每个人环境不一样,说不定你就是那个踩坑的幸运儿)
### 想要自己Debug C++,自己写点C++代码
- 会装VS、或者VSCODE、或者其它IDE
- 会C++基础
## GDNative、C++module、GDExtension对比
### GDNative
- 简单
- 不用全编译
- 调试以attach进程的形式实现
- 受Godot框架限制较大,适合搞些计算密集型的任务或者大内存频繁操作?
- 编译到多个平台很麻烦(我至今不知道怎么编译到android平台上)
### C++module
- 麻烦
- 要godot源码全编译,由于有编译cache作用,一次编译后续速度会加快
- 通过visual studio调试,开发效率勉强也能接收
- 编译到多平台较为容易,只要按照官方文档编译模版文件就可以了
### GDExtension(Godot4)
- 和GDNative十分相似,有部分优化,但是目前尚处于实验阶段
## 试试GDNative
不需要godot源码,但是需要[godot-cpp](https://github.com/godotengine/godot-cpp/tree/godot-3.5-stable)和[godot-cpp-header](https://github.com/godotengine/godot-headers/tree/godot-3.5-stable),注意master分支已经是godot4的代码了,所以3.5还是要切对应的3.5分支
### 开发流程1-scons编译
godot-cpp-header放在godot-cpp文件夹里,然后整个godot-cpp拷贝过去,创建好SConstruct,可以用[官方模版](https://docs.godotengine.org/en/stable/tutorials/scripting/gdnative/gdnative_c_example.html#doc-gdnative-c-example)
把所有项目内容按照scons文件里的要求过一遍,目录该有的要有,文件夹对应好,跑一遍scons platform=windows搞定


具体开发可以参考[视频](https://www.youtube.com/watch?v=j0hMxMD9mII)
### 开发流程2-vs自己编译
参考[视频](https://www.youtube.com/watch?v=aPDO9nAP5oM)
不要求拷贝godot-cpp和godot-cpp-header,只需要配置的时候把路径设置好就可以了,免去了每次拷文件的烦恼
把godot的库直接手动加到vs里,参考步骤如图(图里的lib目录其实是godot-cpp的bin目录)






设置dll导出到自己的godot项目文件夹里,不用每次编译完手动拷贝了
直接生成项目,dll就到对应文件夹里了
### 集成流程
有了dll,在godot里创建一个资源gdnlib

配置好对应的dll,就可以新建一个gdns了

### 调试
全部搞好就可以执行了,通过附加到进程进行调试

## 试试C++ module
[官方文档](https://docs.godotengine.org/en/stable/development/cpp/custom_modules_in_cpp.html)
首先要scons编译一遍
通过`scons platform=windows vsproj=yes`生成vs解决方案,就可以直接用vs打开sln文件了
配置好调试的命令参数,就可以直接运行了,自动每次都会自动执行scons生成一个全新的godot
命令行参数官方文档也有说明,如果想要调试游戏某个场景,去掉-e参数,增加tscn路径即可
例如`--path "E:\workspace\godot\godot3_5_web\GodotProjectWithCppModule" "t2.tscn" --verbose`

参考[视频](https://www.youtube.com/watch?v=xo3z9IjGRSo)
这个好处就是可以直接调试游戏,不用attach进程调试了,但是缺点就是每次运行变慢了,如果cpp改动不大或者用的不深入应该问题不大
### spine运行库
[spine-godot](http://zh.esotericsoftware.com/spine-godot)
从github上clone下来spine-runtimes,由于官方提供的流程是会单独重新拉godot代码的,而且会把godot代码放在spine运行库的文件夹里
这里推一波我的做法:
将spine-runtimes里的spine-cpp拷贝到spine-godot里


将spine-runtimes里的spine-godot拷贝到你自己的godot源码同目录,注意godot源码的目录,名字要一模一样编译才能通过
在godot目录里使用scons命令但是增加一个`custom_modules="../spine_godot"`即可,这样就能实现和官网bat脚本一样的结果
以上操作是解构bat文件的结果,其实自己看一遍就明白了
最后编译出ide,就能执行spine-godot中的示例项目了
如果要编译到其他平台的导出模版,只要依样画葫芦加上`custom_modules="../spine_godot"`即可

## 试试GDExtension
官网提供了一个示例,我本地运行没问题,编译和集成步骤和gdnative差不多,但是据说代码写法上更接近c++ module,但是由于短期还没有迁移4.0打算,所以只是浅尝即止,没有深挖。
[官网](https://godotengine.org/article/introducing-gd-extensions)
[介绍](https://www.reddit.com/r/godot/comments/suvklu/a_few_questions_about_c_and_godot_4s_gdextension/)
## 总结
有了C++作为后备力量,特别是c++模块,弥补gdscript的内存、速度性能瓶颈,应该是非常棒的选择,引入spine的支持,对2d开发可以说更上一层楼。
目前也有goost、voxel等c++库可以作为学习参考