对于手机游戏,如果可以在线更新以实现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的更多相关文章

  1. 在Unity3d中解析Lua脚本的方法

    由于近期项目中提出了热更新的需求,因此本周末在Lua的陪伴下度过.对Lua与Unity3d的搭配使用,仅仅达到了一个初窥门径的程度,记录一二于此.水平有限,欢迎批评指正. 网络上关于Lua脚本和Uni ...

  2. Unity3D中的Coroutine详解

    Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutin ...

  3. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)

    ---------------------------------------------------------------------------------------------------- ...

  4. 【Unity3D/C#】Unity3D中的Coroutine详解

    Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutin ...

  5. Unity3D中的Coroutine具体解释

    本文太乱,推荐frankjfwang的:全面解析Coroutine技术 Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这种代码. 疑问: yie ...

  6. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)

    ---------------------------------------------------------------------------------------------------- ...

  7. 【Unity3d游戏开发】Unity3D中的3D数学基础---向量

    向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...

  8. Unity3D中可中途释放的单例

    Unity3D中可中途释放的单例 使用静态类,静态变量的坏处是从程序加载后就一直占用内存,想要释放比较麻烦,可是之前使用的单例,没有提供释放的方法,那是不是也同静态的一样直到程序结束菜释放?那单例的好 ...

  9. 图文详解Unity3D中Material的Tiling和Offset是怎么回事

    图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...

随机推荐

  1. Spark系列(二) Spark Shell各种操作及详细说明

    并行化scala集合(Parallelize) //加载数据1~10 val num=sc.parallelize(1 to 10) //每个数据项乘以2,注意 _*2记为一个函数(fun) val ...

  2. Oracle DSI系列 01 DSI初识BBED

    DSI是Data Server Internals的缩写,是Oracle公司内部用来培训Oracle售后工程师使用的教材. 1 bbed工具使用BBED工具介绍BBED stands for Bloc ...

  3. C++客户端通过gSOAP调用WebService

    webService三要素: SOAP(Simple Object Access Protocol).WSDL(WebServicesDescriptionLanguage).UDDI(Univers ...

  4. 修改jvm xms参数

    http://hi.baidu.com/200770842223/item/9358aad4f3194e1a20e2501b http://www.cnblogs.com/mingforyou/arc ...

  5. IOS学习计划

    自从接触了IOS后,都没有像样的写过一篇博客去总结这近三个月来对IOS开发的了解.今天,趁着有那么一点的时间,写一下接下来的学习计划和学习路线,以便于自己今后接下来的时间可以更有方向感,更有效率的去学 ...

  6. ES6系列_7之箭头函数和扩展

    1.默认值 在ES6中给我们增加了默认值的操作相关代码如下: function add(a,b=1){ return a+b; } console.log(add(1)); 可以看到现在只需要传递一个 ...

  7. c++ new 与malloc有什么区别

    前言 几个星期前去面试C++研发的实习岗位,面试官问了个问题: new与malloc有什么区别? 这是个老生常谈的问题.当时我回答new从自由存储区上分配内存,malloc从堆上分配内存:new/de ...

  8. Pyhton项目实践:将带有美国风格日期的文件改名为欧洲风格日期

    题目 项目要求:上千个文本文件,文件名包含美国风格的日期( MM-DD-YYYY),需要将它们改名为欧洲风格的日期( DD-MM-YYYY) 先写个创建一百个美国风格日期的文件 #! python # ...

  9. leetcode507

    public class Solution { public bool CheckPerfectNumber(int num) { ) { return false; } ; ; i <= nu ...

  10. Eclipse 插件集合

    以下是我整理的自己开发过程中的常用Eclipse插件,按字母排序: (1)    AmaterasUML        介绍:Eclipse的UML插件,支持UML活动图,class图,sequenc ...