菜鸟学习.docx

上传人:b****6 文档编号:16568046 上传时间:2023-07-14 格式:DOCX 页数:7 大小:20.46KB
下载 相关 举报
菜鸟学习.docx_第1页
第1页 / 共7页
菜鸟学习.docx_第2页
第2页 / 共7页
菜鸟学习.docx_第3页
第3页 / 共7页
菜鸟学习.docx_第4页
第4页 / 共7页
菜鸟学习.docx_第5页
第5页 / 共7页
菜鸟学习.docx_第6页
第6页 / 共7页
菜鸟学习.docx_第7页
第7页 / 共7页
亲,该文档总共7页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

菜鸟学习.docx

《菜鸟学习.docx》由会员分享,可在线阅读,更多相关《菜鸟学习.docx(7页珍藏版)》请在冰点文库上搜索。

菜鸟学习.docx

菜鸟学习

菜鸟学习

孙广东2015-4-6热更新我是个菜鸟,感谢网上的各位的奉献,这次又当一回搬运工。

准备:

1、了解Lua的语法推荐书籍《Lua程序设计第二版》2、使用ULua插件进行通信尽量早上真机。

因为Bug问题特别多。

大杂烩:

更新LUa其实也是更新资源。

Lua被看作一个资源么。

Lua代码都是运行时才编译的,不运行的时候就如同一张图片、一段音频一样,都是文件资源;所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻松实现“热更新”。

运行效率由于使用反射,所以成为它与生俱来的诟病。

目前有对他的改进,像C#ToLua、Slua。

但是Ulua是很成熟的,这个对于项目开发我认为暂时比性能重要!

很多人在用,很多坑都已经被人采完。

个人比较看好Slua的发展。

当然了还有李总的L#走的就不是Lua的路。

网上还有说nLua的,我是新手不了解。

看看权威的解释:

ulua包含两种c模式(luajit版+原生luavm版),加之toluac#提供了直接访问渠道。

所以追求效率的,请选用ulua。

但是ulua因为底层使用luajit,而luajit目前不能在WP平台使用,所以如果ulua支持WP平台需要第二种原生luavm的底层库。

