神临的uLua学习(一)
来源:互联网 发布:ff14暗战捏脸数据 编辑:程序博客网 时间:2024/05/16 18:50
这里我要将一些简单的uLua学习内容纪录并分享一下.
1.HelloWorld(就像一开始学习编程语言一样,先写一个HelloWorld吧)
void Start () { LuaState l = new LuaState();//建立一个新的Lua状态 string str = "print('hello world 世界')";//建立string l.DoString(str);//状态机执行 }
2.CreateGameObject_1(这里记录了游戏对象在uLua的创建方式.这是第一个方式)
private string script = @"luanet.load_assembly('UnityEngine')--调用unity引擎 GameObject = luanet.import_type('UnityEngine.GameObject')--调用unity中的GameObject对象 ParticleSystem = luanet.import_type('UnityEngine.ParticleSystem')--调用粒子系统 local newGameObj = GameObject('NewObj')newGameObj:AddComponent(luanet.ctype(ParticleSystem))--新建对象并添加组件 "; //反射调用 void Start () { LuaState lua = new LuaState(); lua.DoString(script);//略 }
3.CreateGameObject_2(这里记录了游戏对象在uLua的创建方式.这是第二个方式)
private string script = @" luanet.load_assembly('UnityEngine') GameObject = UnityEngine.GameObject ParticleSystem = UnityEngine.ParticleSystem local newGameObj = GameObject('NewObj') newGameObj:AddComponent(ParticleSystem.GetClassType()) "; //非反射调用 void Start () { LuaScriptMgr lua = new LuaScriptMgr(); lua.Start(); lua.DoString(script); }
这里再解释一下反射调用和非反射调用:
反射调用方式是不推荐使用的,因为效率慢,推荐的是使用wrap(可以从Lua的组件中找到,这里不做介绍)的去反射模式,这里还继续保留下来的原因在于,在某些特定环境下,反射还是有用途的,去反射最大的弊端在于提前需要把C#的类导入到Lua中,如果上线了发现有些类没有导入,反射就可以通过临时的调用未wrap的类,进行使用,当大版本更新时,再将此类加入wrap,这时候反射就是解决这种情况出现,所以概率小,1%的可能性,但并不代表不存在。
4.LuaVariables_1(这里是Lua变量的使用方式1)
private string script = @" luanet.load_assembly('UnityEngine') GameObject = luanet.import_type('UnityEngine.GameObject') ParticleSystem = luanet.import_type('UnityEngine.ParticleSystem')--略 particles = {}for i = 1, Objs2Spawn, 1 do --for循环开始 local newGameObj = GameObject('NewObj' .. tostring(i)) local ps = newGameObj:AddComponent(luanet.ctype(ParticleSystem)) --local ps = newGameObj:AddComponent('ParticleSystem') PS:Unity5.x已经废弃这种方式,Unity4.x可用-- ps:Stop() table.insert(particles, ps) end --循环结束 var2read = 42 ";void Start () { LuaState l = new LuaState(); l["Objs2Spawn"] = 5;//对Objs2Spawn的key添加value l.DoString(script);//执行 print("Read from lua: " + l["var2read"].ToString()); LuaTable particles = (LuaTable)l["particles"]; foreach( ParticleSystem ps in particles.Values ) { ps.Play(); } }
说明一下这里的”- -“在Lua里是注释的意思
5.LuaVariables_2(这里是Lua变量的使用方式2)
//对于cstolua的使用要求必须要先定义变量才能使用 private string var = @"Objs2Spawn = 0"; private string script = @" ParticleSystem = UnityEngine.ParticleSystem particles = {} for i = 1, Objs2Spawn, 1 do local newGameObj = GameObject('NewObj' .. tostring(i)) local ps = newGameObj:AddComponent(ParticleSystem.GetClassType()) ps:Stop() table.insert(particles, ps)--lua从尾部嵌入 end var2read = 42 "; // Use this for initialization void Start () { LuaScriptMgr mgr = new LuaScriptMgr();//建立管理器 mgr.Start();//运行 LuaState l = mgr.lua;//状态 l.DoString(var); l["Objs2Spawn"] = 5; l.DoString(script);//略 print("Read from lua: " + l["var2read"].ToString()); LuaTable particles = (LuaTable)l["particles"]; foreach( ParticleSystem ps in particles.Values ) { ps.Play(); } }
6.ScriptsFromFile_01(这里是从文件中调用的方法)
public TextAsset scriptFile;//从外部挂载Lua脚本void Start() { LuaState l = new LuaState(); l.DoString(scriptFile.text); }
7.ScriptsFromFile_02(从内部加载的方法)
void Start() { //只是展示如何加载文件,不推荐这么做 LuaState l = new LuaState(); string path = Application.dataPath + "/uLua/Examples/04_ScriptsFromFile/ScriptsFromFile02.lua"; l.DoFile(path); }
8.CallLuaFunction_01(使用运行函数)
private string script = @" function luaFunc(message) print(message) return 42 end ";void Start () { LuaState l = new LuaState(); l.DoString(script); LuaFunction f = l.GetFunction("luaFunc"); object[] r = f.Call("I called a lua function!"); print(r[0]);//这里不多解释,认真看就行 }
如果觉得看着费劲可以去到这里http://www.runoob.com/lua/lua-tutorial.html学习一下Lua基础
9.CallLuaFunction_02(第二种方式)
private string script = @" function luaFunc(num) return num end "; LuaFunction func = null;void Start () { LuaScriptMgr mgr = new LuaScriptMgr(); mgr.DoString(script); func = mgr.GetLuaFunction("luaFunc"); object[] r = func.Call(123456); print(r[0]); int num = CallFunc(); print(num); } void OnDestroy() { if (func != null) { func.Release(); } } int CallFunc() { int top = func.BeginPCall(); IntPtr L = func.GetLuaState(); LuaScriptMgr.Push(L, 123456); func.PCall(top, 1); int num = (int)LuaScriptMgr.GetNumber(L, -1); func.EndPCall(top); return num; }//这里代码就较多了,不过并不难,然真看就行
阅读全文
1 0
- 神临的uLua学习(一)
- 神临的uLua学习(二)
- 神临的uLua学习(三)
- 神临的uLua学习(四)
- 神临的uLua学习(五)
- uLua对于unity的例子理解 一
- 学习uLua的系列博文
- 学习uLua的博文链接
- ulua(一)上手
- unity ulua使用方法一
- 学习ULua之委托
- Ulua学习笔记
- uLua学习笔
- ulua学习笔记1
- uLua+SimpleFramework常见问题的解答及学习笔记
- ULUA的简洁用法
- uLua
- ulua
- Linux设备驱动之中断---thread使用示例
- http超文本协议,让http不再难懂
- 开发者们,2017年你们过得好吗?
- Java高级工程师面试知识汇总(二)
- CentOS 7.0下Qt5.8实现和使用Qt Creaor自定义控件
- 神临的uLua学习(一)
- quartz定时任务中常用的cron表达式
- Linux下Samba服务器安装
- 为什么使用微服务?
- re.S--python中正则
- Python入门(06) -- 正则表达式
- DOTween修改数值
- PyQt5+python3+pycharm开发环境配置
- Windows命令行修改代码页,显示特定国家语言