zoukankan      html  css  js  c++  java
  • 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

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. public class Data  
    2. {  
    3.     private int attr;  
    4.   
    5.     public Data()  
    6.     {  
    7.         attr = 2;  
    8.     }  
    9.   
    10.     public override string ToString()  
    11.     {  
    12.         return attr.ToString();  
    13.     }  
    14. }  

    Script.cs

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. public class Script: MonoBehaviour  
    2. {  
    3.     void Start()  
    4.     {  
    5.         Debug.Log("------------------I am script 1");  
    6.         Data data = new Data();  
    7.         Debug.Log("-------------" + data.ToString());  
    8.     }  
    9. }  

    CodeUpdate.cs

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. using UnityEngine;  
    2. using System.Collections;  
    3. using System;  
    4.   
    5. public class CodeUpdate : MonoBehaviour {  
    6.       
    7.     private static readonly string DLL_URL = "file:///c:/test.assetbundle";  
    8.   
    9.     void Start () {  
    10.         StartCoroutine(loadDllScript());  
    11.     }  
    12.       
    13.     private IEnumerator loadDllScript()  
    14.     {  
    15.         WWW www = new WWW(DLL_URL);  
    16.         yield return www;  
    17.         AssetBundle bundle = www.assetBundle;  
    18.         TextAsset asset = bundle.Load("test",typeof(TextAsset)) as TextAsset;  
    19.           
    20.         System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(asset.bytes);  
    21.         Type script1 = assembly.GetType("Script");  
    22.         GameObject obj = new GameObject();  
    23.         obj.AddComponent(script1);  
    24.           
    25.         Type script2 = assembly.GetType("Script2");  
    26.         obj.AddComponent(script2);  
    27.     }  
    28. }  
    • 完整安装包更新

    大部分的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技术点想讨论的,欢迎告知,我今后将会多多写一下大家比较感兴趣的实战内容。

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

  • 相关阅读:
    git merge & git rebase 你用哪一个?
    [牛客题霸-高频算法面试题]一样的水
    [牛客题霸-高频算法面试题]那些插队的人
    解决ionic5多个模态关闭一个其他不显示的问题
    Selenium面试题+答案
    记删除AlibabaProtect.exe的经历
    免费的接口数据测试API
    删除重复的电子邮箱-leetcode
    firewall命令行详解
    将群晖恢复到出厂设置
  • 原文地址:https://www.cnblogs.com/123ing/p/4114842.html
Copyright © 2011-2022 走看看