zoukankan      html  css  js  c++  java
  • Unity手游之路手游代码更新策略探讨

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

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

  • 相关阅读:
    mac上finalShell的安装
    c 字符串与字符串操作
    .net5 MailKit
    c 99乘法表
    element 动态表单加自定义校验
    遇到的问题 vscode 问题
    vue-element-admin eslint 规则查询表
    利用html2canvas 导出网页 (只是用于自己的笔记,如果需要看配置,自行查找插件api)
    git 常用命令
    uniapp中自动打包微信小程序后自动上传代码
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10509618.html
Copyright © 2011-2022 走看看