日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

lua和unity如何交互_Unity中C#对象与Lua之间交互的原理

發(fā)布時(shí)間:2024/10/8 C# 100 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lua和unity如何交互_Unity中C#对象与Lua之间交互的原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。