Unity3d中使用Lua
对于手机游戏,如果可以在线更新以实现bug修复、新功能添加等等,其好处自不必多说。
通过C#的反射机制,也可以实现某种程度上的脚本级更新,具体可以参考
http://docs.unity3d.com/Documentation/Manual/scriptsinassetbundles.html
但其中也明确指出了在iOS上不支持反射。所以很自然的,想到使用Lua、Python等脚本语言来解决需求。撇开Python不讲(感兴趣的可以搜索UniPython),来看Lua。
因为Lua本身使用C语言实现,具有良好的跨平台特性,但我们使用C#来作为主要开发语言,要实现与Lua的混合开发,最好是有一个C#版的Lua。万能的google的帮我找到了UniLua(https://github.com/xebecnan/UniLua),特别感谢其作者xebecnan。PS:xebecnan貌似是云风(云风BLOG)团队的,当看到UniLua是国人实现的,且云风的Unity3d项目也在使用时,便立刻决定试一下:)
在现在这个项目之前,几乎没有任何的Lua使用经验,完全是从开始。国内关于Lua的书籍和资料貌似都很少,书的话官方的《Lua程序设计》必读,《Lua游戏开发实践指南》也可以快速翻一翻。个人觉得有用的资源还有:
官方的参考手册-居家旅行必备:http://www.lua.org/manual/5.2/
简明教程 http://coolshell.cn/articles/10739.html
Lua与C++的混合编程入门 http://blog.csdn.net/jason3/article/details/5653487
关于如何在Unity3d中使用UniLua,wiki上面已经讲的非常清晰了。其中也讲到了如何在Lua中调用C#,不过仅给出了调用静态成员函数的示例,而我仅在此记录一下如何在Lua调用C#中的非静态成员函数。
现有C#中的People类如下
public class People
{
public People(int age)
{
Age = age;
} public int Age
{
get;
set;
} public bool IsYounger(People other)
{
return (Age < other.Age);
}
}
如何在lua中调用People的成员函数IsYounger?
1. 如何访问C#的对象:使用 light userdata,即使用UniLua提供的 PushLightUserData() 和 ToUserData()
2. 如何访问C#的成员函数:主要是利用PushCSharpFunction() 接口,但过程略麻烦一些。
2.1 将C#类中的成员函数都封装为静态成员函数(后附示例代码)
2.2 将上面的静态成员函数设置为lua的全局变量,以在lua中调用
示例代码:
public class PeopleLuaWrapper
{
const string CLASS_NAME = "People"; public static void RegisterCSharpMethod(ILuaState lua)
{
lua.NewTable();
int method_table = lua.GetTop(); lua.PushString("IsYounger");
lua.PushCSharpFunction(IsYounger);
lua.SetTable(method_table); //将函数设置为table的一个元素 lua.SetGlobal(CLASS_NAME); //设置名为CLASS_NAME的全局表
} //! 将原成员函数重新封装为静态成员函数
private static int IsYounger(ILuaState lua)
{
People invoker = (People)lua.ToUserData(); //获取成员函数的调用者
People other = (People)lua.ToUserData(); //获取成员函数的参数
lua.Pop(); bool is_younger = invoker.IsYounger(other);
lua.PushBoolean(is_younger); //将函数结果压栈 return ;
}
}
lua中调用C#成员函数:
local function Lua_IsYounger(pa, pb)
is_younger = People.IsYounger(pa, pb)
return is_younger
end return
{
Lua_IsYounger = Lua_IsYounger,
}
在C#中调用lua代码:
ILuaState lua = LuaAPI.NewState();
lua.L_OpenLibs(); PeopleLuaWrapper.RegisterCSharpMethod(lua); People pa = new People();
People pb = new People(); var status = lua.L_DoFile("People.lua"); lua.GetField(-, "Lua_IsYounger");
lua.PushLightUserData(pa);
lua.PushLightUserData(pb);
lua.Call(, ); bool is_younger = lua.ToBoolean(-);
示例代码毫无实用意义,但应该足以说明如何实现C#与Lua之间的互相调用。
本人纯粹Lua新手,这种做法也不知是否合理,或者有更简便的实现方法,请指教。
Unity3d中使用Lua的更多相关文章
- 在Unity3d中解析Lua脚本的方法
由于近期项目中提出了热更新的需求,因此本周末在Lua的陪伴下度过.对Lua与Unity3d的搭配使用,仅仅达到了一个初窥门径的程度,记录一二于此.水平有限,欢迎批评指正. 网络上关于Lua脚本和Uni ...
- Unity3D中的Coroutine详解
Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutin ...
- [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)
---------------------------------------------------------------------------------------------------- ...
- 【Unity3D/C#】Unity3D中的Coroutine详解
Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutin ...
- Unity3D中的Coroutine具体解释
本文太乱,推荐frankjfwang的:全面解析Coroutine技术 Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这种代码. 疑问: yie ...
- [Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)
---------------------------------------------------------------------------------------------------- ...
- 【Unity3d游戏开发】Unity3D中的3D数学基础---向量
向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...
- Unity3D中可中途释放的单例
Unity3D中可中途释放的单例 使用静态类,静态变量的坏处是从程序加载后就一直占用内存,想要释放比较麻烦,可是之前使用的单例,没有提供释放的方法,那是不是也同静态的一样直到程序结束菜释放?那单例的好 ...
- 图文详解Unity3D中Material的Tiling和Offset是怎么回事
图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...
随机推荐
- UI“三重天”之Selenium(一)
关注一下UI自动化,记一记笔记. UI自动化的优缺点: 关于UI自动化的优缺点想来大家都有了解,优点:解放人力(并不是完全解放),用机器(涵盖工具.脚本等)代替人工完成测试工作,将测试用例转化为脚本实 ...
- python socket 详细介绍
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
- tensorflow 卷积神经网络基本参数()
目录: 1. tf.placeholder_with_default(tf.constant(1.0),shape=[],name='use_dropout') # 设置一个占位符 2. tf.c ...
- maven exclusions version
<dependency> <groupId>cn.wonhigh</groupId> <artifactId>base-framework-web< ...
- MonoBehaviour.OnValidate
[MonoBehaviour.OnValidate] This function is called when the script is loaded or a value is changed i ...
- S 导入值列表浏览器、值列表
先导入值列表浏览器,再导入值列表 一.导出模板 上面为导出模板 二.导入值列表浏览器 下面开始导入EXCEL数据 List Of Values Parent(1).xls List Of Values ...
- Node.js的优点和缺点(转载)
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:FengqiAsia链接:http://www.zhihu.com/question/19653241/answer/1599 ...
- for 续10
---------siwuxie095 for 帮助信息: ...
- Golang之实现(链表)
链表算法 package main import "fmt" type LinkNode struct { data interface{} next *LinkNode } ty ...
- 光源 材质 简析——基于《real time rendering》第三版 第五章
对于真是世界的渲染,有三个重要的组成部分,光源,材质,以及摄像机.下面,我们一个一个来简单介绍一下. 光源:方向光,点光源,聚光灯.但是,在和物体表面交互的时候,光源对物体表面的影响是依赖光的辐照度( ...