2013-10-31 48 views
2

我知道爲Unity創建插件的基本前提是爲您想要在Unity內調用的所有類創建包裝。但是,我發現的所有文檔和示例都預期會有相應的.cpp(如果是C++)或.mm(如果是objective-c)文件。適用於Unity的iOS插件

但是,我試圖創建一個插件的一些本地iOS代碼,不包含任何源文件。我有權訪問的是四個頭文件和一個.a文件。 Which I have gotten from here.

現在,因爲我沒有任何.mm文件來包裝我有點困惑,我怎麼能把這些文件引入到Unity中,以便我可以從內部調用它們。有沒有人曾經這樣做過?

有人可以指向我的某些文檔或任何可能幫助我將4個頭文件和.a文件引入Unity的插件嗎?

請記住,我沒有任何源文件可以訪問。只有頭文件本身。

回答

2

你不需要源文件,即使頭文件不需要,只要你知道函數的聲明。

Building Plugins for iOS描述:

1)把你的某文件中的資產/插件/ iOS的

2)看看頭文件來得到你所需要的如函數簽名

public class IPodHandler { 
    [DllImport("__Internal")] 
    private static extern void RegisterUnityIPodCallbackListener (string gameObject, string method); 
    public static void MyRegisterUnityIPodCallbackListener() { 
     if (Application.platform == RuntimePlatform.IPhonePlayer) { 
      RegisterUnityIPodCallbackListener (GAME_OBJECT, METHOD); 
     } 
    } 
} 

4.)調用在適當的位置:

IPodHandler.MyRegisterUnityIPodCallbackListener ("MyCallbackGameObject", "MyCallbackMethod"); 

常見的問題:

    void RegisterUnityIPodCallbackListener (const char* gameObject, const char* method); 
    

    3)通過C#類內聲明RegisterUnityIPodCallbackListener

  • 你不應該建立資產/插件中的目錄結構/ iOS版,否則文件不會在編輯器中播放
1

這裏測試時複製到生成的Xcode項目

  • 提供一個備用解決方案是另一位導遊:How to build Unity3d Plugin for iOS

    的幾個注意事項,如果你得到一個錯誤的東西,如「爲架構未定義的符號......」

    1)確保在.A文件所使用的體系結構相匹配你的(例如ARMv7的)

    2)確保.a文件是使用libstdC++(GNU C++標準庫)編譯的,因爲Unity需要它。

  • +0

    是否真的需要2號?我想構建一個使用各種C++ 11功能的靜態庫,所以我一直在使用libC++(支持C++ 11的LLVM C++標準庫)。 雖然我無法獲得最終的Unity XCode項目鏈接,但如果#2屬實,我看不到解決方案。 – dimitrios

    1

    您正在使用的Estimote SDK具有ObjectiveC類。 ObjectiveC中的函數不能直接通過Unity插件調用(或者C++類就可以)。原因是函數名稱是managled when you compile

    Unity C#類和庫之間的接口必須是純C接口。這就是爲什麼經常存在.mm或者。cpp文件沿a.a文件。這些是將C++或ObjectiveC類封裝在純C包裝中。

    由於大多數Estimote函數似乎都是類函數,因此您的工作稍微簡單一些。所以你不需要編寫包裝函數來創建和刪除NSObjects。

    這裏是我寫的一個例子,一個圍繞TestFlightSDK的純C包裝。

    注意extern「C」代碼塊,強制文件代碼被編譯時沒有名稱修改。一個c函數簽名,然後是函數內的一個ObjectiveC調用。

    因此,使用Esitmote ESTBeacon class作爲一個例子

    ,該connectToBeacon調用可能是這樣的:

    extern "C" { 
        void ESTBeacom_Connect() 
        { 
         [ESTBeacon connectToBeacon]; 
        } 
    } 
    

    而且功能的.cs是這樣的:

    class ESTBeacon { 
        [DllImport ("__Internal")] 
        private static extern void ESTBeacon_Connect(); 
    
        public static void Connect() { 
         if(Application.platform == RuntimePlatform.IPhonePlayer) 
          ESTBeacon_Connect()    
        } 
    } 
    

    把的.cs。 mm和.a插件/ iOS文件,你會很好。

    使用此參考瞭解如何傳遞各種數據類型。 http://www.mono-project.com/Interop_with_Native_Libraries

    相關問題