KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 配置 开服
查看: 1987|回复: 17

现实unity项目是不是一定要嵌入lua呢?关于手游客户端热更新

[复制链接]

16

主题

38

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
发表于 2016-12-2 11:39:29 | 显示全部楼层 |阅读模式
本帖最后由 姜云凡 于 2016-12-2 11:52 编辑

有朋友谈到unity热更新问题,需要unity 嵌入lua。
unity项目是不是一定要lua呢?现实手游客户端项目确实有热更新的实际要求。

我是这样看待lua嵌入unity项目的,因为ios和android安全性的原因,限制unity的热更新项目。所以unity官方本身不做热更新这款,理论上unity官方可以实现热更新,但是需要苹果和谷歌的配合,即修改操作系统的代码,但是这样做几乎不可能。所以unity项目的热更新都是第三方程序员在做的框架比如ulua,确实有大量的热门手游是使用了ulua的,也有大量热门手游不使用ulua。但是unity项目用了这些ulua东西之后,因为想要热更新,马上增加了客户端unity项目的代码复杂度,代码的复杂度增加,可读性变得非常差,维护上就更困难一些。国内的大游戏公司似乎对unity客户端手游项目热更新并不太看重,似乎重要版本的升级几乎要求玩家下载合适的版本,因为这样做了之后给游戏玩家一定的补偿,比如送金币道具之类,而且手机上往往有应用商店,可以应用更新,其实更新的过程还很便捷,点击应用商店里某个游戏的更新就升级了,也没有麻烦玩家下载和安装,对游戏开发者来说这样的选择也没有增加项目的代码复杂度。这似乎是一个双赢的选择。


不知道我的理解是不是符合主流的选择呢?


回复

使用道具 举报

8

主题

3374

帖子

7586

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7586
QQ
发表于 2016-12-2 11:59:37 | 显示全部楼层
这个问题很难得到所有人都满意的答案。

其实这个问题主要跟运营有关, 如果你的项目频繁有一些小东西需要不断更新, 运营会要求你们支持热更新, 否则将会有很大的损失。
如果是个比较稳定的项目, 每次发布版本都是大版本, 那必须不太需要热更新了。
柯标
3603661@qq.com
回复

使用道具 举报

16

主题

38

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
 楼主| 发表于 2016-12-2 19:26:13 | 显示全部楼层
本帖最后由 姜云凡 于 2016-12-2 19:28 编辑

我不是说ulua设计不好,我只是觉得因为unity没有开源,第三方的ulua嵌入设计,使得代码不够优雅,可读性极差。有朋友提到网易的牛叉引擎,网易的牛叉引擎是自己自研的,设计上就是c++嵌入python,这样实现热更新很容易,所以直接使用python写游戏客户端很优雅。很可惜的就是这个网易自研牛叉引擎只是给自己使用,第三方的公司是无法使用的。如果unity是开源的,虽然官方没有提供lua这个层,我们可以直接自己完成一个lua层的设计,这样代码很优雅,可读性极好。也不需要争论unity手游项目要不要使用lua了。不知道我的理解是否正确?
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2016-12-2 19:33:06 | 显示全部楼层
不开源也可以较好的分层设计,设计总是有办法的。

开源了当然可以站在更高的角度来设计。

热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

38

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
 楼主| 发表于 2016-12-2 19:48:01 | 显示全部楼层
朋友告诉我,有这样一种方案。写unity手游项目的时候,完全用C#写,然后使用bridge.net把C#变成js,这样就可以实现热更新了,代码也有可读性。
相关的文档介绍:
http://www.cnblogs.com/answerwinner/p/4469021.html

http://www.cnblogs.com/answerwinner/p/6037911.html

据说有一款上线的手游是《仙灵世界》是这样使用的。

不足就是js的引擎是spidermonkey,好像大家公认js最快的引擎是谷歌V8.

当然因为是需要转换的,所以对C#代码的编写可能有点限制。

kbe哥怎么看待这个方案呢?
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2016-12-2 19:52:55 | 显示全部楼层
目前使用较广泛的还是lua,从各种资源角度来说例如招人lua更容易找到u3d上开发游戏的程序。

这种转换谁知道可靠性如何呢?况且你还说了有点限制,作为产品开发我会选择前者,也许是我不了解这种方案
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

38

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
 楼主| 发表于 2016-12-2 19:56:18 | 显示全部楼层
哦。:):):):)
回复

使用道具 举报

16

主题

38

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
 楼主| 发表于 2016-12-2 20:54:18 | 显示全部楼层
kbe哥,还有一个这样的热更新项目,使用L#,几乎不需要C#转换成js了,也不用lua,语法上和C#是一致的,可能目前还有某些地方有些问题,待改善。

http://forum.china.unity3d.com/thread-21330-1-4.html