nlua包含2种模式(KeraLuac版本)(KopiLuac#版本),它支持全平台,因为c版本底层用的原始的luavm(非luajit)。

但是缺少toluac#的支持,因此效率略低于ulua,但是支持WP平台(其他平台也支持)。

插件:

下载地址链接:

密码:

f29hULua=Lua+LuaJit(解析器、解释器)+LuaInterface(与C#通信用这个);DLL放在Plugins文件夹下,如果导入后报错,就重启Unity主要内容:

先感谢这篇博文的分享者:

à加载Lua代码(LuaState.DoString(string))à调用Lua代码中的方法(GetFunction(string),LuaFunction.callFunction(string))。

其中加载Lua代码这一块,可以直接赋一段Lua代码字符串,也可以指定一个Lua脚本文件。

为了热更新,应当采用第二种加载方法,即创建一个Lua脚本文件。

由于Unity不支持扩展名为lua的文件,所以可将Lua脚本扩展名定为txt(纯文本文件),并用unity的TextAsset列表负责记录所有脚本文件。

建议列表中给每个脚本搭配一个string类型的ID,这样凭此ID即可加载正确的lua脚本;另外在LuaState类中新增一个String类型的public成员,赋值为该ID。

这样一旦某个Lua脚本在运行时报错,可根据输出的ID值判断是哪个Lua脚本有错误。

关于Lua里的预处理:

[plain]viewplaincopyprint?

<strong>luanet.load_assembly("Assembly-CSharp")luanet.load_assembly('UnityEngine')Vector2=luanet.import_type('UnityEngine.Vector2')Vector3=luanet.import_type('UnityEngine.Vector3')GameObject=luanet.import_type('UnityEngine.GameObject')luanet.import_type('System.Collections.Generic.List')Debug=luanet.import_type('UnityEngine.Debug')</strong>这些都是常用的Lua预处理,建议单独写个Lua脚本记录这些,以后加载其他Lua脚本前都先加载一下这个脚本。

自定义C#类也是可以import的,import操作是Lua调用C#的前提。

当然在C#中实例化的LuaState也可以预定义一些Lua全局变量,这都是在C#里完成的,比如:

[plain]viewplaincopyprint?

<strong>voidSetLuaData(LuaStatelua){lua["transform"]=transform;lua["gameObject"]=gameObject;}</strong>预定义了两个变量,一个是transform,一个是gameObject。

关于Lua里的全局变量:

Lua里所有的字符串,如果不是关键字或者运算符,就都是变量;这些变量中,凡是没用local关键字修饰的,就是全局变量,反之,则是局部变量。

每个LuaState对象,当它加载过Lua代码以后,它里面定义的全局变量,在这个对象生命期内是一直存在的。

如果两次调用这个LuaState的某方法,第一次将某全局变量进行了修改,那么第二次,这个全局变量会在第一次修改的基础上继续修改。

关于Lua在Unity的适用范围:

虽然Lua可以负责Unity工程的任何模块,但是出于对游戏性能的考虑,尽量少的低频率的调用Lua,比如尽量少在Update函数中调用Lua、循环利用已经实例化过的LuaState避免浪费资源。

对于那些不需要高效运算的模块,比如UI部分,就可以放心大胆的使用Lua。

关于Lua与NGUI的适配:

调用Lua的主要方式就是callFunction,而对于NGUI来说,一般都是按钮触发某C#脚本的函数,那么如何用按钮触发Lua的函数呢?

这就需要有个C#脚本作为“中介”,这个“中介”需要有自己的LuaState实例,当执行“中介”的某个方法时,由该方法调用callFunction。

至于具体调用Lua脚本的哪个方法,可以通过传参的方式告诉这个“中介”——修改NGUI的ButtonMessage类,加入新的publicstringLuaFunctionName成员,以后由它来制定要调用的Lua方法名就好了。

而通过NGUI的UIButton等调用C#的方法,也是同理的(NGUI3.5.6版以后,可以给UIButton等等组件的触发方法添加参数了)。

关于Lua与SimpleJSON的适配:

SimpleJSON是一个开源的JSON库,这个详见之前的博客。

由于Lua语言无法理解C#里面的属性,所以凡是SimpleJSON里的publicA{get,set}这种,要新写一些接口函数返回它们的取值,以供Lua调用。

而且Lua调用C#里经过很多重载的函数,也经常判断错误(这是个bug?

),所以干脆多弄一些函数名,避免调用错误。

关于Lua与Lua之间的调用:

在Unity中使用Ulua,想要让两个Lua脚本彼此调用是很难的,需要通过C#作为“中介”,而且Lua不支持C#的泛型,所以不能用GetComponnet<类名>()的形式,只能用GetComponnet(“类名”)的形式去获取组件。

两个Lua脚本相互传参也很麻烦,因为有了C#脚本作为“中介”,所以不能传tabel类型的参数,我的做法是将若干参数拼成一个json字符串传递过去,另一方再解json包。

感觉有点蛋疼。

不过这种情况并不多见,都是可以避免的(比如一个模块只用一个大Lua脚本,各自独立减少沟通)。

关于Lua编辑器:

个人使用的是notepad++,也有很多人用sublime,代码折叠这块notepad++更好一些,而sublime在功能上貌似更强大一些。

unity项目开发基本使用VS系列。

所以

BabeLua是一款基于VS2012/2013(简称VS)的免费开源的Lua集成开发环境,在Lua编辑和调试方面,具有如下功能和特性:

●Lua语法高亮●语法检查●自动补全●一键注释●格式化代码●自定义代码折叠●工程管理●快速搜索和跳转●文件大纲●注入宿主程序内对Lua脚本进行调试●设置断点观察变量值●查看堆栈信息版本更新日志

或者开源的Lua轻量级编辑器:

ZeroBraneStudio

Unity编程的亲们,有没有在Unity运行状态下修改并保存了脚本,然后切回来Unity直接卡死的惨痛经历?

使用Lua,你将告别这一现象,有木有心动呢?

接下来感谢“小阿哥”的视频分享,虽然内容讲的支离破碎。

C#如何访问Lua中的属性1).C#如何访问LUA中的属性?

2).C#如何访问LUA中的函数?

3).C#如何访问LUA中的表?

test0.lua文件

[plain]viewplaincopyprint?

