初探Godot的三種C++集成、運行調試以及Spine官方運行庫的集成

## 本文主要介紹環(huán)境搭建部分,代碼部分不會過多涉及
## 前置需求
### 只想要用別人現(xiàn)成的C++模塊,比如Spine運行庫
- 能搗鼓明白Scons
- 會自己裝各種C++編譯環(huán)境
- 會看官方文檔(官方文檔大多都寫明白了,只不過每個人環(huán)境不一樣,說不定你就是那個踩坑的幸運兒)
### 想要自己Debug C++,自己寫點C++代碼
- 會裝VS、或者VSCODE、或者其它IDE
- 會C++基礎
## GDNative、C++module、GDExtension對比
### GDNative
- 簡單
- 不用全編譯
- 調試以attach進程的形式實現(xiàn)
- 受Godot框架限制較大,適合搞些計算密集型的任務或者大內存頻繁操作?
- 編譯到多個平臺很麻煩(我至今不知道怎么編譯到android平臺上)
### C++module
- 麻煩
- 要godot源碼全編譯,由于有編譯cache作用,一次編譯后續(xù)速度會加快
- 通過visual studio調試,開發(fā)效率勉強也能接收
- 編譯到多平臺較為容易,只要按照官方文檔編譯模版文件就可以了
### GDExtension(Godot4)
- 和GDNative十分相似,有部分優(yōu)化,但是目前尚處于實驗階段
## 試試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分支已經(jīng)是godot4的代碼了,所以3.5還是要切對應的3.5分支
### 開發(fā)流程1-scons編譯
godot-cpp-header放在godot-cpp文件夾里,然后整個godot-cpp拷貝過去,創(chuàng)建好SConstruct,可以用[官方模版](https://docs.godotengine.org/en/stable/tutorials/scripting/gdnative/gdnative_c_example.html#doc-gdnative-c-example)
把所有項目內容按照scons文件里的要求過一遍,目錄該有的要有,文件夾對應好,跑一遍scons platform=windows搞定


具體開發(fā)可以參考[視頻](https://www.youtube.com/watch?v=j0hMxMD9mII)
### 開發(fā)流程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里創(chuàng)建一個資源gdnlib

配置好對應的dll,就可以新建一個gdns了

### 調試
全部搞好就可以執(zhí)行了,通過附加到進程進行調試

## 試試C++ module
[官方文檔](https://docs.godotengine.org/en/stable/development/cpp/custom_modules_in_cpp.html)
首先要scons編譯一遍
通過`scons?platform=windows?vsproj=yes`生成vs解決方案,就可以直接用vs打開sln文件了
配置好調試的命令參數(shù),就可以直接運行了,自動每次都會自動執(zhí)行scons生成一個全新的godot
命令行參數(shù)官方文檔也有說明,如果想要調試游戲某個場景,去掉-e參數(shù),增加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"`即可,這樣就能實現(xiàn)和官網(wǎng)bat腳本一樣的結果
以上操作是解構bat文件的結果,其實自己看一遍就明白了
最后編譯出ide,就能執(zhí)行spine-godot中的示例項目了
如果要編譯到其他平臺的導出模版,只要依樣畫葫蘆加上`custom_modules="../spine_godot"`即可

## 試試GDExtension
官網(wǎng)提供了一個示例,我本地運行沒問題,編譯和集成步驟和gdnative差不多,但是據(jù)說代碼寫法上更接近c++ module,但是由于短期還沒有遷移4.0打算,所以只是淺嘗即止,沒有深挖。
[官網(wǎng)](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開發(fā)可以說更上一層樓。
目前也有goost、voxel等c++庫可以作為學習參考