uLua学习笔记(一):uLua安装及上手
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安装及上手的更多相关文章
- PHP学习笔记----IIS7下安装配置php环境
原文:PHP学习笔记----IIS7下安装配置php环境 Php如何安装 Php版本的选择 Php在windows下的(php5.4.7)有两种版本: VC9 x86 Non Thread Safe ...
- openresty 学习笔记一:环境安装
openresty 学习笔记一:环境安装 openresty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭 ...
- uLua学习笔记(三):Unity3D和Lua之间的相互调用
这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方 ...
- ulua学习笔记(二):官方资料及问题解决方案
uLua&SimpleFramework入门视频教程网盘地址 视频教程地址 http://pan.baidu.com/s/1gd8fG4N游戏框架地址 https://github.com/j ...
- 学习笔记--Grunt、安装、图文详解
学习笔记--Git安装.图文详解 安装Git成功后,现在安装Gruntjs,官网:http://gruntjs.com/ 一.安装node 参考node.js 安装.图文详解 (最新的node会自动安 ...
- Python3学习笔记01-环境安装和运行环境
最近在学习Python3,想写一些自己的学习笔记.方便自己以后看,主要学习的资料来自菜鸟教程的Python3教程和廖雪峰官方网站的Python教程. 1.下载 1)打开https://www.pyth ...
- 树莓派学习笔记——apt方式安装opencv
0.前言 本文介绍怎样在树莓派中通过apt方式安装opencv.并通过一个简单的样例说明怎样使用opencv. 相比于源码方式安装opencv,通过apt方式安装过程步骤简单些,消耗的时间也少 ...
- Git学习笔记--历史与安装(一)
声明:今天起学习Git,第一篇学习笔记主要借鉴廖雪峰先生的个人博客,以及自己的实践所得. “本教程只会让你成为Git用户,不会让你成为Git专家”——引自廖雪峰博客. 一.Git简介 Git是目前世界 ...
- 学习笔记 - Sass的安装与使用手册
最近因为工作需要,自学了Sass.现在将学习笔记整理在这里,供大家参考. 1. Sass的安装 Sass的编辑器安装方法有很多,大致能分为两种:应用程序(application)和命令行界面(comm ...
- Linux 学习笔记 2 Centos 安装与网络的配置以及VI编辑器的使用
前言 当然,还是觉得Centos 在众多的Linux 发行版中,还是很有地位的,好多的服务器大多沿用的都是一代的Centos 因为它开源(这是废话)而且稳定,这才是服务器沿用的最重要的一项指标. 镜像 ...
随机推荐
- Python之异常篇 [待更新]
简介 当你的程序中出现某些 异常的 状况的时候,异常就发生了.例如,当你想要读某个文件的时候,而那个文件不存在.或者在程序运行的时候,你不小心把它删除了.上述这些情况可以使用异常来处理. 假如你的程序 ...
- svn:revert to this version 和 revert changes from this version的区别 假设我们有许多个版本,版本号分别是1-10
假设我们有许多个版本,版本号分别是1-10 如果我们在7这里选择revert to this version那么7之后的8,9,10的操作都会被消除 如果在7选择revert changes from ...
- Android 签名(4)验证是否签名
判断Apk是否签名 用命令:jarsigner -verify XXX.apk 增加 -verbose -certs 两个选项可显示更多信息. 如果有Android Debug字樣就是debug 如 ...
- C#中string.Format()和ToString()格式化方法
C#数字格式化输出是我们在编程中经常需要处理的事情,那么这里向你介绍了一些C#数字格式化输出的例子,这样就会方便你来选择和比较,什么方式是比较适合自己项目的. int a = 12345678; C# ...
- 【转】如何下载并编译Android4.0内核源码goldfish(图文)
原文网址:http://blog.csdn.net/flydream0/article/details/7070392 关于如何下载Android4.0源码,请查看我的博客内另一篇文章(同样是图文教程 ...
- iOS--跳转到APPstore评分
本代码适用于iOS7之后的版本: NSString *str = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/app/ ...
- 【JMeter】JMeter使用plugins插件进行服务器性能监控
性能测试时,我们的关注点有两部分 1 服务本身:并发 响应时间 QPS 2 服务器的资源使用情况:cpu memory I/O disk等 JMeter的plugins插件可以实现对"二&q ...
- 【译】 AWK教程指南 7AWK应用实例
本节将示范一个统计上班到达时间及迟到次数的程序. 这程序每日被执行时将读入两个数据文件: * 员工当日到班时间的数据文件 ( 如下列的 arr.dat ) * 存放员工当月迟到累计次数的文件 当程序执 ...
- 【译】 AWK教程指南 6在AWK程序中使用Shell命令
awk程序中允许调用Shell指令,并提供管道解决awk与系统间数据传递的问题.所以awk很容易使用系统资源,读者可利用这个特点来编写某些适用的系统工具. 范例:写一个awk程序来打印出线上人数. 将 ...
- 问题与对策:CSS的margin塌陷(collapse)
1: <!DOCTYPEHTML PUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN"> 2: <html> 3: & ...