uLua学习总结

uLua下载:http://www.ulua.org/

VS2012/2013的用于编写Lua的插件:https://babelua.codeplex.com/http://unknownworlds.com/decoda/

在下载了uLua_vX.XX.zip后解压得到一个XXX.unitypackage文件,将该文件导入到我们的工程中即可使用uLua了。

我们先来一个最简单的示例:

 1 using UnityEngine;
 2 using System.Collections;
 3 using LuaInterface;
 4
 5 public class LuaTest : MonoBehaviour
 6 {
 7     void Start ()
 8     {
 9         LuaState luaState = new LuaState();
10         luaState.DoString("print(‘hello world 世界‘)");
11     }
12 }

将该脚本绑定到场景中的一个GameObject之上就可以看到效果了。

下面我们看一个加载外部lua文件的例子:

我们新建一个Resources目录,在目录里创建一个名为Test.lua.txt的文件,输入lua代码:

1 print("This is a script from a file 世界")

保存为UTF-8格式,注意Unity的TextAsset不支持lua的后缀名,所以后缀名要修改为txt。

修改上面的示例为下面的代码即可:

 1 using UnityEngine;
 2 using System.Collections;
 3 using LuaInterface;
 4
 5 public class LuaLoadFileTest : MonoBehaviour
 6 {
 7     void Start ()
 8     {
 9         TextAsset luaString = Resources.Load<TextAsset>("Test.lua");
10
11         LuaState luaState = new LuaState();
12         luaState.DoString(luaString.text);
13     }
14 }

注意Load的文件是不带后缀名的。

下面的例子使用uLua创建一个GameObject:

 1 using UnityEngine;
 2 using System.Collections;
 3 using LuaInterface;
 4
 5 public class LuaTest : MonoBehaviour
 6 {
 7     private string lua = @"
 8             --加载模块
 9             luanet.load_assembly(‘UnityEngine‘)
10             luanet.load_assembly(‘Assembly-CSharp‘)
11
12             --导入 Unity3D 的类
13             Util = luanet.import_type(‘Util‘)
14             GameObject = luanet.import_type(‘UnityEngine.GameObject‘)
15
16             --创建一个新的 GameObject 对象
17             local newGameObj = GameObject(‘NewObj‘)
18             --添加粒子组件
19             Util.AddComponent(newGameObj, ‘UnityEngine‘, ‘ParticleSystem‘)
20         ";
21
22     void Start ()
23     {
24         LuaState luaState = new LuaState();
25         LuaScriptMgr._translator = luaState.GetTranslator();
26         luaState.DoString(lua);
27     }
28 }

下面的例子是设置和获取Lua中的变量:

 1 using UnityEngine;
 2 using System.Collections;
 3 using LuaInterface;
 4
 5 public class LuaTest : MonoBehaviour
 6 {
 7     private string lua = @"
 8             --加载模块
 9             luanet.load_assembly(‘UnityEngine‘)
10             luanet.load_assembly(‘Assembly-CSharp‘)
11
12             --导入 Unity3D 的类
13             Util = luanet.import_type(‘Util‘)
14             GameObject = luanet.import_type(‘UnityEngine.GameObject‘)
15
16             --创建表
17             particles = {}
18
19             --循环
20             for i = 1, Objs2Spawn, 1 do
21                 --创建 GameObject 对象
22                 local newGameObj = GameObject(‘NewObj‘ .. tostring(i))
23                 --添加组件
24                 local ps = Util.AddComponent(newGameObj, ‘UnityEngine‘, ‘ParticleSystem‘)
25                 --暂停粒子播放
26                 ps:Stop()
27
28                 --加入表
29                 table.insert(particles, ps)
30             end
31
32             --定义一个数据
33             var2read = 42
34         ";
35
36     void Start ()
37     {
38         LuaState luaState = new LuaState();
39         LuaScriptMgr._translator = luaState.GetTranslator();
40
41         //赋值 Lua 中的数据
42         luaState["Objs2Spawn"] = 5;
43
44         luaState.DoString(lua);
45
46         //读取 Lua 中的数据
47         print("Read from lua: " + luaState["var2read"].ToString());
48
49         //获取 LuaTable 对象
50         LuaTable particles = (LuaTable)luaState["particles"];
51
52         //遍历播放粒子
53         foreach(ParticleSystem ps in particles.Values)
54         {
55             ps.Play();
56         }
57     }
58 }

