1. 程式人生 > >Unity手遊之路手遊代碼更新策略探討

Unity手遊之路手遊代碼更新策略探討

icon 大型機 git sheet 安裝包 中新 svg sdn 情況

版權聲明: 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手遊之路手遊代碼更新策略探討