Unity和iOS之间的桥接

Unity和iOS之间的桥接
为了在unity3d中使用插件,必须做两件事。

  • 用基于C的语言编写函数并将其编译为库
  • 创建一个C#脚本来调用库中的函数

要创建iOS插件,必须遵循五个步骤

  1. 创建一个新的unity3d项目
  2. 在Assets文件夹的Plugins文件夹中创建iOS文件夹
  3. 将iOS 文件分别放入其文件夹
  4. 编写C包装程序代码以将本机API公开给C#
  5. 点击“Assets - Export Package”菜单,将插件导出为unity3d包

桥接文件可以单独创建一个文件夹处理,也可以直接放在对象的桥接平台中创建

Assets
└── Plugins
    ├─  Bridge
    └── iOS
        ├── UBaseAds.h
        ├── UBaseAds.mm
        ├── ......

iOS模块
在iOS中我们有一个UBaseAds.h 的 和 一个UBaseAds.mm文件,这里的.mm文件已经通过转义成C++
代码,通过C语言去调用OC的方法实现

#import 
#import 
#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回调,并且希望按特定顺序调用它们,则此方法很有用。回调从零开始按顺序调用。

你可能感兴趣的:(Unity和iOS之间的桥接)