一、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

extern "C"{
  void Log(char* arg){
    // 这里可以调用object-c的函数了
    // 如 [[ AlertView alloc] init]; ...
  }
}
//或
extern "C"{
  void Log(char* arg);
}
void Log(char* arg){
  // 这里可以调用object-c的函数了
  // 如 [[ AlertView alloc] init]; ...
}

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

2.C#调用C/C++

新建TestPluginiOS.cs,如:

TestPluginiOS.cs

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

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


二、Object-c调用C#

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

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

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

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

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

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


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

.c文件

typedef struct Parameter {
int a;
int b;
} Param; typedef void (*CallBack)(Param* p); void TestFunc(CallBack cb){
Param p;
p.a = ;
p.b = ;
cb(&p);
}

cs文件

public class NewBehaviourScript : MonoBehaviour {  

    [StructLayout(LayoutKind.Sequential)]
struct Parameter {
public int a;
public int b;
} delegate void CallBack(IntPtr param); [DllImport("TestLib")]
static extern void TestFunc(CallBack cb); [MonoPInvokeCallback(typeof(CallBack))]
static void CallBackFunc(IntPtr param) {
var p = (Parameter)Marshal.PtrToStructure(param, typeof(Parameter));
Debug.Log("a:" + p.a + " b:" + p.b);
} // Use this for initialization
void Start () {
TestFunc(CallBackFunc);
} // Update is called once per frame
void Update () { }
}

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

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

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

NSString* MakeNSString (const char* string) {
if (string) {
return [NSString stringWithUTF8String: string];
} else {
return [NSString stringWithUTF8String: ""];
}
} char* MakeCString(NSString *str) {
const char* string = [str UTF8String];
if (string == NULL) {
return NULL;
} char* res = (char*)malloc(strlen(string) + );
strcpy(res, string);
return res;
}

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. weex-toolkit 使用

    weex-toolkit 的github地址:https://github.com/weexteam/weex-toolkit weex-toolkit: 初始化的项目是针对开发单个 Weex 页面而 ...

  2. 什么是Asp.net Core?和 .net core有什么区别?(转)

    什么是Asp.Net core 我相信很多C# Developer已经对于.net core不算陌生了,就算没有正式使用相信也应该有所了解.微软在推出来.net core的同时为了方便一些原有的项目可 ...

  3. ORA-01919: role 'OLAPI_TRACE_USER' does not exist

    我在用数据泵导入数据的时候报的错 TEST_USER1@ORCL> conn / as sysdbaSYS@ORCL> grant plustrace to TEST_USER1; gra ...

  4. 【python】网络编程-套接字常用函数

  5. android自定义tabhost,tabcontent用intent获得

    地址:http://my.oschina.net/aowu/blog/36282 自己改的自定义tabhost组建,效果图如左.有更好的朋友可以相互交流一下,嘿嘿. 1.先上AndroidManife ...

  6. 新玩具,React v16.7.0-alpha Hooks

    周五看见React v16.7.0-alpha Hooks,今早起来看见圈里已经刷屏了Hooks,正好周末,正好IG和G2的比赛还没开始,研究下... 刚刚接触react时候非常喜欢用函数式组件,因为 ...

  7. vs 2017/2015/2013 如何定位C++内存泄漏

    定位内存泄漏是C++的一个大问题 我们可以通过如下方式进行定位: //在主函数文件中加入如下代码 #include <stdlib.h> #include <crtdbg.h> ...

  8. 峰Spring4学习(1)HelloWorld

    HelloWorld.java: package com.cy.test; public class HelloWorld { public void say(){ System.out.printl ...

  9. appium出现的问题记录

    1,(自带的)启动模拟器提示 Starting emulator for AVD 'AVD_for_Galaxy_Nexus' emulator: ERROR: x86 emulation curre ...

  10. autopy的使用探索

    autopy这个包可以直接操作电脑的一些行为,比如点击,移动鼠标啥的,但是可能只使用于windows,用处有限,不过做个简单的游戏辅助还是可以的. 网上资料贼少,很多不能用的,现总结一些可以用的放在这 ...