版权声明: https://blog.csdn.net/janeky/article/details/25923151

这几个月公司项目非常忙。加上家里事情也多,所以blog更新一直搁置了。

近期在项目开发上线过程中遇到了一些新问题,接下来的时间和大家多多探讨学习。

大家在工作中遇到技术问题,或者有什么想分享的,欢迎多多探讨 ken@iamcoding.com.

-------------------------------------------------------------------------------------------------------------------------------------------------------------

之前我们已经学过手机游戏的资源热更新策略了。在实际手游的开发运营中,我们须要经常修复bug,添加新玩法。这些通常都涉及到代码的更新。unity游戏代码的更新比較复杂,也存在不同的更新策略。各有优缺点。在不同的平台上做法也不尽同样。这里主要谈一些比較经常使用的策略和各大手机平台上的策略。

大家有更好的思路。欢迎探讨。

(转载请注明出处 http://blog.csdn.net/janeky/article/details/25923151)

  • 反射

大部分编程语言都是支持反射的,利用反射。能够动态去载入所需的程序。C#也是同样能够用反射来实现。

要实现代码的更新,我们在项目初期就要做好规划,将一些easy变更的业务逻辑代码独立划分。

每次更新时。将代码打包成dll,再打包成资源文件。程序启动时,检查更新到client,client通过反射又一次载入代码执行。以下通过一个简单的demo来演示。

1.在vs中新建一个代码库project,命名为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更新都是採用完整包更新。在程序启动的时候,检查server的最新版本号,假设比本地的版本号要新。就下载server的版本号。又一次安装替换本地的程序。在IOS平台上。是由App Store来统一管理的。client程序仅仅需检查版本号,跳转到app store页面就可以。android 平台的更新更灵活,稍微复杂。在推断版本号号,确定要更新后。直接就能够下载server的最新的apk文件,安装替换本地的。

这里就不演示代码了。

大家先理清楚思路,流程。就easy实现了。

  • LUA脚本更新

LUA一直是一种非常奇妙的脚本语言,无处不在,服务端。client,大型机,嵌入式设备都能看到它的踪影。

尽管Unity3d官方不支持Lua脚本,可是已经有人写了c#版本号的lua解析器了。我们能够将业务代码用Lua来实现。

每次要更新代码的时候,仅仅要将lua当做资源文件更新到client,执行就可以。

C#版 Lua。有非常多个版本号,这里选择云风他们公司开源的UniLua。大家能够去Githunb下载

https://github.com/xebecnan/UniLua/wiki

  • IOS平台

比較遗憾,IOS是一个封闭的平台,所以它对app程序监管比較严格。普通情况下不执行热更新,每次版本号更新都须要提交审核。所以涉及到手游代码的更新。都是採用完整包更新。

LUA脚本更新的方式,有朋友试过说能够(他们通常是在程序上线一段时间后才使用Lua更新)。可是也存在风险的,假设被苹果发现,是属于违规的。

这里不建议使用。

  • Android平台

眼下比較通用的方式是用代码dll反射更新机制。我们在实际过程中,将稳定不变的底层代码单独规划,用作游戏的主程序。

所有业务逻辑代码公布时候。打包成dll,制成资源文件。client下载后,反射载入。仅仅有当底层主程序要更新是,才单独下载主程序的apk文件。又一次安装替换。平时的代码更新,能够任意更新代码dll

  • 总结

上面说的几种方式,各有优缺点。在不同的平台上策略也不尽同样。说一下我的经验:通常是优先公布android版本号,有问题随时热更新代码调试。

待版本号稳定后,公布ios越狱版本号。

所有稳定后,最后才公布app store。众所周知,app store的审查周期比較长,有可能他们员工去休个假,几个星期才审核通过:)。每次审核不通过,又得又一次改动提交审查,又是漫长的等待。在游戏界,时间就是生命。我们尽量在android平台上调试版本号。

ps.大家有什么好的Unity3d技术点想讨论的,欢迎告知。我今后将会多多写一下大家比較感兴趣的实战内容。

最后祝大家工作顺利,项目大卖~。

