Unity和iOS之间的桥接
为了在unity3d中使用插件,必须做两件事。
- 用基于C的语言编写函数并将其编译为库
- 创建一个C#脚本来调用库中的函数
要创建iOS插件,必须遵循五个步骤
- 创建一个新的unity3d项目
- 在Assets文件夹的Plugins文件夹中创建iOS文件夹
- 将iOS 文件分别放入其文件夹
- 编写C包装程序代码以将本机API公开给C#
- 点击“Assets - Export Package”菜单,将插件导出为unity3d包
桥接文件可以单独创建一个文件夹处理,也可以直接放在对象的桥接平台中创建
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系统中生效,[DllImport("__Internal")]意味着静态链接C包装器代码。
然后,创建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静态库
RegisterMonoModules.cpp:绑定了Unity本地代码与.NET
Info.plist:属性列表
由Unity的PlayerSettings管理,不应修改此文件。
Products文件夹:
生成执行文件所在目录
Frameworks文件夹:
外部库
PostProcessBuildAttribute
将此属性添加到在构建播放器后(build player)立即获取通知的方法。
PostProcessBuildAttribute可以选择从0开始在回调中提供顺序索引。如果您有多个PostProcessBuildAttribute回调,并且希望按特定顺序调用它们,则此方法很有用。回调从零开始按顺序调用。
网友评论