Unity手遊之路<十三>手遊代碼更新策略探討

(轉載請註明出處 
http://blog.csdn.net/janeky/article/details/25923151


android

  • 反射


  大部分編程語言都是支持反射的,利用反射,能夠動態去加載所需的程序。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


ios

[C#]  純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
public class Data
{
private int attr;
public Data()
{
attr = 2;
}
public override string ToString()
{
return attr.ToString();
}
}


  Script.cs


git

[C#]  純文本查看 複製代碼
?
1
2
3
4
5
6
7
8
9
public class Script: MonoBehaviour
{
void Start()
{
Debug.Log( "------------------I am script 1" );
Data data = new Data();
Debug.Log( "-------------" + data.ToString());
}
}



  CodeUpdate.cs




github

[C#]  純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
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更新都是採用完整包更新。在程序啓動的時候,檢查服務器的最新版本,若是比本地的版本要新,就下載服務器的版本,從新安裝替換本地的程序。在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






c#

  • IOS平臺


  比較遺憾,IOS是一個封閉的平臺,因此它對app程序監管比較嚴格,通常狀況下不運行熱更新,每次版本更新都須要提交審覈。因此涉及到手遊代碼的更新,都是採用完整包更新。LUA腳本更新的方式,有朋友試過說能夠(他們通常是在程序上線一段時間後才使用Lua更新)。可是也存在風險的,若是被蘋果發現,是屬於違規的。這裏不建議使用。






服務器

  • Android平臺


  目前比較通用的方式是用代碼dll反射更新機制。咱們在實際過程當中,將穩定不變的底層代碼單獨規劃,用做遊戲的主程序。所有業務邏輯代碼發佈時候,打包成dll,製成資源文件。客戶端下載後,反射加載。只有當底層主程序要更新是,才單獨下載主程序的apk文件,從新安裝替換。平時的代碼更新,能夠隨意更新代碼dll



app

  • 總結


  上面說的幾種方式,各有優缺點。在不一樣的平臺上策略也不盡相同。說一下個人經驗:通常是優先發布android版本,有問題隨時熱更新代碼調試。待版本穩定後,發佈ios越獄版本。所有穩定後,最後才發佈app store。衆所周知,app store的審查週期比較長,有可能他們員工去休個假,幾個星期才審覈經過:)。每次審覈不經過,又得從新修改提交審查,又是漫長的等待。在遊戲界,時間就是生命。咱們儘可能在android平臺上調試版本。



ps.你們有什麼好的Unity3d技術點想討論的,歡迎告知,我從此將會多多寫一下你們比較感興趣的實戰內容。
  最後祝你們工做順利,項目大賣~。編程語言

相關文章
相關標籤/搜索