github地址:https://github.com/liiir1985/ILRuntime

你怎么看这个选择呢?
回复

使用道具 举报

16

主题

38

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
 楼主| 发表于 2016-12-2 21:03:46 | 显示全部楼层
用L#开发unity手游,的示范。

http://www.cnblogs.com/crazylights/p/4216913.html

我看了文档,感觉还是挺麻烦的。
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2016-12-2 22:10:32 | 显示全部楼层
没有广泛应用,你愿意做小白鼠?
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

38

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
 楼主| 发表于 2016-12-2 22:26:29 | 显示全部楼层
哦:lol:lol:lol:lol
回复

使用道具 举报

16

主题

38

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
 楼主| 发表于 2016-12-3 05:51:17 | 显示全部楼层
搜索了一下,这个方案是不是最好的,不用lua、js方案,不用烦人的语法,只需要修改unity底层的mono。

手游热更新方法
CN 105487885 A
摘要
本发明提供了一种手游热更新方法,包括:修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新;修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配。通过修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新。然后再修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配,从而实现所述运行代码和资源的热更新,使得游戏分区更新和版本回退得以实现。提高了游戏开发的效率,也提高了游戏玩家的体验。
权利要求(9)
1.一种手游热更新方法,其特征在于,包括: 修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新; 修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配。
2.如权利要求1所述的手游热更新方法,其特征在于,通过Hook方式修改所述运行代码的加载路径。
3.如权利要求1所述的手游热更新方法,其特征在于,所述运行代码以DLL文件形式存储在APK中,通过修so文件以实现DLL文件的加载路径。
4.如权利要求3所述的手游热更新方法,其特征在于,通过修改I ibmon0.so文件以实现修改DLL文件的加载路径。
5.如权利要求4所述的手游热更新方法,其特征在于,通过修改I ibmon0.so文件中的mono_image_open_from_data_with_name函数以实现修改DLL文件的加载路径,使得所述DLL文件按照指定目录加载。
6.如权利要求1所述的手游热更新方法,其特征在于,修改Unity成员变量的序列化方式的步骤包括: 取消记录在APK中的Unity成员变量的序列化顺序; 自定义Unity成员变量的序列化顺序。
7.如权利要求6所述的手游热更新方法,其特征在于,取消记录在APK中的Unity成员变量的序列化顺序的步骤包括:在利用Unity编辑器编译时,打开NONE_SEARIALIZE编译开关,以关闭Unity自定义的数据序列化功能。
8.如权利要求6所述的手游热更新方法,其特征在于,自定义Unity成员变量的序列化顺序的步骤包括:在利用Unity编辑器编译时,将SerialBehav1r的对象数据导出为自定义的Un i ty成员变量的序列化数据。
9.如权利要求8所述的手游热更新方法,其特征在于,所述自定义的Unity成员变量的序列化数据以.bytes文件形式存储。
说明
手游热更新方法
技术领域

[0001 ]本发明涉及计算机应用领域,尤其是一种手游热更新方法。

背景技术

[0002]当前,通常用Unity3D来开发各种游戏。由于Unity3D的非开源性,Unity3D项目在手机平台上的程序和资源热更新可能成为困扰很多团队顺利开发游戏产品的主要技术瓶颈之一。

[0003]        Unity3D的游戏逻辑运行代码是以DLL(Dynamic Link Library,动态链接库)文件形式储存于APK之中的aAndroid系统下APK(Android Package ,Android安装包)在安装后是无法写入新的文件并重新打包的。因此,如果需要修改可执行的DLL文件,由于所述DLL文件的加载路径被确定在APK中,只能以重装APK的方法来实现。而重装APK对手游玩家来说是一种流失的重要风险。

[0004]同时,在Unity3D机制下,运行代码和资源是不能同时更新的,从而导致了无法实现游戏分区更新和版本回退。分区更新对于项目研发有着重要的意义:它使项目组可以在每个版本全面推出之前,在部分服务器对于新功能进行试点;考察更新对于游戏数值平衡性的影响;监控是否有大规模的程序稳定性异常。版本回退对于玩家来说也有重要的意义,对于已经进入高版本服务器的玩家可以通过选择低版本的服务器,回退本地游戏资源进入低版本服务器进行游戏,而不会出现由于服务器版本选择错误,无法退回原来版本的尴尬。

发明内容

[0005]本发明的目的在于提供一种手游热更新方法,以解决Unity3D的游戏运行代码和资源不能同时热更新,而导致的无法实现游戏分区更新和版本回退的问题。

[0006]为了达到上述目的,本发明提供了一种手游热更新方法,包括:修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新;

[0007]修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配。

[0008]优选的,在上述的手游热更新方法中,通过Hook方式修改所述运行代码的加载路径。

