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 Spannable
ApiDemo 源码至 com.example.android.apis.text.Link 类. 首先,看一下其运行效果: 要给 TextView 加上效果,方式主要有几种: 第一种,自动应用效果, ...
- XMPP聊天客户端环境搭建
1.服务器选择:ejabberd,具体安装过程请参考:http://blog.csdn.net/linhanmin/article/details/9876819 2.客户端配置: 采用xmppfra ...
- 如何完全卸载VS2010
1.首先用360卸载,当卸载完成后,提示有残余的话,就强力清除 2,接着,下载IobitUninstaller工具 3.按照下面进行卸载 1.Microsoft .NET Framework 4 框架 ...
- 如何将一个Form中的代码拆分到多个文件中
https://social.msdn.microsoft.com/Forums/en-US/64c77755-b0c1-4447-8ac9-b5a63a681b78/partial-class-fo ...
- uva 489 Hangman Judge(水题)
题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&am ...
- 两个STL网址 总结的很好 && c++堆的网址
http://www.cnblogs.com/bigcat814/ http://blog.sina.com.cn/s/blog_7065a9de010154ve.html 堆 http://www. ...
- [原]Unity3D深入浅出 - 常见三维软件与Unity3D的单位比例
Unity3d系统默认单位是米 Maya:Unity3D 1M:100M 3DMax:Unity3D 100M:1M Cinema 4D:Unity3D 1M:100M Lightwavew:Uni ...
- linux 读取input输入设备demo
/******************************************************************* * linux 读取input输入设备demo * 说明: * ...
- 【原创】 Shuffling
在机器学习领域中,经常会听到“shuffling"这个术语.那么,shuffling到底是什么意思呢. 通常,shuffling指的是在SGD怎样依赖训练数据输入顺序的算法中,将训练数据随机 ...
- (转)INSTALLSHIELD 2010 预安装组件和软件
使用Installshield2010提供的组件 大家再开发软件产品的时候经常是基于某些软件和类库的,像我们的项目就用到了.Net Framework3.5,mapinfo,sqlserver 200 ...