Unity3D使用C++(iOS平台上,C#调用C++函数)

一. 用户手册

Building an Application with a Native Plugin for iOS
为iOS创建一个带有本地插件的应用程序

用户手册里给出了一种简单的C#调用iOS C++本地插件的方式,概括步骤如下:
  • C#脚本中声明外部函数并调用
  • 导出Xcode工程
  • Xcode工程中新建.mm或者.cpp文件,实现函数

二. 示例

一个简单的例子:界面上有一个button,每点击一次,button上的数字+1

  1. Unity3D C#脚本中声明外部函数Add
using System.Runtime.InteropServices;
[DllImport ("__Internal")]
private static extern int Add(int x); //返回x+1
  • C#调用Add,并修改button上的text.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
using UnityEngine.UI;
public class ButtonControl : MonoBehaviour {
    public Text text;
    int cnt = 0;
    [DllImport ("__Internal")]
    private static extern int Add(int x);

    public void ButtonClick(){
        cnt = Add (cnt);
        text.text = "" + cnt;
    }
}
  • 导出Xcode工程,新建.mm(或.cpp)文件
    汇编后的C#代码和C++代码是在link阶段被链接到一起的。C++代码不需要.h头文件。
    代码要放在Classes目录下。修改Unity项目,以append方式导出、更新Xcode工程时,该文件夹不会被覆盖。

    Unity3D使用C++(iOS平台上,C#调用C++函数)_第1张图片

  • 编写Add.mm,C++实现函数
    提供给C#调用的C++接口需加上extern "c"(按C语言进行编译),否则会link失败。

extern "C"{
    int Add(int x){
        return x+1;
    }
};
  • build工程,下载测试

三. 参数传递

关于C#和C++数据类型的对应关系我也没有仔细研究过,不过网上资料应该挺多的。
我自己用到的有intdoublefloat,这几个基础类型C#和C++是一样的。

数组类型参数传递方式:

C#声明与调用

[DllImport("__Internal")]
private static extern bool PF(double[] p);
double[] params = new double[6];
if (!PF (params)) {
};

C++实现

 bool PF(double* params){
//……
   return true;
 }

你可能感兴趣的:(Unity3D使用C++(iOS平台上,C#调用C++函数))