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 因为它开源(这是废话)而且稳定,这才是服务器沿用的最重要的一项指标. 镜像 ...
随机推荐
- WAMP 80端口被Microsoft-HTTPAPI/2.0占用的解决办法
WAMP 80端口被Microsoft-HTTPAPI/2.0占用的解决办法 - likebeta - 博客园 http://www.cnblogs.com/likebeta/archive/2012 ...
- 利用CCProxy管理小型企业的上网行为
本实验以实例方式,从操作条件.背景.需求.以及具体要求的几个部分进行说明. 1. 操作条件: 装有Windows Server 2003系统,安装了代理服务程序的虚拟机一台 2. 背景: 为了提高员工 ...
- knowledge about apache
http://wenku.baidu.com/link?url=6O51BQJdtFRFWDGszKfN3aK7IY92QTCpuc7miBhRLazXvxL5gXb18B_TqIdi3EruX1o_ ...
- NFC(6)NFC编程的几个重要类,NFC硬件启动android应用原理
用于NFC编程的几个重要类 Tag NFC 标签 NfcAdapter Nfc 的适配类 NdefMessage 描述NDEF格式的信息 NdefRecord 描述NDEF信息的一个信息段,类似tab ...
- C# List中写出LINQ类似SQL的语句
很多时候,从一个关系表中挑出一个我们需要的元素列表采用SQL语句是再容易不过的了,其实C#的List中也可以采用类似的方法,虽然List中集成了Select(), Where()等语句,不过如果你的判 ...
- 【HDOJ】4351 Digital root
digital root = n==0 ? 0 : n%9==0 ? 9:n%9;可以简单证明一下n = a0*n^0 + a1*n^1 + ... + ak * n^kn%9 = a0+a1+..+ ...
- JDK_Proxy_InvocationHandler_动态代理
本文用jdk动态代理模拟了spring的AOP的实现技术 AOP面向切面编程,可用于权限验证,效率检查,事务,异常管理等 JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Pr ...
- 函数buf_LRU_free_from_common_LRU_list
/******************************************************************//** Try to free a clean page fro ...
- WP8触摸感应Manipulation的操作
触控感应不同事件的处理: 可将以下三个事件,绑定到一个控件中. /// <summary> /// 触摸开始事件 /// </summary> /// <param na ...
- html的视频插件 (转)
1)jMedia Element是一个基于jQuery/jQuery UI实现的HTML5音频/视频开发工具包.提供非常多的功能来控制页面中的音频和视频内容.当旧的浏览器不兼容HTML5时, ...