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

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

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

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

 using UnityEngine;
using System.Collections;
using LuaInterface; public class LuaTest : MonoBehaviour
{
void Start ()
{
LuaState luaState = new LuaState();
luaState.DoString("print('hello world 世界')");
}
}

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

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

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

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

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

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

 using UnityEngine;
using System.Collections;
using LuaInterface; public class LuaLoadFileTest : MonoBehaviour
{
void Start ()
{
TextAsset luaString = Resources.Load<TextAsset>("Test.lua"); LuaState luaState = new LuaState();
luaState.DoString(luaString.text);
}
}

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

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

 using UnityEngine;
using System.Collections;
using LuaInterface; public class LuaTest : MonoBehaviour
{
private string lua = @"
--加载模块
luanet.load_assembly('UnityEngine')
luanet.load_assembly('Assembly-CSharp') --导入 Unity3D 的类
Util = luanet.import_type('Util')
GameObject = luanet.import_type('UnityEngine.GameObject') --创建一个新的 GameObject 对象
local newGameObj = GameObject('NewObj')
--添加粒子组件
Util.AddComponent(newGameObj, 'UnityEngine', 'ParticleSystem')
"; void Start ()
{
LuaState luaState = new LuaState();
LuaScriptMgr._translator = luaState.GetTranslator();
luaState.DoString(lua);
}
}

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

 using UnityEngine;
using System.Collections;
using LuaInterface; public class LuaTest : MonoBehaviour
{
private string lua = @"
--加载模块
luanet.load_assembly('UnityEngine')
luanet.load_assembly('Assembly-CSharp') --导入 Unity3D 的类
Util = luanet.import_type('Util')
GameObject = luanet.import_type('UnityEngine.GameObject') --创建表
particles = {} --循环
for i = 1, Objs2Spawn, 1 do
--创建 GameObject 对象
local newGameObj = GameObject('NewObj' .. tostring(i))
--添加组件
local ps = Util.AddComponent(newGameObj, 'UnityEngine', 'ParticleSystem')
--暂停粒子播放
ps:Stop() --加入表
table.insert(particles, ps)
end --定义一个数据
var2read = 42
"; void Start ()
{
LuaState luaState = new LuaState();
LuaScriptMgr._translator = luaState.GetTranslator(); //赋值 Lua 中的数据
luaState["Objs2Spawn"] = ; luaState.DoString(lua); //读取 Lua 中的数据
print("Read from lua: " + luaState["var2read"].ToString()); //获取 LuaTable 对象
LuaTable particles = (LuaTable)luaState["particles"]; //遍历播放粒子
foreach(ParticleSystem ps in particles.Values)
{
ps.Play();
}
}
}

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

 using UnityEngine;
using System.Collections;
using LuaInterface; public class LuaTest : MonoBehaviour
{
private string lua = @"
--定义一个函数
function luaFunc(message)
print(message)
return 42
end
"; void Start ()
{
LuaState luaState = new LuaState();
LuaScriptMgr._translator = luaState.GetTranslator(); //运行脚本确保函数已经创建
luaState.DoString(lua); //获取函数
LuaFunction func = luaState.GetFunction("luaFunc"); //调用函数
object[] result = func.Call("I called a lua function!"); //获取结果
print(result[]);
}
}

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

 using UnityEngine;
using System.Collections;
using LuaInterface;
using System; public class LuaTest : MonoBehaviour
{
private string lua = @"
--定义一个函数
function luaFunc(objs, len)
for i = 0, len - 1 do
print(objs[i])
end
--返回一个列表
local table1 = {'111', '222', '333'}
return table1
end
"; string[] objs = { "aaa", "bbb", "ccc" }; void Start ()
{
LuaScriptMgr luaMgr = new LuaScriptMgr();
LuaState luaState = luaMgr.lua;
luaState.DoString(lua); //调用lua的函数获取返回值
LuaFunction f = luaState.GetFunction("luaFunc");
object[] rs = f.Call(objs, objs.Length); //输出lua的返回值
LuaTable table = rs[] as LuaTable;
foreach (DictionaryEntry de in table)
{
Debug.Log(de.Value);
}
}
}

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

 using UnityEngine;
using System.Collections;
using LuaInterface; public class LuaCoroutines : MonoBehaviour { private string script = @"
--导入程序集
luanet.load_assembly('UnityEngine')
--导入类型
local Time = luanet.import_type('UnityEngine.Time') --使运行暂停指定的时间, 每帧调用
function waitSeconds(t)
--获得结束时间
local timeStamp = Time.time + t
--时间没到就 yield 中断
while Time.time < timeStamp do
coroutine.yield()
end
end --外部调用的方法
function myFunc()
print('Coroutine started')
local i = 0
for i = 0, 10, 1 do
print(i)
waitSeconds(1)
end
print('Coroutine ended')
end
"; private LuaThread co = null; void Start () {
LuaState l = new LuaState();
LuaScriptMgr._translator = l.GetTranslator(); //创建函数
l.DoString(script); //获取函数
LuaFunction f = l.GetFunction("myFunc"); //创建协同程序
co = new LuaThread(l, f); //启动协同程序
co.Start();
} void Update () {
if( !co.IsDead() )
{
//协同程序需要每帧进行调用
co.Resume();
}
else
{
print("Coroutine has exited."); //清除协同程序
co = null;
}
}
}