--[[@author:

小阿哥@des:

测试C#访问LUA的一些东东@date:

2015-03-21--]]config={name="小阿哥",age=24,qq="247124629"};Name="小阿哥";Age=24;isBoy=true;functionPrintFromLua(a)print("打印信息。

我来息LUA...CS传的参数的值:

",a);return200;endprint("test0.lua执行完毕..");Main.cs文件随便挂在一个对象上测试吧!

[plain]viewplaincopyprint?

usingUnityEngine;usingSystem.Collections;usingLuaInterface;/***@author:

小阿哥*@des:

讲通信基础版*@date:

2015-03-21*/publicclassMain:

MonoBehaviour{privatestaticMaininstance;publicstringss;publicTextAssettt;//UsethisforinitializationvoidStart(){instance=this;}publicstaticMainGetInstance(){returninstance;}//C#调用LUAvoidtestCSharp_GoLua(){LuaStatelua=newLuaState();lua.DoString("print'helloworld'");}//C#调用LUAFilevoidtestCSharp_GoLuaFile(){LuaStatelua=newLuaState();lua.DoFileFromAge(this,"Test0.lua");}//C#调用LUAInforvoidtestCSharp_GoLuaInfor(){LuaStatelua=newLuaState();lua.DoFileFromAge(this,"Test0.lua",delegate(object[]obj){//访问LUA中的表LuaTableconfigTable=lua.GetTable("config");Debug.Log("name:

"+configTable["name"]);Debug.Log("age:

"+configTable["age"]);Debug.Log("qq:

"+configTable["qq"]);//访问LUA中的基础属性Debug.Log("Name:

"+lua.GetString("Name"));Debug.Log("Age:

"+lua.GetNumber("Age"));Debug.Log("isBoy:

"+lua["isBoy"]);//访问Lua中的函数LuaFunctionluaFun=lua.GetFunction("PrintFromLua");if(luaFun!

=null){System.Object[]obResult=luaFun.Call(100);Debug.Log("obResult:

"+obResult[0]);}});}voidOnGUI(){if(GUILayout.Button("第一节.C#调用LUA")){testCSharp_GoLua();}if(GUILayout.Button("第二节.C#调用LUAFile")){testCSharp_GoLuaFile();}if(GUILayout.Button("第三节.C#调用LUA信息")){testCSharp_GoLuaInfor();}}}

Lua如何访问C#中的属性1).LUA如何访问Unity提供的对象?

a.如何new系统对象?

b.如何访问对象的属性?

c.如何访问对象的函数?

2).LUA如何访问在C#中自定义的对象?

a.如何new自定义对象?

b.如何访问对象的属性?

c.如何访问对象的函数?

Hero.cs文件[plain]viewplaincopyprint?

usingUnityEngine;usingSystem.Collections;/***@author:

小阿哥*@des:

讲通信基础版*@date:

2015-03-21*/publicclassHero{privatestring_name;privateint_hp,_ap,_mp;publicHero(stringname,inthp,intap,intmp){this._name=name;this._hp=hp;this._ap=ap;this._mp=mp;}publicintHp{get{returnthis._hp;}}publicintAp{get{returnthis._ap;}}publicintMp{get{returnthis._mp;}}publicvoidPrintInfor(){Debug.Log("hp:

"+this._hp+"___ap:

"+this._ap+"___mp:

"+this._mp);}publicintAddHp(intadd){Debug.Log("Lua调用CS的AddHpLua传的参数add:

"+add);this._hp+=add;return_hp;}publicintAddAp(intadd){Debug.Log("Lua调用CS的AddApLua传的参数add:

"+add);this._ap+=add;return_ap;}publicintAddMp(intadd){Debug.Log("Lua调用CS的AddMpLua传的参数add:

"+add);this._mp+=add;return_mp;}publicvoiddesroy(){this._name=null;}}在上一个Main.cs文件中添加代码:

[plain]viewplaincopyprint?

//lua调用C#voidtestLua_GoCSharp(){LuaStatelua=newLuaState();lua.DoFileFromAge(this,"test1.lua");}voidOnGUI(){if(GUILayout.Button("第四节.LUA调用C#信息")){testLua_GoCSharp();}}test1.cs文件[plain]viewplaincopyprint?

--[[@author:

小阿哥@des:

测试LUA访问C#的一些东东@date:

2015-03-21--]]--访问C#中的系统的对象luanet.load_assembly("UnityEngine");GameObject=luanet.import_type("UnityEngine.GameObject");Vector3=luanet.import_type("UnityEngine.Vector3");localnewObj=GameObject('ageObj');--访问C#中的系统的对象的函数newObj:

addComponent("Animation");--访问C#中的系统的对象的属性newObj.transform.position=Vector3(10,20,30);--访问C#中的自定义的对象Hero=luanet.import_type("Hero");--newC#中的自定义的对象localheroa=Hero("小阿哥",100,200,300);--访问C#中的自定义的对象的函数heroa:

PrintInfor();--访问C#中的自定义的对象的函数来回传值print("LUAhp:

",heroa:

AddHp(10));print("LUAap:

",heroa:

AddAp(20));print("LUAmp:

",heroa:

AddMp(30));print("test1.lua执行完毕..");3、Demo例子

所有的业务逻辑放在Lua这面,CS那面通过LuaInterface对其进行调用。

Lua是脚本语言,需要宿主语言(C#)。

1).封装Lua版的MonoBehaviour2).接下来所有的业务逻辑均使用LUA进行编写Demo.lua文件:

[plain]viewplaincopyprint?

--[[@author:

小阿哥@des:

主要使用LUA的进行编码@date:

2015-03-21--]]luanet.load_assembly("UnityEngine");GameObject=luanet.import_type("UnityEngine.GameObject");Vector3=luanet.import_type("UnityEngine.Vector3");PrimitiveType=luanet.import_type("UnityEngine.PrimitiveType");localboxGameObj;functionStart()boxGameObj=GameObject.CreatePrimitive(PrimitiveType.Cube);boxGameObj.name="ageBox100";endfunctionUpdate()endfunctionFixedUpdate()boxGameObj.transform:

Rotate(Vector3.up,5);endfunctionOnGUI()--print("OnGUI..");endfunctionOnDestroy()--print("OnDestroy..");endusingUnityEngine;usingSystem.Collections;usingLuaInterface;Demo.cs文件挂在摄像机上做测试就行!

[plain]viewplaincopyprint?

/***@author:

小阿哥*@des:

测试小例子*@date:

2015-03-21*/publicclassDemo:

MonoBehaviour{privateLuaStatelua;privateLuaFunctionfunStart;privateLuaFunctionfunUpdate;privateLuaFunctionfunFixedUpdate;privateLuaFunctionfunOnGUI;privateLuaFunctionfunOnDestroy;//UsethisforinitializationvoidStart(){lua=newLuaState();lua.DoFileFromAge(this,"Demo.lua",delegate(System.Object[]obj){funStart=lua.GetFunction("Start");funUpdate=lua.GetFunction("Update");funFixedUpdate=lua.GetFunction("FixedUpdate");funOnGUI=lua.GetFunction("OnGUI");funOnDestroy=lua.GetFunction("OnDestroy");if(funStart!

=null){funStart.Call();}});}//UpdateiscalledonceperframevoidUpdate(){if(funUpdate!

