Unity Plugins的使用方法

bit小兵發表於2017-11-08

一、為外掛設定平臺的方法

  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中的相關問題,沒有涉及外掛原資料本身如何建立,這個就需要各個平臺專攻了,這裡不能探索。

轉載於:https://www.cnblogs.com/Tearix/p/7802251.html

相關文章