uLua学习笔记(一):uLua安装及上手的更多相关文章

  1. PHP学习笔记----IIS7下安装配置php环境

    原文:PHP学习笔记----IIS7下安装配置php环境 Php如何安装 Php版本的选择 Php在windows下的(php5.4.7)有两种版本: VC9 x86 Non Thread Safe ...

  2. openresty 学习笔记一:环境安装

    openresty 学习笔记一:环境安装 openresty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭 ...

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

    这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方 ...

  4. ulua学习笔记(二):官方资料及问题解决方案

    uLua&SimpleFramework入门视频教程网盘地址 视频教程地址 http://pan.baidu.com/s/1gd8fG4N游戏框架地址 https://github.com/j ...

  5. 学习笔记--Grunt、安装、图文详解

    学习笔记--Git安装.图文详解 安装Git成功后,现在安装Gruntjs,官网:http://gruntjs.com/ 一.安装node 参考node.js 安装.图文详解 (最新的node会自动安 ...

  6. Python3学习笔记01-环境安装和运行环境

    最近在学习Python3,想写一些自己的学习笔记.方便自己以后看,主要学习的资料来自菜鸟教程的Python3教程和廖雪峰官方网站的Python教程. 1.下载 1)打开https://www.pyth ...

  7. 树莓派学习笔记——apt方式安装opencv

    0.前言     本文介绍怎样在树莓派中通过apt方式安装opencv.并通过一个简单的样例说明怎样使用opencv. 相比于源码方式安装opencv,通过apt方式安装过程步骤简单些,消耗的时间也少 ...

  8. Git学习笔记--历史与安装(一)

    声明:今天起学习Git,第一篇学习笔记主要借鉴廖雪峰先生的个人博客,以及自己的实践所得. “本教程只会让你成为Git用户,不会让你成为Git专家”——引自廖雪峰博客. 一.Git简介 Git是目前世界 ...

  9. 学习笔记 - Sass的安装与使用手册

    最近因为工作需要,自学了Sass.现在将学习笔记整理在这里,供大家参考. 1. Sass的安装 Sass的编辑器安装方法有很多,大致能分为两种:应用程序(application)和命令行界面(comm ...

  10. Linux 学习笔记 2 Centos 安装与网络的配置以及VI编辑器的使用

    前言 当然,还是觉得Centos 在众多的Linux 发行版中,还是很有地位的,好多的服务器大多沿用的都是一代的Centos 因为它开源(这是废话)而且稳定,这才是服务器沿用的最重要的一项指标. 镜像 ...

随机推荐

  1. SGU 130

    SGU130,用k条弦将一个圆分成k+1份的方法数. #include <iostream> #include <vector> #include <string> ...

  2. HADOOP基本操作命令

    在这篇文章中,我们默认认为Hadoop环境已经由运维人员配置好直接可以使用. 假设Hadoop的安装目录HADOOP_HOME为/home/admin/hadoop. 启动与关闭 启动HADOOP 进 ...

  3. 通过dbms_xplan.display_cursor识别低效的执行计划

    dbms_xplan.display_cursor定义: function display_cursor(sql_id           varchar2 default  null,        ...

  4. Android开发之读写联系人

    读写联系人需要用到android的ContentProvider 同时需要读和写联系人的权限 需要使用到联系人数据库中的 * raw_contacts表: * contact_id:联系人id * d ...

  5. 如何写mysql的定时任务

     什么是事件: 一组SQL集,用来执行定时任务,跟触发器很像,都是被动执行的,事件是因为时间到了触发执行,而触发器是因为某件事件(增删改)触发执行: 查看是否开启: show variables li ...

  6. 函数fseg_create_general

    申请一个段 /**********************************************************************//** Creates a new segm ...

  7. Unity3D集成SVN进行版本控制

    首先,AssetServer确实很好用,Unity内部集成的管理界面,操作很简单,提交冲突的后还可以进行文件比对.但学习使用过程中,发现文件体积较大的项目文件目录(600M),我提交不上去,会返回没有 ...

  8. mssql查找备注(text,ntext)类型字段为空的方法

    在sql语句中,如果查找某个文本字段值为空的,可以用select * from 表 where 字段='' ,但是如果这个字段数据类型是text或者ntext,那上面的sql语句就要出错了. 解决办法 ...

  9. 将archlinux 2013-06-01版,安装配置为个人工作站

    本文安装所使用的镜像为:archlinux-2013.06.01-dual.iso.首先请看看我安装完成之后的效果.图一,是第一个虚拟桌面及右键菜单图: 图二,是第二个虚拟桌面效果图.后几个虚拟桌面图 ...

  10. 我的电脑在用Microsoft Script Editor 调试,关不了?

    是不是上网后经常出现错误提示框,那在浏览器的工具选“internet选项”进入“高级”在“禁用脚本调试(internet explor)”和“禁用脚本调试”前勾上.Microsoft Script E ...