SLua
安装
1.下载最新版,将Assets目录里的所有内容复制到工程中,对于最终产品,可以删除例子,文档等内容,如果是开发阶段则无所谓。
2.等待unity编译完毕,如果一切顺利的话,将出现SLua菜单,点击SLua菜单中All->Make命令,手动生成针对当前版本的U3d接口文件。
3.每次更新SLua版本,务必记得All->Clear,然后All->Make,否则可能运行不正确。
LuaState状态机对象执行Lua字符串
using UnityEngine;
using System.Collections;
using SLua; public class AppDelegate : MonoBehaviour { private static LuaState ls_state = new LuaState(); void Start () {
ls_state.doString("print(\"SLua Hello!\")");
} }
使用LuaState状态机对象执行Lua脚本文件HelloLua.lua
在Resources文件夹下添加HelloLua.lua文件
print("Lua Script:HelloLua")
设置LuaState.loaderDelegate启动文件委托代理
using UnityEngine;
using System.Collections;
using SLua;
using System.IO; public class AppDelegate : MonoBehaviour { void Start () { //设置脚本启动代理
LuaState.loaderDelegate = ((string fn)=>{ //获取脚本启动代理
string file_path = Directory.GetCurrentDirectory() + "/Assets/Resources/" + fn; Debug.Log("file_path:" + file_path); return File.ReadAllBytes(file_path);
}); } }
通过LuaState对象执行HelloLua.lua脚本
using UnityEngine;
using System.Collections;
using SLua;
using System.IO; public class AppDelegate : MonoBehaviour { void Start () { //设置脚本启动代理
LuaState.loaderDelegate = ((string fn)=>{ //获取脚本启动代理
string file_path = Directory.GetCurrentDirectory() + "/Assets/Resources/" + fn; Debug.Log("file_path:" + file_path); return File.ReadAllBytes(file_path);
}); //设置执行脚本
LuaState ls_state = new LuaState();
ls_state.doFile("HelloLua.lua");
} }
通过LuaState对象获取并执行HelloLua.lua脚本中的一个函数
HelloLua.lua
function sum( v1, v2)
return v1 + v2
end
function mul( v1, v2)
return v1 * v2
end
AppDelegate.cs
using UnityEngine;
using System.Collections;
using SLua;
using System.IO;
using System;
using LuaInterface; public class AppDelegate : MonoBehaviour { //添加LuaState初始化时的回调函数特性函数
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
protected static int init(IntPtr L)
{
//设置初始化LuaObject对象
LuaObject.init(L);
return ;
} void Start () { //创建状态机对象
LuaState ls_state = new LuaState(); //设置脚本启动代理
LuaState.loaderDelegate = ((string fn)=>{ //获取脚本启动代理
string file_path = Directory.GetCurrentDirectory() + "/Assets/Resources/" + fn; Debug.Log("file_path:" + file_path); return File.ReadAllBytes(file_path);
}); //初始化LuaState状态机与c#的转换对象
LuaState.pcall(ls_state.L, init); //设置执行脚本
ls_state.doFile("HelloLua.lua"); //获取脚本中的mul函数
LuaFunction mul = ls_state.getFunction("mul"); //调用该函数并且接收返回值
double result = (double)mul.call(-, ); Debug.Log(result);
} }
注:如出现`SLua.LuaState.pcall(System.IntPtr, LuaInterface.LuaCSFunction)' is inaccessible due to its protection level异常,进去看下pcall的定义,把internal修改为public即可。
自定义c#队形LOHuman.cs,在Hello.lua中
LOHuman.cs
using LuaInterface;
using SLua;
using System;
using UnityEngine;
using System.Collections; [CustomLuaClassAttribute]
public class HHHuman : MonoBehaviour
{
//年龄成员
protected int age = ; //姓名成员
protected string name = ""; //添加Lua代码中的静态函数
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
[StaticExport]
static public int CreateHuman(IntPtr l)
{
HHHuman item = new HHHuman();
LuaObject.pushObject(l, item); return ;
} public string speak(string str)
{
string speakStr = "speak:";
if (str!=null)
speakStr += str;
return speakStr;
} public int Age
{
set;
get;
} public string Name
{
set;
get;
}
}
通过点击菜单栏中的SLua->Custom->Clear将旧版本的自定义类删除。
通过点击菜单栏中的SLua->Custom->Make重新制作适用于SLua的新的自定义类Lua_HHHuman.cs。
默认存放目录Assets->SLua->LuaObject->Custom->。
在HelloLua.lua脚本中,调用c#中的自定义类的静态函数CreateHuman()。
function main()
local human = HHHuman.CreateHuman()
print("human.Age: ",human.Age)
print("human.speak: ",human:speak("hi"))
end
在AppDelegate.cs的Start函数中,调用HelloLua.lua脚本中的main函数
using UnityEngine;
using System.Collections;
using SLua;
using System.IO;
using System;
using LuaInterface; public class AppDelegate : MonoBehaviour { LuaSvr l;
void Start () { l = new LuaSvr();
l.start("HelloLua"); } }
SLua的更多相关文章
- ulua slua 下载地址
ulua http://www.yanyulin.info/pages/2015/01/27193946190814.html http://www.manew.com/blog-27966-25 ...
- Unity 官方 Demo: 2DPlatformer 的 SLua 版本。
9月份时,趁着国庆阅兵的假期,将 Unity 官方 Demo: 2DPlatformer 移植了一个 SLua 版本,并放在了我的 GitHub 账号下:https://github.com/yauk ...
- SLua 中使用 Lua 5.3 的编译工程
2016-03-05 更新: 之前编译的库,在 Android 下 Lua_Number 和 Lua_Integer 被编译为了32位,导致从 C# 到 Lua 过程中有64位到32位整型转换会出现溢 ...
- 在 slua 中使用更新的面向对象方案
上一篇记录了我使用 Slua.Class 来实现面向对象扩展 C# 中得类,但实际使用中,更多地情况是直接在 lua 中定义基类然后扩展,于是触发了我重新思考下是否两种形式应该统一用一种,目前的方案中 ...
- SLua 中继承 C# 类接口 Slua.Class 的一个 Bug。
由于目前要把大量的代码移植到 lua 中(真是够虐心的),面向对象肯定少不了,项目的代码都是这么设计的,于是就测试 Slua.Class 接口来扩展 C# 的类,发现有点问题,给作者提交了一个 Iss ...
- slua 中使用 lua5.3
因为我们服务器极有可能要迁移到 skynet 上,它基于 lua5.3,而服务器和客户端会公用很多lua代码,所以在考虑在客户端 slua 中使用 lua5.3. 经过编译后,发现 slua 对 lu ...
- 使用Slua框架开发Unity项目的重要步骤
下载与安装 下载地址 GitHub 安装过程1.下载最新版,这里, 解压缩,将Assets目录里的所有内容复制到你的工程中,对于最终产品,可以删除slua_src,例子,文档等内容,如果是开发阶段则无 ...
- Unity SLua 如何调用Unity中C#方法
1.原理 就是通常在Lua框架中所说的,开放一个C#的web接口,或者叫做在Slua框架中注册函数. 2.作用 在Lua中调用C#中的方法,这个是在做热更新中很常用的一种方法,无论是slua,还是lu ...
- unity slua整合帅气的lua-pb解析protobuf
了解到lua的一个protobuf库,接口帅气,比之前用过的一些lua protobuf库要好很多,深得我心.而且能保持更新,比其他库几年没更新要放心. lua-pb动态解析protobuf协议,无需 ...
随机推荐
- Nodepad ++
Nodepad ++是一个很好用的记事本工具.轻巧.打开文本速度要比windows内置的记事本快,而且功能众多. 支持多种语言,关键字高亮显示 并且可以折叠 内置n种主题,随时换 文件内容一变随时提醒 ...
- iOS常见文件及程序的启动原理
一. iOS中常见文件 (一). Xcode6之前 创建项目,默认可以看见一个存放框架的文件夹 info文件以工程文件名开头,如:第一个项目-Info.plist 项目中默认有一个PCH文件 (二). ...
- eclipse安装插件的方法,以python为例子
一 转载自:http://www.cnblogs.com/linzhenjie/articles/2639113.html 1.基本需求 1.Eclipse 集成开发环境下载 http://115.c ...
- ios运行某些工程时屏幕上下出现黑边的解决办法
今天准备了解下MVVM设计模式,于是就从GitHub上Down了一个MVVM的demo(地址在这)学习,下载之后,在模拟器上运行一下,出现如下图上下有黑边,以前也遇到过这个问题,但当时没有记录,现在还 ...
- 关于SWT中的GridLayout布局方式
GridLayout 布局的功能非常强大,也是笔者常用的一种布局方式.GridLayout是网格式布局,它把父组件分成一个表格,默认情况下每个子组件占据一个单元格的空间,每个子组件按添加到父组件的顺序 ...
- 关于JFace中的对话框MessageDialog类等其它类型对话框
对话框是软件系统中最常用到的界面,对话框无处不在,从界面结构来说,对话框主要是由主体的界面组件和底部窗体按钮组成. 之前的例子中已经频繁的使用到了MessageDialog.openInformati ...
- C语言的一些误用和知识总结
现在学嵌入式的话,最主要是要把C语言熟悉,比如指针,链表,共用体,结构体等,还是得听老师的话.. 在学习单片机的时候才真正知道C语言是什么它是来干什么的~但是C语言用到嵌入式只是它小小的一部分他的应用 ...
- PS定位
一.定位:按标准看谁离得近来进行覆盖:什么都没有(最远).浮动(远).定位(近) 二.position absolute 绝对定位,能堆叠在上一层下面,脱离文档流 relative 相对定位,按 ...
- MongoDB 的分组操作 In C#
C#对mongodb的分组查询操作,主要通过脚本或Aggregate方法来实现,以下通过一些实例作解析: 参考资料:http://www.tuicool.com/articles/2iqUZj h ...
- Android开发之万能适配器
ListView.GridView等等非常多的东西都需要适配器.而如果开发一个app每一个listview都有写一个Adapter的话,那还怎么愉快的玩游戏.. 什么是ViewHolider以及的用法 ...