=null){funUpdate.Call();}}voidFixedUpdate(){if(funFixedUpdate!

=null){funFixedUpdate.Call();}}voidOnGUI(){if(funOnGUI!

=null){funOnGUI.Call();}}voidOnDestroy(){if(funOnDestroy!

=null){funOnDestroy.Call();}}}

最后感谢骏擎网络的突出贡献吧游戏已经开发到后期,如何接入ulua?

(1)活动

(2)计时器(单位秒)驱动lua的update(3)网络管理留给lua能跟服务器交互的接口(现在未必用得到的)。

活动这部分变数最大,很多问题上线前是无法预知的,比如上线如果发生数据不理想,或者非常火爆,这些情况无法预知,根据这些情况做活动调整,这些很容易有更新需求。

而且未必前期都能想到坐进去。

运营策划都是要根据在线运营情况做未知的活动调整。

还有一部分我称之为,程序给自己留的后路,如果绝大部分都是c#的话,很有可能产生上线后产生bug,比如:

新手引导,在什么地方卡住了等。

客户端启动一个计时器,驱动lua的一个onTimer,在里面根据游戏运行情况,动态调整对游戏的控制。

还有就是多给自己留一个协议的接口给lua备份用。

最新版ulua+cstolua的性能速度超sluaN倍最新版的ulua+cstolua,效率已经火箭式提升,早已阔别三日当刮目相看了,大家关心的GC问题已经彻底消除,GC早已将为0。

加上阿萌已经将众多使用频繁的Unity类用lua重写,这样完全消除了P/Invoke的代价(不知道slua会不会发现了,再次山寨),甚至cstolua都把string都做了优化,可以在lua中转换(极限了),综上所述,ulua已经是当前最快的,没有之一!

请直接下载uLua_v1.08.zip,集成cstolua、protobuf-lua-gen、ios64、Intelx86,cjson,pbc,lpeg,sqlite3等支持,从网络协议到正则表达式,再到数据库,ulua已经为在unitylua环境开发集成了一个既兼顾效率(都是成熟的原生C的库)又完善(一应俱全)的稳定开发平台,使您开发从小游戏到大型网游都有相应的方案支持!

这也是ulua所特有的哦~~

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2