Unity手游之路手游代码更新策略探讨的更多相关文章

  1. Unity手游之路<十三>手游代码更新策略探讨

    http://blog.csdn.net/janeky/article/details/25923151 这几个月公司项目非常忙,加上家里事情也多,所以blog更新一直搁置了.最近在项目开发上线过程中 ...

  2. Unity手游之路<十二>手游资源热更新策略探讨

    http://blog.csdn.net/janeky/article/details/17666409 上一次我们学习了如何将资源进行打包.这次就可以用上场了,我们来探讨一下手游资源的增量更新策略. ...

  3. [转]Unity手游之路<十二>手游资源热更新策略探讨

    最近梳理了下游戏流程.恩,本来想写下,但是,还是看前辈的吧 版权声明: https://blog.csdn.net/janeky/article/details/17666409 上一次我们学习了如何 ...

  4. 【学习】Unity手游之路<十二>手游资源热更新策略探讨

    http://blog.csdn.net/janeky/article/details/17666409 =============================================== ...

  5. [unity3d]手游资源热更新策略探讨

    原地址:http://blog.csdn.net/dingxiaowei2013/article/details/20079683 我们学习了如何将资源进行打包.这次就可以用上场了,我们来探讨一下手游 ...

  6. Unity手游之路<七>角色控制器

    Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...

  7. python手写神经网络实现识别手写数字

    写在开头:这个实验和matlab手写神经网络实现识别手写数字一样. 实验说明 一直想自己写一个神经网络来实现手写数字的识别,而不是套用别人的框架.恰巧前几天,有幸从同学那拿到5000张已经贴好标签的手 ...

  8. 喵的Unity游戏开发之路 - 玩家控制下的球的滑动

  9. 喵的Unity游戏开发之路 - 推球:游戏中的物理

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

随机推荐

  1. ubuntu server 14.04 LTS下搭建LAMP环境之最详细笔记之一U盘安装双系统

    前言: 一直在WIN上使用PHP,不喜欢用WAMP,每次都是手动在windows配置环境,偶尔有一次装了小红帽玩了两天,感觉不是很习惯就换了回来,过了没几天见讨论LAMP环境,于是安装了ubuntu的 ...

  2. 百度umeditor富文本编辑器插件扩展

    富文本编辑器在WEB开发中经常用到,个人比较喜欢用百度出的ueditor这款,ueditor这款本身支持插件扩展的,但是ueditor的mini版本 umeditor 就没有那么方便了,不过找了很多资 ...

  3. C++注入记事本升级版,给记事本弄爱心

    #include <iostream>; using namespace std; #include <windows.h>; #include <tlhelp32.h& ...

  4. 【常用配置】Spring框架web.xml通用配置

    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java. ...

  5. MEF 插件式开发之 WPF 初体验

    MEF 在 WPF 中的简单应用 MEF 的开发模式主要适用于插件化的业务场景中,C/S 和 B/S 中都有相应的使用场景,其中包括但不限于 ASP.NET MVC .ASP WebForms.WPF ...

  6. 汇编语言--微机CPU的指令系统(五)(数据传送指令)

    五.微机CPU的指令系统 1.汇编语言指令格式 汇编语言的指令格式如下: 指令助忆符 [操作数1 [, 操作数2 [, 操作数3]]] [;注释] 指令助忆符体现该指令的功能,它对应一条二进制编码的机 ...

  7. BZOJ2820: YY的GCD(反演)

    题解 题意 题目链接 Sol 反演套路题.. 不多说了,就是先枚举一个质数,再枚举一个约数然后反演一下. 最后可以化成这样子 \[\sum_{i = 1}^n \frac{n}{k} \frac{n} ...

  8. codechef QCHEF(不删除莫队)

    题意 题目链接 给出长度为\(n\)的序列,每次询问区间\([l, r]\),要求最大化 \(max |x − y| : L_i ≤ x, y ≤ R_i and A_x = A_y\) Sol 标算 ...

  9. 【读书笔记】iOS-处理内存警告

    -(void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; } 在这里你需要释放掉所有占用了很大内存的对象,如果你忽略了这个警告, ...

  10. python之while循环/格式化输出/运算符/初始编码/成员变量

    一.主要内容:1.while 循环 (难点)while 条件: 循环体 break: 直接跳出循环continue:停止当前本次循环,继续执行下一次循环.不会中断循环能让循环退出:(1)break ( ...