一、為外掛設定平臺的方法
unity5之前,是通過把外掛搞到對應目錄進行區分平臺的(比如在build target是ios平臺時只把IOS目錄的外掛build進去),unity5之後提供了設定平臺/cpu架構的方式,外掛位置就隨意了;
在unity5中點選外掛檔案,那些字尾為dll,so,jar,cpp,a,mm等檔案和字尾是“ .plugin, .bundle and .framework”的資料夾,會被識別為plusins,其inspector可設定平臺等。
二、不同平臺使用外掛的方式
A.嵌入外部或本地外掛(前者包括dll,so,bundle等庫的形式,後者包括h,cpp,m,jar等原始碼的形式):
B.為不同平臺寫外掛時的方案:
共同點:寫外掛時,如果外掛是用c++/oc實現,需要用解決名稱重整問題:
extern "C" { float FooPluginFunction ();}
不同點:
1.如果是給desktop平臺使用,則需要把原始碼分別在macos,window,linux下編譯生成.bundle(通過xcode建立),dll,.so檔案,然後分別設定平臺,c#宣告後即可使用
2.如果是給IOS平臺使用,有2種方式:
1)(lib)把原始碼在xcode下編譯成.a檔案,然後設定平臺,c#宣告後即可使用
2)(原始碼)unity切成ios平臺後會在專案內生成xcode專案,我們可以在其Classes資料夾放入原始碼,c#宣告後即可使用,這裡有幾個tip需要記錄:
a.原始碼向unity傳送資訊:UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");
b.unity的指令碼函式必須是void MethodName(message:string) 格式,且此方法非同步且有一幀延遲
c.從unity呼叫原始碼介面通過c#宣告的入口呼叫,屬於託管到非託管,故比較耗;
d.從一個本地方法返回的字串值應該是UTF-8編碼的,並且分配在堆上。Mono marshaling calls are free for strings like this.
e.一般原始碼放在unity生成的xcode專案的classes目錄,但也可以在Asset或其子目錄存放,然後在xcode那裡引用之。
f.此嵌入方法估計用來做sdk互動。
3.如果給Android平臺使用,也有2種方式:
1)(lib,必須是c/c++才能使用)把原始碼在ndk下編譯成.so檔案,設定平臺,c#宣告後即可使用
2)以aar,android lib,jar方式(第一種所有檔案都在.aar檔案裡,後2種包括.jar,res,Manifest等多個檔案)存原始碼。通過下面方法和java互動:
a.在unity中用AndroidJavaClass和AndroidJavaObject來向java傳送訊息
b.java那邊需要,
I.首先找到Unity Android附帶的classes.jar(Unity\Editor\Data\PlaybackEngines\AndroidPlayer\bin);
II.基於classes.jar編寫我們自己的java程式碼,即新增classes.jar到類路徑用於編譯我們自定義的activity;
(classes.jar裡面有java和unity互動的底層實現,比如com.unity3d.player.UnityPlayerActivity的實現,我們自定義的activity需要繼承它才能接受unity的訊息)
III.由此產生的.class檔案應該被壓縮到一個.jar檔案中和並放置在Assets->Plugins->Android資料夾;
IV.建立一個新的AndroidManifest.xml,決定要啟動哪個活動,申請許可權等。AndroidManifest.xml檔案也放置在Assets->Plugins->Android資料夾。
C.總結:
1.一個外掛要給某個平臺使用需要特別給該平臺產生編譯檔案。
2.如果某個外掛只是給個別平臺使用,需要在c#呼叫外掛介面時判斷一下平臺是否對應,避免白白消耗。
if (Application.platform == RuntimePlatform.IPhonePlayer)
3.對android,sdk一般是java寫的,所以一般用第二種方式,對ios,可以用Lib方式,也可以用原始碼方式。
D.不同平臺嵌入lib外掛格式:
IOS:
[DllImport ("__Internal")]
private static extern float FooPluginFunction ();
Android/standalone:
[DllImport ("PluginName")]
private static extern float FooPluginFunction ();
三、總結:以上只是討論了外掛在在unity中的相關問題,沒有涉及外掛原資料本身如何建立,這個就需要各個平臺專攻了,這裡不能探索。