一、unity 调用 Object-c

C/C++可以直接与Object-c交互,只要把文件后缀.m直接改成.mm,成为C/C++与Object-c混编文件.
C#又可以调用C/C++方法,所以C#就是可以与Object-c交互.
过程: C# 调用 C/C++ 调用 Object-c

1.C/C++调用Object-c

新建一个Test.mm文件,定义一个C风格接口函数。如:

Test.mm

  1. extern "C"{
  2.   void Log(char* arg){
  3.     // 这里可以调用object-c的函数了
  4.     // 如 [[ AlertView alloc] init]; ...
  5.   }
  6. }
  7. //或
  8. extern "C"{
  9.   void Log(char* arg);
  10. }
  11. void Log(char* arg){
  12.   // 这里可以调用object-c的函数了
  13.   // 如 [[ AlertView alloc] init]; ...
  14. }

将Test.mm文件放到unity工程的Assets/Plugins/iOS路径下

2.C#调用C/C++

新建TestPluginiOS.cs,如:

TestPluginiOS.cs

  1. #if UNITY_IOS && !UNITY_EDITOR//只在iOS平台下编译
  2. using UnityEngine;
  3. using System.Collections;
  4. using System;
  5. using System.Runtime.InteropServices;//DllImport在此命名空间下
  6.  
  7. public class UniWebViewPlugin {
  8. [DllImport("__Internal")]
  9. private static extern void Log(string arg);
  10. //1.访问权限不一定是private
  11. //2.必须是static
  12. //参数是string而不是char*
  13. }
  14. #endif

注意:参数是string而不是char*,关于C与C#参数类型映射关系 http://blog.csdn.net/yatusiter/article/details/9221861


二、Object-c调用C#

Object-c中直接使用该方法调用C#函数

  1. UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");
  2. //参数1:添加了要调用函数脚本组件的GameObject名
  3. //参数2:回调函数的名字
  4. //参数3:回调函数的参数

同Android开发中Java回调c#一样,三个参数都是字符串类型!但android开发中的第三个参数不能是null(若没有参数,可以用空字符串"",因为使用null程序会崩掉)

如果参数类型为NSString需要转换为UTF-8,如:

  1. NSString * url=@"www.qq.com";
  2. UnitySendMessage("GameObject1", "Log", [url UTF8String]);

官方介绍文档:https://docs.unity3d.com/Manual/PluginsForIOS.html


C#使用MonoPInvokeCallback,让C直接回调C#函数

.c文件

  1. typedef struct Parameter {
  2. int a;
  3. int b;
  4. } Param;
  5.  
  6. typedef void (*CallBack)(Param* p);
  7.  
  8. void TestFunc(CallBack cb){
  9. Param p;
  10. p.a = ;
  11. p.b = ;
  12. cb(&p);
  13. }

cs文件

  1. public class NewBehaviourScript : MonoBehaviour {
  2.  
  3. [StructLayout(LayoutKind.Sequential)]
  4. struct Parameter {
  5. public int a;
  6. public int b;
  7. }
  8.  
  9. delegate void CallBack(IntPtr param);
  10.  
  11. [DllImport("TestLib")]
  12. static extern void TestFunc(CallBack cb);
  13.  
  14. [MonoPInvokeCallback(typeof(CallBack))]
  15. static void CallBackFunc(IntPtr param) {
  16. var p = (Parameter)Marshal.PtrToStructure(param, typeof(Parameter));
  17. Debug.Log("a:" + p.a + " b:" + p.b);
  18. }
  19.  
  20. // Use this for initialization
  21. void Start () {
  22. TestFunc(CallBackFunc);
  23. }
  24.  
  25. // Update is called once per frame
  26. void Update () {
  27.  
  28. }
  29. }

更详细代码看这里:http://www.cnblogs.com/kingBook/p/6723620.html

 三、oc字符串与c字符串转换和拷贝

以下代码放置在extern "C"{}外

  1. NSString* MakeNSString (const char* string) {
  2. if (string) {
  3. return [NSString stringWithUTF8String: string];
  4. } else {
  5. return [NSString stringWithUTF8String: ""];
  6. }
  7. }
  8.  
  9. char* MakeCString(NSString *str) {
  10. const char* string = [str UTF8String];
  11. if (string == NULL) {
  12. return NULL;
  13. }
  14.  
  15. char* res = (char*)malloc(strlen(string) + );
  16. strcpy(res, string);
  17. return res;
  18. }

