欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 编程语言 > c# >内容正文

c#

lua和unity如何交互-凯发k8官方网

发布时间:2024/10/8 c# 25 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 lua和unity如何交互_unity中c#对象与lua之间交互的原理 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

lua与其他语言交互,都是通过操作虚拟栈交流的。而操作虚拟栈最原始的方法就是通过lua与c语言的api,由于直接操作lua与c比较繁琐而且容易出错。因此tolua作为中间层而存在。

那么unity要把一个c#对象传递到lua里面,要怎么做呢?

1. 调用接口tolua.push(l,obj);这里的l指的是对应的luastate,obj就是c#对象;

• luastate 中放的是lua虚拟机中环境表、注册表、运行堆栈、虚拟机的上下文等数据。

•从一个主线程(特指lua虚拟机中的线程,即coroutine)中创建出来的新的luastate会共享大部分数据,但会拥有一个独立的运行堆栈。所以一个线程对象拥有一个luastate。

2. 如果 obj == null,会调用原生api(lua_pushnil(l,-1))把一个nil值压入栈顶,所以c#这边为null,lua那边会接收到一个nil值;如果obj 不为null,通过obj.gettype()获取obj的类型,为了便于理解,姑且把这个obj认为是gameobject类型;

3. 接下来tolua会去字典查找gameobject在lua中对应的metatable的ref,这个字典的类型为dictionary,所以ref是一个int类型的值。说到这里,可能会有两个疑点,a.这个metatable是什么东西?b. 这个metatable的ref又是什么东西?

我们都知道,如果在lua中使用c#对象,要生成对应的xxxwrap.cs文件,这些wrap文件都是一些static方法,用来和luastate进行绑定,然后就可以在lua中调用c#对象了。在绑定一个c# class

的时候,会调用beginclass(tolua_beginclass)来告诉lua我要绑定一个class。

其实在beginclass之前,会先调用beginmodule,比如beginmodule(“unityengine”),意思是在lua创建一个全局table,这个table名字就叫unityengine。并设置package.load["unityengine"] = unityengine

总结

以上是凯发k8官方网为你收集整理的lua和unity如何交互_unity中c#对象与lua之间交互的原理的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图