關於Lua以及UniLua的學習與筆記(隨時更新)

 


Lua中文教程裏面提到,C與Lua之間的通訊關鍵在於一個虛擬的棧,幾乎全部的API調用都是對棧上面的值進行操做!而且C與Lua之間的數據交換也都經過這個棧來完成函數


在Unity3D中的C#腳本中協同的用法與C#中的協同有不同的語法規則學習


創造永遠是須要想象力的,而我須要最快的速度熟悉這些API,把事情作的更快更好,而能限制個人,只有想象力,而不會由於我不熟悉API而沒法作到lua

 

 

 

 


LUA學習記錄:指針

 

------------------------------------------C API------------------------------------------------
-----概述:
C API是一個C代碼與Lua進行交互的函數集。他有如下部分組成:讀寫Lua全局變量的函數,調用Lua函數的函數,運行Lua代碼片段的函數,註冊C函數而後能夠在Lua中被調用的函數,等等。教程

在C和Lua之間通訊關鍵內容在於一個虛擬的棧。幾乎全部的API調用都是對棧上的值進行操做,全部C與Lua之間的數據交換也都經過這個棧來完成。另外,你也可使用棧來保存臨時變量。索引

Lua庫沒有定義任何全局變量。它全部的狀態保存在動態結構lua_State中,並且指向這個結構的指針做爲全部Lua函數的一個參數。事件

-----運行步驟:get

建立一個state並將標準庫載入以後,就能夠着手解釋用戶的輸入了。對於用戶輸入的每一行,C程序首先調用luaL_loadbuffer編譯這些Lua代碼。若是沒有錯誤,這個調用返回零並把編譯以後的chunk壓入棧。(記住,咱們將在下一節中討論魔法般的棧)以後,C程序調用lua_pcall,它將會把chunk從棧中彈出並在保護模式下運行它。和luaL_laodbuffer同樣,lua_pcall在沒有錯誤的狀況下返回零。在有錯誤的狀況下,這兩個函數都將一條錯誤消息壓入棧;咱們能夠用lua_tostring來獲得這條信息、輸出它,用lua_pop將它從棧中刪除。string

-----堆棧:關於棧的操做請參見Programing in Lua一書中的186頁的一個函數
壓入元素,API有一系列壓棧的函數,他將每種能夠用C來描述的Lua類型壓棧(pushnil,pushnumber,pushboolean,pushstring)等等,第一參數都是luaState!
使用checkStack來檢測棧是否有足夠的空間!
有檢測元素類型的函數,好比 isnumber之類的!it

查詢元素,tonumber,tostring之類的

堆棧的操做,gettop返回堆棧元素個數,也是棧頂元素的索引!settop設置棧頂(堆棧中元素個數)爲一個指定的值!若是開始的棧頂高於指定的棧頂,頂部的值將會被丟棄!settop(L,0)清空堆棧!
使用負數會設置堆棧頂到指定的索引!
pushvalue壓入堆棧上指定索引的一個拷貝到棧頂!insert移動棧頂的元素到指定索引的位置,並將這個索引位置上面的元素所有上移至棧頂被移動後留下的空隔!
replace從棧頂彈出元素將其設置到指定索引位置,沒有任何移動操做

LUA中使用更多的使用對棧的操做來實現數據的交互!提供了一些對棧操做的API標準,在UniLua中,依照標準實現了這些函數,名字都只是小改動了一些,畢竟C#跟C語法規則仍是不一樣!在對堆棧的操做中,是用索引來進行定位的,正數索引自底向上取值,負數索引自頂向下取值(以正負1開始)!在其中settop函數中使用了索引0用來清空堆棧

-----------------------------------------擴展你的程序----------------------------------------------
作爲配置語言是LUA的一個重要內容!

打開包並加載函數庫,加載文件中的信息塊 (參見188頁 )

引入table的概念
如 ;在Lua文件中進行這樣的定義:BLUE={r=0,g=0,b=1} background=BLUE 在C程序裏面引用getglobal(L,background); red=getfield("r") green=getfield("g")......
getfield函數在標準的LUA庫裏面沒有提供,須要本身實現,在LuaAPI中提供了gettable函數,他接受table在棧中的位置爲參數,將對應key值出棧,返回與key對應的value!
也就是說,可使用這個方式,將對棧的操做進行封裝,封裝一個getfield函數來方便咱們對table中值的取的。

 

-------------------------------------The Registry--------------------------------------------------
registry 一直位於一個由LUA_REGISTRYINDEX定義的值所對應的假索引(pseudo-index)的位置。一個假索引除了他對應的值不在棧中以外,其餘都相似於棧中的索引。
registry就是普通的Lua表,所以,你可使用任何非nil的Lua值來訪問她的元素。然而,因爲全部的C庫共享相同的registry ,你必須注意使用什麼樣的值做爲key,不然會致使命名衝突。

registry實現了全局的值,upvalue機制實現了與C static等價的東西

 

 

 

 

 

 

LUA常規:
要在LUA中使用C#中的函數,須要先將函數在LUA中註冊!

 

 

 

 

 


動手實現:2014年4月1日 16:04:23
在策劃提供的界面中對按鈕添加事件(主要經過對C#函數綁定到UniLua中來調用實現,也就是說在Lua中實現對OnClick事件進行綁定)

建立-加載函數庫-加載具體腳本-

相關文章
相關標籤/搜索