下面看看Unity如何调用uLua中的函数:

 1 using UnityEngine;
 2 using System.Collections;
 3 using LuaInterface;
 4
 5 public class LuaTest : MonoBehaviour
 6 {
 7     private string lua = @"
 8             --定义一个函数
 9             function luaFunc(message)
10                 print(message)
11                 return 42
12             end
13         ";
14
15     void Start ()
16     {
17         LuaState luaState = new LuaState();
18         LuaScriptMgr._translator = luaState.GetTranslator();
19
20         //运行脚本确保函数已经创建
21         luaState.DoString(lua);
22
23         //获取函数
24         LuaFunction func = luaState.GetFunction("luaFunc");
25
26         //调用函数
27         object[] result = func.Call("I called a lua function!");
28
29         //获取结果
30         print(result[0]);
31     }
32 }

下面我们看看lua和U3D之间是如何相互传递数组:

 1 using UnityEngine;
 2 using System.Collections;
 3 using LuaInterface;
 4 using System;
 5
 6 public class LuaTest : MonoBehaviour
 7 {
 8     private string lua = @"
 9         --定义一个函数
10         function luaFunc(objs, len)
11             for i = 0, len - 1 do
12                 print(objs[i])
13             end
14             --返回一个列表
15             local table1 = {‘111‘, ‘222‘, ‘333‘}
16             return table1
17         end
18     ";
19
20     string[] objs = { "aaa", "bbb", "ccc" };
21
22     void Start ()
23     {
24         LuaScriptMgr luaMgr = new LuaScriptMgr();
25         LuaState luaState = luaMgr.lua;
26         luaState.DoString(lua);
27
28         //调用lua的函数获取返回值
29         LuaFunction f = luaState.GetFunction("luaFunc");
30         object[] rs = f.Call(objs, objs.Length);
31
32         //输出lua的返回值
33         LuaTable table = rs[0] as LuaTable;
34         foreach (DictionaryEntry de in table)
35         {
36             Debug.Log(de.Value);
37         }
38     }
39 }

接下来我们看看Lua里的协程:

 1 using UnityEngine;
 2 using System.Collections;
 3 using LuaInterface;
 4
 5 public class LuaCoroutines : MonoBehaviour {
 6
 7     private string script = @"
 8             --导入程序集
 9             luanet.load_assembly(‘UnityEngine‘)
10             --导入类型
11             local Time = luanet.import_type(‘UnityEngine.Time‘)
12
13             --使运行暂停指定的时间, 每帧调用
14             function waitSeconds(t)
15                 --获得结束时间
16                 local timeStamp = Time.time + t
17                 --时间没到就 yield 中断
18                 while Time.time < timeStamp do
19                     coroutine.yield()
20                 end
21             end
22
23             --外部调用的方法
24             function myFunc()
25                 print(‘Coroutine started‘)
26                 local i = 0
27                 for i = 0, 10, 1 do
28                     print(i)
29                     waitSeconds(1)
30                 end
31                 print(‘Coroutine ended‘)
32             end
33         ";
34
35     private LuaThread co = null;
36
37     void Start () {
38         LuaState l = new LuaState();
39         LuaScriptMgr._translator = l.GetTranslator();
40
41         //创建函数
42         l.DoString(script);
43
44         //获取函数
45         LuaFunction f = l.GetFunction("myFunc");
46
47         //创建协同程序
48         co = new LuaThread(l, f);
49
50         //启动协同程序
51         co.Start();
52     }
53
54     void Update () {
55         if( !co.IsDead() )
56         {
57             //协同程序需要每帧进行调用
58             co.Resume();
59         }
60         else
61         {
62             print("Coroutine has exited.");
63
64             //清除协同程序
65             co = null;
66         }
67     }
68 }
时间: 2024-08-02 09:24:07

uLua学习总结的相关文章

ulua学习资料及问题解决方案

ulua群里的一些资料,转过来方面查看 ulua学习顺序.请根据自身了解的知识入座. 初级:SimpleFramework框架 中级:ulua插件.cstolua 高级:底层库编译. 框架的角色定位分为2种, 第一种,对于有框架的大厂,它就是个使用ulua+cstolua的一个比较完整的demo. 第二种,对于没有框架的同学,可以自己基于它修改.扩展. wrap就是c#类提供给lua用的接口文件 attempt to index global 'System' (a nil) 刚下载后,需要做两

uLua 学习笔记 之一 lua脚本 打包与读取

