Unity手遊之路手遊代碼更新策略探討
這幾個月公司項目非常忙。加上家裏事情也多,所以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
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腳本更新
盡管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手遊之路手遊代碼更新策略探討