腳本化編程
腳本化編程的最大好處就是簡單靈活,另外就是熱更新,這在網游中廣泛被采用,在網游中,通常采用引擎(c/C++)+腳本(lua/python)的架構,那種SDK性質的代碼放在引擎中,這些代碼在游戲上線後通常很穩定很少被修改,而真正游戲邏輯的制作就都在腳本層中進行。這樣有兩個好處:1.腳本層的bug基本不會導致程序的crash,因為是沙盒的。2.對於運行的代碼,可以方便的采用熱更新修復bug。
C與lua的交互
而如果想在腳本層編寫邏輯代碼,一個最重要的就是需要將引擎層即C++中的對象、函數、全局變量等等暴露給腳本層來訪問,當然有時也要能讓C++層能夠方便的訪問腳本層的全局變量。最近稍微仔細的探索了一下C++與Lua之間交互的知識,稍作總結,分享給需要的人。
在C中可以寫代碼訪問調用lua(函數、變量..),同時也可以在C中寫代碼讓所lua裡面能訪問c。c和lua的交互通常無外乎就以下這三種情況
1.這種情況C是啟動程序,然後調用lua裡的變量
2.這種情況C被編成庫程序,啟動程序是lua(通常是你的lua解釋器lua.exe),在lua中可以使用c的變量
3.這種情況C是啟動程序,然後調用lua裡的變量,然後調用的lua裡面又能訪問c的變量。
無論以上哪種,情況,做到C和lua交互的代碼都是在c中寫的,這些代碼被稱為lua的C API。我們要利用C API做三件事:
1.執行某個LUA腳本
2.獲取某個LUA的全局變量
2.將C變量或函數注冊成指定的規格,使得在LUA中可以調用注冊的那些C變量和函數。
如果能完成者三件事,那麼就可以完成上圖的所有這些途徑。
將C API的常用功能和交互的API以圖形化的方法繪制出來:
上圖中C和lua通過一個虛擬的棧(全局的還有函數內部局部的)來實現互相的訪問。
其中
1.執行某個LUA腳本
2.獲取某個LUA的全局變量
2.將C變量或函數注冊成指定的規格,使得在LUA中可以調用注冊的那些C變量和函數。
這三點都可以在上圖中找到相關的實現方法,但是這些方法都是為C寫的,對於C++的引擎來說,我們通常想實現一種在腳本層的面向對象的訪問,通俗來說,比如C++層有個類C,C有個借口 Get(),我們希望在腳本層可以方便的寫出c= newClassC(),c:Get()這樣的代碼,這就是本文探討的C++對象的LUa腳本化,這在C++引擎的腳本化編程中非常重要。