最近要学习热更新,搜了下,选择了ulua这个插件,本人也是新人.对这个插件也是一知半解,不过幸好加了专门讨论这一块的群,这个群的技术氛围还是很浓重的,特别是已经形成了一套自己的lua学习框架.最近周末就抽空研究了一下. 群号这里分享一下给大家 Unity3D&uLua技术交流群 341746602 开始这篇我希望你对热更新有一定了解,并且对ulua有初步的尝试. 一.打包 lua的后缀是不被支持打包进assertbundle的,所以我们一般把 .lua后缀 变为.lua.txt 或者 .lua.

[Unity热更新]ulua学习笔记01:一个小坑

看了一下以前写的文章,发现都好水啊..我也想写出能真正帮到别人的文章,但没办法啊,自己的脑子太笨了..希望可以通过不断学习,终有一天能写出点好文章! 最近在学习unity中的热更新,既然大神都说ulua效率最高(就现在来说),那就学习ulua吧!首先要下载的是ulua的包,现在的最新版本是1.08,而且根据官网上说的,网上流行的1.03/1.05含有大量的bug,所以我选择了最新的版本,谁知道就掉进了第一个坑! 因为是菜鸟,所以先复制一下网上的代码看看效果如何,结果碰到这样的错误: 搜索了这些错

uLua学习之调用Lua函数(五)

前言 在我开始这个系列的第一篇文章中,我就提到了Lua脚本用来实现宿主脚本的配置性和扩展性.上节说到的调用外部Lua脚本就对应了它的两大特性之一的配置性,那么另一大特性如何来体现呢?这就要说我们今天的话题了:Lua函数.uLua插件是用来解决unity3d热更新的方案,在我们需要对宿主程序做一些局部逻辑上的修改时,Lua函数就变得至关重要.那么如何在uLua中来调用Lua函数呢,现在就来看看吧!我们将通过两个例子来了解如何调用Lua函数. 第一个例子 首先,这个例子的函数是非常简单的,所以我们就

uLua学习之数据交互(三)

前言 在上节中,大概谈了一下如何在lua脚本中调用unity3d中的方法来创建游戏物体,这只是很小的一个方面,uLua的优势在于对unity3d中C#语言的扩展和定制.那么如何扩展和定制呢?其中的数据交互想必是重中之重.今天就来看一下,如何在unity3d的C#脚本中读取Lua脚本中的变量值吧! 相关代码 这是在NotePad++中展示的Lua脚本文件,我个人很喜欢NotePad++这个文本编辑器,以后我们的Lua脚本也是要在这个软件中编辑的,推荐给大家使用,比起记事本什么的要好用多了(点我查看

uLua学习笔记(三):Unity3D和Lua之间的相互调用

这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方法还是比较简单的,所以先说这个,由于这部分在学习笔记(一)中已经说的挺多的了,更多的内容点击这里回去看,所以这里我们就来看一个简单的示例即可: 1 using LuaInterface; 2 using UnityEngine; 3 4 public class UnityCallLua : Mon

unity3d热更新插件uLua学习整理

前言 IOS不能热更新,不是因为不能用反射,是因为System.Reflection.Assembly.Load 无法使用System.Reflection.Emit 无法使用System.CodeDom.Compiler 无法使用这三个不能用,就把传统dotnet动态路径坑死了为啥“这三个不能用,就把传统dotnet动态路径坑死了”呢动态载入dll或者cs的方法就这几个, IOS 下不能动态载入dll或者cs 文件,已经编译进去的没事.=============================

uLua学习之HelloWorld(一)

前言 好久都没有写过文章了,现在正好在看有关unity3d的热更新方案,在网上找了很久,发现了ulua这个插件,感觉还是不错的,反正自己是个初学者,多了解一些知识应该是没有什么问题的.说起ulua,就不能不提及lua这个大名鼎鼎的脚本语言,这是一个很小巧的语言,并没有提供大多繁杂的功能,因为它并不是一个独立的语言,但是它可以很方便的嵌入到其它的程序语言中,实现可配置性和可扩展性.由于lua的优良特性,很多游戏都用它来做脚本,十分方便和精巧.有关lua的详细情况,大家可以去网上了解,资料很多. 这

【Lua学习笔记之:Lua环境搭建 Windows 不用 visual studio】

Lua 环境搭建 Windows 不用 visual studio 系统环境:Win7 64bit 联系方式:[email protected] 前言: 最近需要学习Unity3d游戏中的热更新技术,选择ULua方案,因此准备学习一些Lua的基础知识.之前在Ubuntu上曾经写过Lua版本的"HelloWorld", 但那时的环境搭建只需要下载源码,然后 make & make install 就可以了,但一到Windows下就完全不会做了.经过网络查找对比,得到目前自认为较好