Unity手游之路<十三>手游代码更新策略探讨
http://blog.csdn.net/janeky/article/details/25923151
这几个月公司项目非常忙,加上家里事情也多,所以blog更新一直搁置了。最近在项目开发上线过程中遇到了一些新问题,接下来的时间和大家多多探讨学习。大家在工作中遇到技术问题,或者有什么想分享的,欢迎多多探讨 ken@iamcoding.com.
-------------------------------------------------------------------------------------------------------------------------------------------------------------
之前我们已经学过手机游戏的资源热更新策略了。在实际手游的开发运营中,我们需要经常修复bug,增加新玩法。这些通常都涉及到代码的更新。unity游戏代码的更新比较复杂,也存在不同的更新策略,各有优缺点,在不同的平台上做法也不尽相同。这里主要谈一些比较常用的策略和各大手机平台上的策略。大家有更好的思路,欢迎探讨。
(转载请注明出处 http://blog.csdn.net/janeky/article/details/25923151)
- 反射
大部分编程语言都是支持反射的,利用反射,可以动态去加载所需的程序。C#也是同样可以用反射来实现。要实现代码的更新,我们在项目初期就要做好规划,将一些容易变更的业务逻辑代码独立划分。每次更新时,将代码打包成dll,再打包成资源文件。程序启动时,检查更新到客户端,客户端通过反射重新加载代码运行。下面通过一个简单的demo来演示。
1.在vs中新建一个代码库工程,命名为test
2.添加几个类Scirpt,Scirpt2,Data
3.将这个项目生成DLL,test.dll
4.新建一个unity项目,将DLL倒入到Asset,改名为test.bytes,不然可能会报错
5.利用我们之前实现过的打包脚本,将test.bytes打包成test.assetbundle。
6.创建CodeUpdate.cs脚本,用于加载代码资源,反射调用。
7.为了验证代码更新后,可以直接加载使用,我们可以更改一下Data.cs的代码,重复以上过程,可以看到,更新了代码打包后,我们重新运行游戏,就可以看到效果
Data.cs
- public class Data
- {
- private int attr;
- public Data()
- {
- attr = 2;
- }
- public override string ToString()
- {
- return attr.ToString();
- }
- }
Script.cs
- public class Script: MonoBehaviour
- {
- void Start()
- {
- Debug.Log("------------------I am script 1");
- Data data = new Data();
- Debug.Log("-------------" + data.ToString());
- }
- }
CodeUpdate.cs
- using UnityEngine;
- using System.Collections;
- using System;
- public class CodeUpdate : MonoBehaviour {
- private static readonly string DLL_URL = "file:///c:/test.assetbundle";
- void Start () {
- StartCoroutine(loadDllScript());
- }
- private IEnumerator loadDllScript()
- {
- WWW www = new WWW(DLL_URL);
- yield return www;
- AssetBundle bundle = www.assetBundle;
- TextAsset asset = bundle.Load("test",typeof(TextAsset)) as TextAsset;
- System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(asset.bytes);
- Type script1 = assembly.GetType("Script");
- GameObject obj = new GameObject();
- obj.AddComponent(script1);
- Type script2 = assembly.GetType("Script2");
- obj.AddComponent(script2);
- }
- }
- 完整安装包更新
大部分的app更新都是采用完整包更新。在程序启动的时候,检查服务器的最新版本,如果比本地的版本要新,就下载服务器的版本,重新安装替换本地的程序。在IOS平台上,是由App Store来统一管理的。客户端程序只需检查版本,跳转到app store页面即可。android 平台的更新更灵活,略微复杂。在判断版本号,确定要更新后,直接就可以下载服务器的最新的apk文件,安装替换本地的。这里就不演示代码了。大家先理清楚思路,流程,就容易实现了。
- LUA脚本更新
LUA一直是一种很神奇的脚本语言,无处不在,服务端,客户端,大型机,嵌入式设备都能看到它的踪影。虽然Unity3d官方不支持Lua脚本,但是已经有人写了c#版本的lua解析器了。我们可以将业务代码用Lua来实现。每次要更新代码的时候,只要将lua当做资源文件更新到客户端,运行即可。
C#版 Lua,有很多个版本,这里选择云风他们公司开源的UniLua,大家可以去Githunb下载
https://github.com/xebecnan/UniLua/wiki
- IOS平台
比较遗憾,IOS是一个封闭的平台,所以它对app程序监管比较严格,一般情况下不运行热更新,每次版本更新都需要提交审核。所以涉及到手游代码的更新,都是采用完整包更新。LUA脚本更新的方式,有朋友试过说可以(他们一般是在程序上线一段时间后才使用Lua更新)。但是也存在风险的,如果被苹果发现,是属于违规的。这里不建议使用。
- Android平台
目前比较通用的方式是用代码dll反射更新机制。我们在实际过程中,将稳定不变的底层代码单独规划,用作游戏的主程序。全部业务逻辑代码发布时候,打包成dll,制成资源文件。客户端下载后,反射加载。只有当底层主程序要更新是,才单独下载主程序的apk文件,重新安装替换。平时的代码更新,可以随意更新代码dll
- 总结
上面说的几种方式,各有优缺点。在不同的平台上策略也不尽相同。说一下我的经验:一般是优先发布android版本,有问题随时热更新代码调试。待版本稳定后,发布ios越狱版本。全部稳定后,最后才发布app store。众所周知,app store的审查周期比较长,有可能他们员工去休个假,几个星期才审核通过:)。每次审核不通过,又得重新修改提交审查,又是漫长的等待。在游戏界,时间就是生命。我们尽量在android平台上调试版本。
ps.大家有什么好的Unity3d技术点想讨论的,欢迎告知,我今后将会多多写一下大家比较感兴趣的实战内容。
最后祝大家工作顺利,项目大卖~。
Unity手游之路<十三>手游代码更新策略探讨的更多相关文章
- Unity手游之路手游代码更新策略探讨
版权声明: https://blog.csdn.net/janeky/article/details/25923151 这几个月公司项目非常忙.加上家里事情也多,所以blog更新一直搁置了. 近期在项 ...
- Unity手游之路<十二>手游资源热更新策略探讨
http://blog.csdn.net/janeky/article/details/17666409 上一次我们学习了如何将资源进行打包.这次就可以用上场了,我们来探讨一下手游资源的增量更新策略. ...
- [转]Unity手游之路<十二>手游资源热更新策略探讨
最近梳理了下游戏流程.恩,本来想写下,但是,还是看前辈的吧 版权声明: https://blog.csdn.net/janeky/article/details/17666409 上一次我们学习了如何 ...
- 【学习】Unity手游之路<十二>手游资源热更新策略探讨
http://blog.csdn.net/janeky/article/details/17666409 =============================================== ...
- [unity3d]手游资源热更新策略探讨
原地址:http://blog.csdn.net/dingxiaowei2013/article/details/20079683 我们学习了如何将资源进行打包.这次就可以用上场了,我们来探讨一下手游 ...
- Unity手游之路<七>角色控制器
Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...
- python手写神经网络实现识别手写数字
写在开头:这个实验和matlab手写神经网络实现识别手写数字一样. 实验说明 一直想自己写一个神经网络来实现手写数字的识别,而不是套用别人的框架.恰巧前几天,有幸从同学那拿到5000张已经贴好标签的手 ...
- 喵的Unity游戏开发之路 - 玩家控制下的球的滑动
- 喵的Unity游戏开发之路 - 推球:游戏中的物理
很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...
随机推荐
- php 简单分页类
/** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 privat ...
- WinRAR压缩
WinRAR压缩软件: ------------------ 软件官网:http://www.winrar.com.cn/ -------------------------------
- Ztree的简单使用和后台交互的写法(二)
针对Ztree的简单使用和后台交互的写法(一)中的树进行改进 1.增加节点的权限 由页面的当前用户,决定树的根节点 然后动态获取树的详细节点: 初始化函数为: function init(){ //初 ...
- Ruby on rails学习笔记——安装环境
出现问题: C:\Users\len>gem install rails ERROR: While executing gem ... (Gem::RemoteFetcher::FetchErr ...
- 字符串哈希函数(String Hash Functions)
哈希函数举例 http://www.cse.yorku.ca/~oz/hash.html Node.js使用的哈希函数 https://www.npmjs.org/package/string-has ...
- Mono
mono (Novell公司开发的跨平台·NET运行环境) http://baike.baidu.com/link?url=iGl5T4-pmpJwB01mQxHq95bJcrCvR_JMNNfP0u ...
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 | 被围观 25,969 views+ 1.Anno ...
- thinkphp 3.2.3 连接sql server 2014 WAMPSERVER环境包
安装 sqlsrv 扩展 首先 sql server 2014 安装没啥说的 链接信息自己设置 php 版本 :5.5.12 sqlsrv 驱动 微软提供了 3.0 和3.1 版本 3.0 对应 ...
- Ubuntu 源码安装 nginx 1.9.2
安装前准备: //更新系统 1.sudo apt-get update //安装pcre包 2.sudo apt-get install libpcre3 libpcre3-dev 3.sudo ...
- mysql主从复制(超简单)
mysql主从复制(超简单) 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作: 1.1.版本一致 1.2.初始化表,并在后台启动mysql ...