找回密码
 立即注册
查看: 202|回复: 0

ToLua基础

[复制链接]
发表于 2021-8-12 09:27 | 显示全部楼层 |阅读模式
一、ToLua框架官方案例学习

1.Hello ToLua

创建虚拟机,开启虚拟机,之后就可以运行lua脚本;虚拟机使用完成后要关闭,检查虚拟栈是否为空,析构掉虚拟机,然后将虚拟机赋值null;运行lua脚本的方式:第一种,直接使用C#字符串写lua脚本,使用lua.DoString()函数;第二种,加载lua脚本文件,首先要设置路径,string fullpath = application.path +”//luascripts”,然后使用lua.AddSearchPath()路径添加虚拟机的文件搜索路径即可,注意:lua还是会从默认路径开始搜索文件,在所有的搜索路径里不能有重名文件(虽然lua是大小写敏感的,但是在文件名检索这里是大小写不敏感的,也就是如果搜main.lua,lua会在搜到Main.lua就结束了);之后可以使用DoFile或者Require来加载文件,lua.Require(“Test”);
lua = new LuaState();                lua.Start();        //如果移动了ToLua目录,自己手动修复吧,只是例子就不做配置了string fullPath = Application.dataPath + "\\ToLua/Examples/02_ScriptsFromFile";lua.AddSearchPath(fullPath);lua.DoFile("ScriptsFromFile.lua"); lua.Require("ScriptsFromFile");  lua.Dispose();2.C#调用lua的函数,访问lua变量

在一个lua脚本中声明了一些数字变量、表、以及函数后,C#访问lua变量varnum(这个varnum必须是全局变量),lua[“varnum”],如果这个变量没有被定义,就会自动在lua虚拟机中创建一个全局变量,否则获取这个变量的值。
函数:LuaFunction func=lua.getFunction(“Func1”);
函数用完后要手动释放内存,func.dispose();
:LuaTable table=lua.getTable(“vartable”);
使用table访问数据时,要使用Lua[“”],不能使用.操作符。
如果一个表有嵌套,例如t1={name=“t1”},t2={name=“t2”,t1},这时如果要在C#中访问嵌套表中的元素,需要先获取嵌套的表
LuaTable table2=lua.getTable(“t2”);
LuaTable table1=(LuaTable)table2[“t2”];
然后使用table1.name访问,不可以使用table2[“t1.name”]去访问,因为它会把t1.name作为键值去查找,如果t2={“x1”,{ “x2”}},
那么可以使用t1=t2[2];然后用t1[1]访问到”x2”;
使用成员方法addtable()创建一个table,然后使用按字典访问的格式获取table。
t2.AddTable(“t3”); LuaTable t3=(LuaTable)t2[“t3”];
Table类型的变量需要手动释放内存,使用table.Dispose()
3.Lua调用C#

LuaBinder,如果需要用到unity里的类,就需要使用LuaBinder绑定虚拟机LuaState。
“:”操作符用于非静态成员函数的访问,如果要访问一个实例对象的成员函数,就要用“:”如cube:GetComponent,冒号就是个语法糖,使用冒号操作符它会自动将当前对象self作为参数隐式传入函数中;
“.”操作符用于访问除了“:”之外的变量(静态与非静态),以及静态函数,比如GameObject.Instaniate()
4.ToLua框架目录

Editor目录,customsetting.cs 自定义配置文件,将需要在lua中使用的类在该文件中做好配置;
Source目录,Generate文件夹:生成用于交互的绑定代码—wrap脚本;customsetting中修改配置后,点击generate可以生成wrap脚本文件;
LuaConst:这是一个静态类,Source文件夹下的luaConst文件,里面用于存储一些常量值,包含加载lua文件的默认路径等。
public static string luaDir = Application.dataPath + "/Lua";                //lua逻辑代码目录public static string toluaDir = Application.dataPath + "/ToLua/Lua";        //tolua lua文件目录然后在LuaState.cs脚本中会将该路径加入搜索路径中;
AddSearchPath(LuaConst.toluaDir);AddSearchPath(LuaConst.luaDir);二、实例体会

1.任意一个组件(transform组件除外),都可以设置该组件的enabled属性,通过inspector面板上组件的复选框也可以选择是否启用组件;对于脚本组件来说,如果enabled为false,那么start之后的函数将不会执行,但awake不会受影响,所以当一个脚本组件只有awake函数时,就不需要用到enabled属性,属性面板上就不会出现复选框;
2.lua里使用transform查找子物体,transform:find(),这是错误的,记住unity里的函数都是首字母大写,属性都是首字母小写,(find首字母小写产生报错,filed or property find does not exist);GetChild使用索引查询子物体;Find和ChildFind都是查询当前物体的直接子物体,而忽视子物体的子物体;
GameObject.Find()会在所有物体层级中查找物体,当然也可以通过设定路径查找物体,比如GameObject.Find("\Cubes\Cube1");
3.lua中使用自定义的工具类,类似于使用unity中的类,需要在customsetting.cs文件中添加,_GT(typeof(UIEvent)), _GT(typeof(SceneManager));然后重新生成wrap文件,在lua中就可以直接使用了;
声明local GameObject=UnityEngine.GameObject,相当于C#中的using UnityEngine; 自定义类的使用,如果没有命名空间,就可以像C#中直接使用类名即可。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 06:23 , Processed in 0.063506 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表