(轉載請註明出處
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
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
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
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一直是一種很神奇的腳本語言,無處不在,服務端,客戶端,大型機,嵌入式設備都能看到它的蹤跡。雖然Unity3d官方不支持Lua腳本,可是已經有人寫了c#版本的lua解析器了。咱們能夠將業務代碼用Lua來實現。每次要更新代碼的時候,只要將lua當作資源文件更新到客戶端,運行便可。
C#版 Lua,有不少個版本,這裏選擇雲風他們公司開源的UniLua,你們能夠去Githunb下載
https://github.com/xebecnan/UniLua/wiki
c#
比較遺憾,IOS是一個封閉的平臺,因此它對app程序監管比較嚴格,通常狀況下不運行熱更新,每次版本更新都須要提交審覈。因此涉及到手遊代碼的更新,都是採用完整包更新。LUA腳本更新的方式,有朋友試過說能夠(他們通常是在程序上線一段時間後才使用Lua更新)。可是也存在風險的,若是被蘋果發現,是屬於違規的。這裏不建議使用。
服務器
目前比較通用的方式是用代碼dll反射更新機制。咱們在實際過程當中,將穩定不變的底層代碼單獨規劃,用做遊戲的主程序。所有業務邏輯代碼發佈時候,打包成dll,製成資源文件。客戶端下載後,反射加載。只有當底層主程序要更新是,才單獨下載主程序的apk文件,從新安裝替換。平時的代碼更新,能夠隨意更新代碼dll
app
上面說的幾種方式,各有優缺點。在不一樣的平臺上策略也不盡相同。說一下個人經驗:通常是優先發布android版本,有問題隨時熱更新代碼調試。待版本穩定後,發佈ios越獄版本。所有穩定後,最後才發佈app store。衆所周知,app store的審查週期比較長,有可能他們員工去休個假,幾個星期才審覈經過:)。每次審覈不經過,又得從新修改提交審查,又是漫長的等待。在遊戲界,時間就是生命。咱們儘可能在android平臺上調試版本。
ps.你們有什麼好的Unity3d技術點想討論的,歡迎告知,我從此將會多多寫一下你們比較感興趣的實戰內容。
最後祝你們工做順利,項目大賣~。編程語言