[0009]        优选的,在上述的手游热更新方法中,所述运行代码以DLL文件形式存储在APK中,通过修so文件以实现DLL文件的加载路径。

[0010]优选的,在上述的手游热更新方法中,通过修改I        ibmon0.SO文件以实现修改DLL文件的加载路径。

[0011]        优选的,在上述的手游热更新方法中,通过修改1;[131]10110.80文件中的1]10110_;[11^6_open_from_data_with_name函数以实现修改DLL文件的加载路径,使得所述DLL文件按照指定目录加载。

[0012I优选的,在上述的手游热更新方法中,修改Unity成员变量的序列化方式的步骤包括:

[0013]取消记录在APK中的Unity成员变量的序列化顺序;

[0014]自定义Unity成员变量的序列化顺序。

[0015]优选的,在上述的手游热更新方法中,取消记录在APK中的Unity成员变量的序列化顺序的步骤包括:在利用Unity编辑器编译时,打开NONE_SEARIALIZE编译开关,以关闭Unity自定义的数据序列化功能。

[0016]优选的,在上述的手游热更新方法中,自定义Unity成员变量的序列化顺序的步骤包括:在利用Unity编辑器编译时,将SerialBehav1r的对象数据导出为自定义的Unity成员变量的序列化数据。

[0017]优选的,在上述的手游热更新方法中,所述自定义的Unity成员变量的序列化数据以.bytes文件形式存储。

[0018]在本发明提供的手游热更新方法中,通过修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新。然后再修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配,从而实现所述运行代码和资源的热更新,使得游戏分区更新和版本回退得以实现。提高了游戏开发的效率,也提高了游戏玩家的体验。

回复

使用道具 举报

16

主题

38

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
 楼主| 发表于 2016-12-3 05:52:32 | 显示全部楼层
附图说明

[0019]图1为本发明实施例中手游热更新方法的流程图;

[0020]图2为本发明实施例中通过手游热更新方法而实现Unity        3D游戏热更新的流程图。

具体实施方式

[0021]下面将结合示意图对本发明的具体实施方式进行更详细的描述。根据下列描述和权利要求书,本发明的优点和特征将更清楚。需说明的是,附图均采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施例的目的。

[0022]本发明实施例提供了一种手游热更新方法,具体的,如图1所示,包括:

[0023]        SI:修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新。

[0024]        在Android系统中,Unity3D的游戏逻辑代码是以DLL文件形式存储在APK中,而APK一旦安装则无法修改。因此,为了实现可执行文件的动态更新替换,即DLL文件的热更新,必须避开从APK加载的方式,而采用从外部目录加载的方式。

[°°25]申请人经过研究发现,所述DLL文件的加载是通过I ibmon0.so文件中的mono_image_open_from_data_with_name函数实现的。只需要将所述DLL文件的载入函数进行修改替换,就可以达到修改所述DLL文件的加载路径的目的。

[0026]        进一步的,通过Hook运行时修改代码的方式实现了libmon0.so文件中的载入函数mono_image_open_from_data_with_name的替换。在替换文件中自定义所述DLL文件的加载路径,使得所述DLL文件按照指定目录加载,从而实现所述运行代码按照指定目录加载。从而使得在APK安装后,可以加载DLL文件,以实现DLL文件的热更新,即所述运行代码的热更新。

[0027]在本实施例中,所述I        ibmon0.so文件是基于C++语言开发的,所述DLL文件是基于C#语言开发的,所述DLL文件的下载过程是通过JAVA语言实现的。在本发明的其他实施例中,所述I ibmon0.so文件还可以基于C或者其他计算机语言进行开发,所述DLL文件还可以基于C/C++、JAVA或者其他计算机语言进行开发,同样,所述DLL文件的下载过程也可以通过C#语言、C/C++或者其他计算机语言进行开发,在此不再赘述。

[0028]        S2:修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配。

[0029]原生的Unity会将Monobehav1r的子类的所有成员变量进行序列化,数据部分保存在.prefab文件中,序列化顺序则记录在APK包中。由于APK包在安装完毕之后,就无法修改,则如果仅仅实现了所述运行代码的热更新,将出现资源与所述运行代码不匹配的问题。因此必须使用与所述运行代码匹配的序列化方式替代原有的序列化方式。

[0030]具体的,首先,需要取消记录在APK中的Unity成员变量的序列化顺序。即在利用Unity编辑器编译时,打开所述Unity编辑器的NONE_SEARIALIZE编译开关,以关闭Unity自定义的数据序列化功能,从而使得所述Unity自定义的数据序列化顺序无效,即实现取消记录在APK中的Unity成员变量的序列化顺序。

[0031 ]其次,在利用Unity编辑器编译时,将SerialBehav1r的对象数据导出为自定义的Unity成员变量的序列化数据,且所述自定义的Unity成员变量的序列化数据以.bytes文件形式存储。

[0032]        而当手机游戏运行时,在载入SerialBehav1r之后,载入所述.bytes文件以还原所述SerialBehav1r的实际对象属性,使得所述资源与所述运行代码向匹配。

[0033]在实现所述运行代码和资源的热更新之后,即可实现游戏的分区更新以及版本回退,提尚玩豕的体验。

[0034]        通过手游热更新方法而实现Unity 3D游戏热更新的流程如下:

[0035]步骤SOOl:启动游戏。

[0036]步骤S002:判断本地的临时目录下是否有DLL文件,如果有,直接将所述DLL文件复制到Un i ty的可载入目录,然后启动所述Un i ty;如果没有,则直接启动所述Un i ty。

[0037]        步骤S003:通过所述Unity访问区服务器的web接口,并通过选择界面选择区服务器。

[0038]        步骤S004:下载所选择的区服务器上的版本号。

[0039]步骤S005:判断所选择的区服务器上的版本号与本地所存储的版本号是否一致,如果一致,则开始游戏;如果不一致,分析所选择的区服务器上的版本号与本地所存储的版本号之间的差异,下载差异文件包。

[0040]在这个过程中,通过本发明所提供的手游热更新方法以实现游戏运行代码和资源的热更新。

[0041]步骤S006:将下载的差异文件包解压并存储在本地的临时目录上,然后重启客户端APK,重新启动游戏即可。

[0042]需要说明的是,本发明不仅适用于Android系统,还适用于Iinux、1S系统及其他系统,只是在linux、10S系统以及其他系统中,由于平台机制不同,所调用的文件以及函数名称不同,但是原理一致,在此不再赘述。

[0043]综上,在本发明实施例提供的手游热更新方法中,通过修改运行代码的加载路径,使得所述运行代码按照指定目录加载,以实现所述运行代码的热更新。然后再修改Unity成员变量的序列化方式,使得所述Unity成员变量按照指定方式序列化,以实现资源与所述运行代码的匹配,从而实现所述运行代码和资源的热更新,使得游戏分区更新和版本回退得以实现。提高了游戏开发的效率,也提高了游戏玩家的体验。

[0044]上述仅为本发明的优选实施例而已,并不对本发明起到任何限制作用。任何所属技术领域的技术人员,在不脱离本发明的技术方案的范围内,对本发明揭露的技术方案和技术内容做任何形式的等同替换或修改等变动,均属未脱离本发明的技术方案的内容,仍属于本发明的保护范围之内。

分类
国际分类号        G06F9/445
法律事件
日期        代码        事件        说明
2016年4月13日        C06        Publication       
2016年5月11日        C10        Entry into substantive examination       

公开号        CN105487885 A
发布类型        申请
专利申请号        CN 201510819844
公开日        2016年4月13日
申请日期        2015年11月23日
优先权日        2015年11月23日
发明者        谈欣诚, 金鑫, 王耀松, 黄皓
申请人        盛趣信息技术(上海)有限公司
导出引文        BiBTeX, EndNote, RefMan
分类 (1), 法律事件 (2)
外部链接:  中国国家知识产权局, 欧洲专利数据库 (Espacenet)

http://www.google.com/patents/CN105487885A?cl=zh
回复

使用道具 举报

16

主题

38

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
 楼主| 发表于 2016-12-3 06:46:02 | 显示全部楼层
当然,这个办法,很多人都想到了,只是上述人申请了专利。没有公开具体的算法实现细节。这里有一篇公开算法的博文。
http://blog.csdn.net/qq_27772057/article/details/51945700
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2016-12-3 09:44:08 | 显示全部楼层
没有广泛应用,你愿意做小白鼠?
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

16

主题

38

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
 楼主| 发表于 2016-12-3 11:10:25 | 显示全部楼层
哦:P:P:P:P
回复

使用道具 举报

9

主题

40

帖子

223

积分

中级会员

Rank: 3Rank: 3

积分
223
发表于 2017-1-1 21:37:55 | 显示全部楼层
Unity不开源跟ulna优不优雅有啥关系?之前实现过Unity上的JS热更新方案,UnityJSBinding,没受到Unity不开源的影响。JS的解释器是SpiderMonkey,直接编译成动态库就能在Unity里用了。在我看来lua的实现方式应该跟js的差不多。
回复

使用道具 举报

9

主题

40

帖子

223

积分

中级会员

Rank: 3Rank: 3

积分
223
发表于 2017-1-1 21:41:20 | 显示全部楼层
kbe 发表于 2016-12-3 09:44
没有广泛应用,你愿意做小白鼠?

在我们JSB内部群里,就有人在用类似的那个所谓专利的方案,当然他们也都发现了这些方法都不如JS方便。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2018-12-11 17:43 , Processed in 0.036522 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表