Unity3D游戏开发之UniLua热更新完全解读.docx_第1页
Unity3D游戏开发之UniLua热更新完全解读.docx_第2页
Unity3D游戏开发之UniLua热更新完全解读.docx_第3页
Unity3D游戏开发之UniLua热更新完全解读.docx_第4页
Unity3D游戏开发之UniLua热更新完全解读.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Unity3D游戏开发之UniLua热更新完全解读今天呢,我们来说说Unity3D配合AssetBundle和;Lua实现热更新。 首先,我们来了解一下什么是热更新吧!所谓热更新是指在不停机的状态下对系统进行更改,例如我们的Windows可以在不重启的状态下完成补丁的更新、Web服务器在 不重启的前提下完成对数据和文件的替换等都是热更新的经典实例。那么对于Unity3D而言,什么是热更新呢?如果我们最终发布的Unity3D游戏是一个Web游戏,那么每次游戏加载的过程中实现对资源代码的更新就是热更新。如果我们最终发布的Unity3D游戏是一个客户端游戏,那么我们在重重启客户端以后实现对资源代码的更新就是热更新。为什么这么说呢?因为Web游戏需要保证玩家能够及时快速地进入游戏,因此在游戏加载完之前,我们必须完成对游戏资源和代码的更新。可是对于客户端游戏而言,玩家可以在等待本次更新结束后再进入游戏,而且大部分的客户端程序在更新完后都会要求玩家重启客户端,所以对于客户端游戏而言,热更新并非是严格意义上的热更新。那么,我们为什么要进行热更新呢?答案是为了缩短用户获取新版本客户端的流程、改进用户体验。【狗刨学习网】这其实就是博主在前文中提到的传统单机游戏依靠光盘载体进行发售所面临的问题,玩家为了获取最新版本的游戏,需要下载全新的客户端并将它安装到计算机或者手机设备上。在互联网产品开发中有一种称为快速迭代的理念,试想如果我们每次对客户端进行局部的调整,就需要玩家去下载新版本的客户端,试问这样的用户体验真得能让用户满意吗?所以现在为了方便用户、留住用户、进而从留住的用户身上赚到钱,我们总能在游戏产品中找到热更新的影子。我们知道在Unity3D中可以通过AssetBundle来实现对游戏中资源的更新。 我们首先需要将Unity API封装成一个C#类库,在这个类库中我们将会涉及动态加载场景和动态创建场景,因为我们更新游戏的逻辑的时候将会用到这些方法。这些方法通过封装后我们便可以在Lua脚本通过Require方式来引用,进而我们就可以通过Lua脚本来动态地进行设计。我们设计一个固定的位置来存储Lua脚本更新文件,这样我们只需要对比本地版本和服务器版本是否相同就可以知道我们是否需要更新。这里我们通过WWW来从远程服务器上下载最新的Lua脚本更新文件,下载下来的Lua脚本处于项目外部,我们无法使用Resource.Load()这样的方法来加载,可是我们可以通过WWW来加载一个本地文件,这样我们就实现了Lua脚本文件的更新。当然,我们可以使用AssetBundle来更新Lua脚本文件,可是博主的免费版不支持AssetBundle,所以博主想出了这样一个曲线救国的方法。当Lua脚本文件更新后,我们就可以在游戏主逻辑里通过DoString()方法来执行脚本文件中的代码。在游戏主逻辑里主要的任务是比较当前版本号和服务器版本号来判断是否需要更新,如果需要更新就下载Lua脚本更新文件然后执行脚本中的代码,这样我们就实现了客户端程序的更新。好了,下面我们继续以前一篇文章中的项目为例来将博主的这个设想变成现实。 首先,我们在CSharpLib.cs这个类中增加下面两个方法并完成方法的注册:1. /2. /设置场景中物体的坐标3. /4. /返回当前坐标5. /Lua.6. publicstaticintSetPosition(ILuaStatelua)7. 8. /物体的名称9. stringmName=lua.L_CheckString(1);10. /传入参数x,y,z11. floatmX=(float)lua.L_CheckNumber(2);12. floatmY=(float)lua.L_CheckNumber(3);13. floatmZ=(float)lua.L_CheckNumber(4);14. /获取物体15. GameObjectgo=GameObject.Find(mName);16. /获取Transform17. TransformmTrans=go.transform;18. /设置游戏体的位置19. mTrans.position=newVector3(mX,mY,mZ);20. /返回游戏体当前坐标21. lua.PushNumber(mTrans.position.x);22. lua.PushNumber(mTrans.position.y);23. lua.PushNumber(mTrans.position.z);24. return3;25. 26. 27. /28. /使用本地预设创建一个物体29. /30. /Theresource.31. /Lua.32. publicstaticintCreateResource(ILuaStatelua)33. 34. /传入资源名称35. stringmName=lua.L_CheckString(1);36. /加载本地资源37. GameObjectgo=(GameObject)Resources.Load(mName);38. /传入坐标参数x,y,z39. floatmX=(float)lua.L_CheckNumber(2);40. floatmY=(float)lua.L_CheckNumber(3);41. floatmZ=(float)lua.L_CheckNumber(4);42. /创建一个新物体43. Object.Instantiate(go,newVector3(mX,mY,mZ),Quaternion.identity);44. /返回该物体的名称45. lua.PushString();46. return1;47. 好了,这样我们就完成了一个简单的C#类库,下面我们来在主逻辑代码中增加一个更新脚本的方法UpdateScripts():1. voidUpdateScript()2. 3. StartCoroutine(Download);4. 5. 6. /7. /下载Lua脚本更新文件8. /9. IEnumeratorDownload()10. 11. /从本地加载Lua脚本更新文件,假设文件已经从服务器下载下来12. WWW_WWW=newWWW(mUpdateFilesPath);13. yieldreturn_WWW;14. /读取服务器版本15. mLua.L_DoString(_WWW.text);16. 这里的代码逻辑很简单,就是读取脚本更新本地文件然后执行脚本,其中mUpdateFilePath是脚本更新文件路径:1. /初始化路径2. mUpdateFilesPath=file:/D:lua_update.txt; 这里博主设想的是在本地存储一个版本号,每次更新前先获取服务器端的版本号,如果两个版本号不同则需要从服务器上下载更新脚本文件进行更新。不过博主这里没有想到什么好方法来获取版本号,所以这里就只写了更新。那么,我们来看看更新脚本文件都做了哪些事情吧!1. localcsharplib=requireCSharpLib.cs2. csharplib.SetPosition(Cube,2,1,0)3. csharplib.CreateResource(Sphere,0,0,0)4. csharplib.CreateResource(Cub

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论