unity Object-c交互的更多相关文章

  1. [Unity3D]Unity3D游戏开发之Unity与Android交互调用研究

    各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...

  2. Unity与服务区交互数据

    Unity与服务区交互数据 Unity可能在用的时候使用到登陆等需要与服务器交互数据.今天尝试使用了WWW类和WWWForm类来实现Get请求与Post请求. 1.WWW Unity圣典解释: WWW ...

  3. Unity3D游戏开发之Unity与Android交互调用研究

    各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...

  4. Unity与IOS交互

    Unity IOS交互 @By 广州小龙  QQ群:63438968 环境:Mac os 10.9.2  Unity 4.2.1f4   Xcode 5.0.2 Unity IOS的交互我写过一个教程 ...

  5. Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

    刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息            使用的Unity ...

  6. Unity与Android交互实现

    主要参考了这篇文章: Unity与Android交互方案优化版 链接:https://www.jianshu.com/p/86b275da600e 自己的实现(unity获取内存和温度): andro ...

  7. unity与Android交互

    unity打包成安卓工程中的JAVA代码 public class UnityPlayerActivity extends Activity { //Unity中调用此函数 public int Ma ...

  8. Unity与web交互

    Unity在发布web时,重要的是Unity与Web的交互,参数的传递 1.unity调用网页js的函数:Application.ExternalCall js函数: <script langu ...

  9. 整理Lua和Unity和Lua交互文章链接

    重点文章: 1.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 2.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中) 3.Lua和C++交互详细总结 4. ...

  10. Unity和Android交互学习

    这段时间学习Unity和Android互调,从基础开始. 网上的教程有很多,浏览了一圈教程,发现目前有两种方式:一种是直接把 .aar文件导入Unity/Plugins/Android文件夹,另一种是 ...

随机推荐

  1. Microsoft Dynamics CRM 2011 如何导入组织

    一.首先备份数据库,还原数据库(前面SQL server 2008数据库的备份与还原(转)已经说明),这里就不说明了. 二.怎么删除组织? 先要在组织管理器里禁用组织,然后删除组织,再从数据库里删除. ...

  2. Javascript中的delete介绍

    关于JavaScript中的Delete一直没有弄的很清楚,最近看到两篇这方面的文章,现对两文中部分内容进行翻译(内容有修改和添加,顺序不完全一致,有兴趣推荐看原文),希望能对大家有所帮助 一.问题的 ...

  3. redis通过dump.db文件 进行数据替换 复制

    进行数据替换无非就是三步, 杀掉redis进程 ------------> 复制 dump.db文件 ------------------>启动redis   pkill redis-se ...

  4. BASIC-14_蓝桥杯_时间转换

    示例代码: #include <stdio.h> int main(void){ int t = 0 , h = 0 , m = 0 , s = 0 ; scanf("%d&qu ...

  5. bzoj 1390: [Ceoi2008]Fence

    Description 在一个大小为1000*1000的区域中,有n个固定点,m棵tree . 现在你要建一个围栏来保护tree,建它的费用为你选用的固定点的个数 *20和 你没有圈进围栏的tree* ...

  6. bzoj1293 生日礼物

    Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩 ...

  7. jenkins的war包下载地址

    https://jenkins.io/doc/book/installing/

  8. Linux下查看某个进程占用的CPU、内存

    1.用top命令指定固定的PID top -p 10997 查询指定进程的PID ps -ef | grep zookeeper jim 10997 1959 0 12月14 pts/2 00:00: ...

  9. gradle使用心得

    gradle是语言式构建,和maven配置型还是差别挺大,琢磨了2天 1.在解析setting.gradle之后,开始解析build.gradle之前,这里如果要干些事情(更改build.gradle ...

  10. [转载]Deep Learning(深度学习)学习笔记整理

    转载自:http://blog.csdn.net/zouxy09/article/details/8775360 感谢原作者:zouxy09@qq.com 八.Deep learning训练过程 8. ...