Unity和iOS之間的橋接
為了在unity3d中使用插件,必須做兩件事形导。
- 用基于C的語言編寫函數并將其編譯為庫
- 創(chuàng)建一個C#腳本來調用庫中的函數
要創(chuàng)建iOS插件,必須遵循五個步驟
- 創(chuàng)建一個新的unity3d項目
- 在Assets文件夾的Plugins文件夾中創(chuàng)建iOS文件夾
- 將iOS 文件分別放入其文件夾
- 編寫C包裝程序代碼以將本機API公開給C#
- 點擊“Assets - Export Package”菜單,將插件導出為unity3d包
橋接文件可以單獨創(chuàng)建一個文件夾處理,也可以直接放在對象的橋接平臺中創(chuàng)建
Assets
└── Plugins
├─ Bridge
└── iOS
├── UBaseAds.h
├── UBaseAds.mm
├── ......
iOS模塊
在iOS中我們有一個UBaseAds.h 的 和 一個UBaseAds.mm文件环鲤,這里的.mm文件已經通過轉義成C++
代碼,通過C語言去調用OC的方法實現
#import <Foundation/Foundation.h>
#import <ScorerAdManager.h>
#import "UBaseAds.h"
#ifdef __cplusplus
extern "C"
{
#endif
static ScorerAdManager *s_bbase_ad = NULL;
UIViewController *UnityGetGLViewController();
void ads_create() {
if (s_bbase_ad == NULL) {
s_bbase_ad = [ScorerAdManager shareInstance];
}
}
#ifdef __cplusplus
}
#endif
在這個.mm 文件中公開了C語言函數 ads_create()憎兽,然后冷离,如何在C#腳本中調用C函數?
using UnityEngine;
using System;
using System.Collections;
using System.Runtime.InteropServices;
using AOT;
namespace Ubase
{
#if UNITY_IOS && !UNITY_EDITOR
[DllImport("__Internal")]
private static extern void ads_create();
public Ads() {
ads_create();
}
#endif
}
宏UNITY_IPHONE意味著這些代碼僅在iOS系統(tǒng)中生效纯命,[DllImport("__Internal")]意味著靜態(tài)鏈接C包裝器代碼西剥。
然后,創(chuàng)建Ads()方法亿汞,這是其他C#腳本可以使用的真實接口瞭空。
額外補充:
如果我的iOS庫依賴于其他庫或框架,我該怎么辦疗我?
在unity3d項目中咆畏,導出到iOS將生成一個Xcode項目,然后您可以在其中添加依賴項吴裤。
導出為xcode的目錄解析
Classes文件夾:
Unity Runtime和ObjectC代碼
main.mm和AppController.mm:應用程序入口點
iPhone_Profiler.h:定義了啟用內部分析器(Internal Profiler)的編譯器條件句
Libraries文件夾:
已翻譯成ARM匯編程序的.NET程序集
libiPhone-lib.a:Unity Runtime靜態(tài)庫
RegisterMonoModules.cpp:綁定了Unity本地代碼與.NET
Info.plist:屬性列表
由Unity的PlayerSettings管理旧找,不應修改此文件。
Products文件夾:
生成執(zhí)行文件所在目錄
Frameworks文件夾:
外部庫
PostProcessBuildAttribute
將此屬性添加到在構建播放器后(build player)立即獲取通知的方法麦牺。
PostProcessBuildAttribute可以選擇從0開始在回調中提供順序索引钮蛛。如果您有多個PostProcessBuildAttribute回調,并且希望按特定順序調用它們剖膳,則此方法很有用魏颓。回調從零開始按順序調用吱晒。