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 因为它开源(这是废话)而且稳定,这才是服务器沿用的最重要的一项指标. 镜像 ...
随机推荐
- Android工具:延展图片NinePatch
NinePatch能够对.png图片进行处理,生成一个.9.png格式的图片,图像拉伸操作时,图片就会有失真,而.9.png是Android里所支持的一种特殊的图片格式,可以实现部分拉伸. 制作图片方 ...
- 配置SQL Server 2008服务器
怎么配置SQL Server 2008服务器_百度经验 http://jingyan.baidu.com/article/9faa7231a922c1473c28cb23.html 1.验证安装是否成 ...
- 最受欢迎的5个Android ORM框架
在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...
- Android 内核初识(1)下载源码需求与教程
官方文档: http://source.android.com/source/requirements.html Requirements The Android build is routinel ...
- 一个解决方案下的多个项目共享一个AssemblyInfo
http://stackoverflow.com/questions/18963750/add-file-as-a-link-on-visual-studio-debug-vs-publish htt ...
- p2p穿透技术
ios 怎么和wifi外设摄像头实时传输视频 ios 控制wifi摄像头外设的拍照.录像.删除照片等等都可以通过tcp/ip 发送定义好的json指令实现. 但是不知道怎么和wifi外设摄像头实时传输 ...
- bzoj1025: [SCOI2009] 游戏 6
DP. 每种排法的长度对应所有循环节长度的最小公倍数. 所以排法总数为和为n的几个数的最小公倍数的总数. #include<cstdio> #include<algorithm> ...
- ejabberd源码流程梳理
ejabberd的工程主要通过ejabberd.app 组织起来 ejabberd.erl : application:start(ejabberd). ejabberd_app.erl: Mod:s ...
- SharePoint 2010 master page 控件介绍(5):其他
转:http://blog.csdn.net/lgm97/article/details/6409227 <!-- 处理搜索按下"enter"键和点击后退按钮 --> ...
- Entity Framework 数据生成选项DatabaseGenerated
在EF中,我们建立数据模型的时候,可以给属性配置数据生成选项DatabaseGenerated,它后有三个枚举值:Identity.None和Computed. Identity:自增长 None:不 ...