一、為插件設置平台的方法
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中的相關問題,沒有涉及插件原數據本身如何創建,這個就需要各個平台專攻了,這里不能探索。
