lua和unity如何交互_Unity中C#对象与Lua之间交互的原理
lua與其他語(yǔ)言交互,都是通過(guò)操作虛擬棧交流的。而操作虛擬棧最原始的方法就是通過(guò)lua與c語(yǔ)言的api,由于直接操作lua與c比較繁瑣而且容易出錯(cuò)。因此tolua作為中間層而存在。
那么unity要把一個(gè)C#對(duì)象傳遞到lua里面,要怎么做呢?
1. 調(diào)用接口Tolua.Push(L,obj);這里的L指的是對(duì)應(yīng)的luastate,obj就是c#對(duì)象;
??luastate 中放的是lua虛擬機(jī)中環(huán)境表、注冊(cè)表、運(yùn)行堆棧、虛擬機(jī)的上下文等數(shù)據(jù)。
?從一個(gè)主線程(特指lua虛擬機(jī)中的線程,即coroutine)中創(chuàng)建出來(lái)的新的luaState會(huì)共享大部分?jǐn)?shù)據(jù),但會(huì)擁有一個(gè)獨(dú)立的運(yùn)行堆棧。所以一個(gè)線程對(duì)象擁有一個(gè)luaState。
2. 如果 obj == null,會(huì)調(diào)用原生api(lua_pushnil(L,-1))把一個(gè)nil值壓入棧頂,所以c#這邊為null,lua那邊會(huì)接收到一個(gè)nil值;如果obj 不為null,通過(guò)obj.GetTYpe()獲取obj的類型,為了便于理解,姑且把這個(gè)obj認(rèn)為是GameObject類型;
3. 接下來(lái)tolua會(huì)去字典查找GameObject在lua中對(duì)應(yīng)的metatable的ref,這個(gè)字典的類型為Dictionary,所以ref是一個(gè)int類型的值。說(shuō)到這里,可能會(huì)有兩個(gè)疑點(diǎn),a.這個(gè)metatable是什么東西?b. 這個(gè)metatable的ref又是什么東西?
我們都知道,如果在lua中使用C#對(duì)象,要生成對(duì)應(yīng)的xxxwrap.cs文件,這些wrap文件都是一些static方法,用來(lái)和luastate進(jìn)行綁定,然后就可以在lua中調(diào)用c#對(duì)象了。在綁定一個(gè)C# Class
的時(shí)候,會(huì)調(diào)用BeginClass(tolua_beginclass)來(lái)告訴lua我要綁定一個(gè)class。
其實(shí)在beginclass之前,會(huì)先調(diào)用beginmodule,比如beginmodule(“UnityEngine”),意思是在lua創(chuàng)建一個(gè)全局table,這個(gè)table名字就叫UnityEngine。并設(shè)置package.load["UnityEngine"] = UnityEngine
總結(jié)
以上是生活随笔為你收集整理的lua和unity如何交互_Unity中C#对象与Lua之间交互的原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cpu压测 windows_cpu压测神
- 下一篇: 中华v3丢机油怎么解决?