unity手游之路手游代码更新策略探讨(代码片段)

mqxnongmin mqxnongmin     2023-03-09     194

关键词:

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

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

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

大家在工作中遇到技术问题,或者有什么想分享的,欢迎多多探讨 [email protected]

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

之前我们已经学过手机游戏的资源热更新策略了。在实际手游的开发运营中,我们须要经常修复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基础组件有一些了解的,想知道怎么在项目中具体应用各种组件... 查看详情

小松教你手游开发unity系统模块开发unityassetbundle打包笔记(代码片段)

*最近项目更新了Unity5.5.2,顺便更新了项目的ui打包,也更新一下这边的笔记首先打包分为两部分,一部分是打包成Assetbundle包,一部分是从Assetbundle包解包出来成为可用的资源。首先说第一部分打包所有资源都可以打包,甚至不... 查看详情

小松教你手游开发unity系统模块开发热更(代码片段)

现在的手游项目如果没个热更新迭代根本跟不上,特别是像我们项目做mmo的更是需要经常改动代码。而现在的项目一般会选择用lua的方式实现热更新不过我们项目由于历史原因没有使用,用的是另外一种方案在项目里的所有GameOb... 查看详情

小松教你手游开发unity系统模块开发unity5.5.2ui打包assetbundle(代码片段)

之前已经有几篇文章写打包AssetBundle,但毕竟没有实际在项目中写过都写的比较浅。刚好最近项目更新Unity5.5.2就顺便由我来更新ui打包流程这里就把这次的经验写一下这里还是稍微解释一下打包的基本目的:打包ui就是把你做的... 查看详情

不再任人欺负!手游安全的进阶之路

本文由  网易云 发布。 Unity2018开发者大会如期而至。 每年的Unity大会都致力呈现以新锐技术与社区精神为核心的全新Unity生态圈,传播Unity最前沿的技术功能,帮助各类创意人才使用Unity进行高效的内容创作,... 查看详情

不再任人欺负!手游安全的进阶之路

Unity2018开发者大会如期而至。每年的Unity大会都致力呈现以新锐技术与社区精神为核心的全新Unity生态圈,传播Unity最前沿的技术功能,帮助各类创意人才使用Unity进行高效的内容创作,充分挖掘Unity潜力为各行业带来颠覆性的改... 查看详情

小松教你手游开发unity系统模块开发unity网络层读写(代码片段)

在unity做强联网游戏的时候一般会选择用tcp来做通信(据说有一种udp的传输具有更高的效率),而接收信息的方法上一般会选择新建一个线程循环读取。今天在我们项目上看到另外的一种方法。这里记录一下。首先建立tcp连接#usi... 查看详情

小松教你手游开发unity实用技能控制摄像头脚本(代码片段)

测试项目的时候经常用到的控制摄像头运动,简单的移动转向usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassController:MonoBehaviourprivateGameObjectgameObject;floatx1;floatx2;floatx3;floatx4;void 查看详情

小松教你手游开发unity实用技能线性差值计算实现(代码片段)

其实这个unity本身就有的函数Mathf.Lerp(),为什么还要自己实现呢。有一个原因就是这个函数返回的是float型,float型如果数字非常大,转出int时会有精度丢失,也就是转出来的值不对。而且非常简单。看下公式publicintLerp(inta,intb,int... 查看详情

如何规避适配风险?以《乱世王者》为例,探秘手游兼容性测试之路

...区项目背景《乱世王者》是一款历史架空背景的战争策略手游,最大程度的还原策略游戏的精髓的同时加入了RPG元素。作为腾讯首款战争策略手游,无论游戏性以及品质都达到了一个令人满意的程度,在正式上线一周内便成功达... 查看详情

从国产slg手游来说a星寻路算法(代码片段)

1.前文先说SLG是什么,SLG=SimulationGame,策略类游戏。现特指回合制策略游戏以及即时SLG。有别于SIM(Simulation)类“生活“模拟游戏,SLG虽然也是缩写的simulation(模拟但与经营类意思不同),却是... 查看详情

小松教你手游开发unity实用技能unity所有特殊文件夹的用途(转自雨松momo)(代码片段)

这里列举出手游开发中用到了所有特殊文件夹。Unity3D研究院之手游开发中所有特殊的文件夹-雨松MOMO程序研究院1.EditorEditor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以。比如目录:/xxx/xxx/Editor和/Editor是一... 查看详情

小松教你手游开发unity实用技能角色头部跟随镜头旋转(代码片段)

...转时,角色头部跟随镜头旋转。如天涯明月刀等。这个在手游上比较少见,不过实现也没什么区别。首先一般情况下,找到模型的头部节点,直接用lookAt指向camera就可以了,不过一般需求不会这么简单。比如说,超过头部扭动极... 查看详情

小松教你手游开发unity实用技能在gameobject前画一条线(代码片段)

在项目中有时候需要在scene里划线方面检查这里面有两点,划线和人物正前方的计算划线用LineRanderer人物正前方是go.transform.forward+go.transform.position人物的坐标加上人物的正前方方向(我一开始死脑筋的时候想着正前方就go.transform.... 查看详情

小松教你手游开发unity实用技能往avatar身边放置一个物体(随机)(代码片段)

在开发中时不时会用到这个需求,比如要放置一个宠物在身边,但是不能在自己身上。一个简单的方法Vector3pos=Vector3.zero;intangle=Random.Range(0,360);Vector3range=Quaternion.AngleAxis(angle,Vector3.up)*Vector3.back*1.5f;pos=pos+range;同理,如果想做一个... 查看详情

小松教你手游开发unity实用技能给每个gameobject的打开关闭加上一个渐变(代码片段)

在游戏开发中,经常会因为直接将GameObject,setActive的方式打开关闭,这种方式效果太过生硬而给它加上一个Tween可能是AlphaTween或者ScaleTween。再加上一个PlayTween来做控制。这样子需要在每个GameObject上加上这几个Component不说,还很... 查看详情

小松教你手游开发unity实用技能计算目标物体是否在自己的扇形视野范围(代码片段)

在做游戏开发中经常会需要到计算扇形的视野或者是受击范围的时候。其实这个分为两部分,第一部分是在扇形距离范围内(也就是不考虑角度,其实是圆形范围内)第二部分是扇形角度范围内第一部分很简单,Vector3.Distance(a,b)... 查看详情

unity实战之lol技能释放范围(代码片段)

前言最近英雄联盟手游开启不删档测试,对于忠实的lol玩家来说,又激起了我对手游的兴趣。赶紧趁着开服,果断删掉所有手游,清理一波内存,开启我的手游版lol体验。(没办法手机内存太小了)。果断跳过新... 查看详情