Unity与iOS交互(3)——常见交互示例

这篇具有很好参考价值的文章主要介绍了Unity与iOS交互(3)——常见交互示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【前言】

前面两篇文章详细介绍了Unity与iOS交互的原理,相信仔细看了之后基本了解了,当然你可能需要花费好几个小时才能看明白。现在缺的就是具体的调用代码了,相信你其实可以自己一点点整理出来,但会花费不少时间趟坑,这里我们直接给出常见的交互代码示例。

【基础的交互】

传递基本数据类型和sring类型

public class Sample : MonoBehaviour 
{
    [DllImport("__Internal")]
    static extern void PassIntAndString (int a, string b);
}
extern "C" void PassIntAndString(int a,const char* b)
{
    NSLog(@"a = %d", a);
    NSString *str = [NSString stringWithUTF8String:b];
    NSLog(@"%@", str);
}

传递基本数据类型的数组

有时候要传递的数据很多,例如一张图片的数据,这时候可能会用到数组

public class Sample : MonoBehaviour 
{
    [DllImport("__Internal")]
    private static extern void SendImageData (int length, int[] data);
}
extern "C" void SendImageData(int length,int* data)
{
        for (int i = 0; i < length; i++) {
            NSLog(@"imagedata %d : %d", i, data[i]);
        }
}

通过MonoPInvoke让OC直接回调C#函数

一般来说,我们都会用UnitySendMessage来实现OC调用C#,即使是回调函数也一样。当然,UnitySendMessage涉及到查找transform会慢一些。如果对性能有要求,那就需要借助PInvoke来实现回调。使用UnitySendMessage时是线程安全的,使用PInvoke时要自己维护线程安全。

public class Sample:MonoBehaviour
{

//回调参数必须有MonoPInvokeCallBack,而且是static的
[MonoPInvokeCallback(typeof(CallBack))]
public static int PassCallBack(string url) {
    
}

[DllImport("__Internal")]
private static extern void SetCallBack(CallBack cb );

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int CallBack(string url);


private void Set ()
{
    SetCallBack (PassCallBack);//直接把函数指针传递过去
}
        
}

#if defined(__cplusplus)
extern "C"
{
#endif

    // C#设置过来的函数指针类型
    typedef int (*PassCallBack)(const char*); 
    static PassCallBack callBack;
    void SetCallBack(PassCallBack cb) {
        callBack = cb;
    }

#if defined(__cplusplus)
}
#endif


void SetUrl(const char* url) {//回调
    if (callBack != nil) {
        callBack(url);
    }
}

OC传递基本数据类型的数组给C#

public class Sample:MonoBehaviour
{

//回调参数必须有MonoPInvokeCallBack,而且是static的
[MonoPInvokeCallback(typeof(CallBack))]
public static int PassCallBack(int length,IntPtr data) {
        byte[] buffer = new byte[length];         
        Marshal.Copy(data, buffer, 0, length);//将数据拷贝出来
}

[DllImport("__Internal")]
private static extern void SetCallBack(CallBack cb);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int CallBack(int length,IntPtr data);


private void Set ()
{
    SetCallBack (PassCallBack);//直接把函数指针传递过去
}
        
}

#if defined(__cplusplus)
extern "C"
{
#endif

    // C#设置过来的函数指针类型
    typedef int (*PassCallBack)(int,void*); 
    static PassCallBack callBack;
    void SetCallBack(PassCallBack cb) {
        callBack = cb;
    }

#if defined(__cplusplus)
}
#endif


void SendData(int length) {//回调
    NSMutableArray *mutableArray = [NSMutableArray array];
    NSArray *array = [NSArray arrayWithArray:mutableArray];
    if (callBack != nil) {
        callBack(length,array);
    }
}

传递一个C#对象

传递对象有两种方式,一种是将对象序列化转为数组,相当于传递基本数据类型的数组,此处不 赘述,然后反序列化还原对象;另一种是将对象指针传递出去,类似传递函数指针。

对象指针传递

using System.Runtime.InteropServices;

public class Sample {
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void CallBack(IntPtr objectPtr);

    [DllImport("__Internal")]
    private static extern void PassObject(IntPtr objectPtr, CallBack callback);

    [MonoPInvokeCallback(typeof(CallBack))]
    private static void GetObject(IntPtr objectPtr) {
        GCHandle handle = (GCHandle) objectPtr;
        //从指针读取TestObjet
        TestObjet test = handle.Target as TestObjet;
        handle.Free ();
    }

    private static void Set() {
        TestObject test = new TestObject();
        IntPtr objectPtr = (IntPtr)GCHandle.Alloc (TestObject);
        PassObject (objectPtr, GetObject);
    }
}


public class TestObjet
{
    public int a;
    public bool b;
}

【复杂的交互】

iOS和Unity界面跳转

两个界面跳转实际是要替换显示画面,而在iOS上画面的显示是在UIWindow中的,修改UIWindow的rootViewController即可。

将Unity作为库整合到Android或iOS中

【参考】 

Unity3D与iOS的交互 - 简书

Unity - Manual: Building plug-ins for iOS

iOS 与 Unity 消息传递 (Swift 与 C#) - 简书 (jianshu.com) 文章来源地址https://www.toymoban.com/news/detail-562312.html

到了这里,关于Unity与iOS交互(3)——常见交互示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++下跨平台websocket库及使用示例

    websocketpp库使用非常方便,开源,可跨平台,内部实现全部是head文件,无cpp,接口简单易用。源码路径比如 https://github.com/zaphoyd/websocketpp.git 使用方法是,先下载源码包并复制道工程的include目录下。 --include    --websocketpp 然后在代码#include \\\"utility_client.hpp\\\"即可调用其接口进行

    2024年04月28日
    浏览(36)
  • Unity与Android交互(5)——常见交互示例

    【前言】 之前的文章更多的是进行一些原理说明,很少涉及代码,本文举一些Unity与Android交互的常见的一些例示例。 获取UnityPlayerActivity 获取包名   获取Android Id (Android Id是Android操作系统提供的一个用于标识设备的唯一标识符,是一个字符串类型的值,可以用于区分不同的设

    2024年02月13日
    浏览(42)
  • Kotlin & Compose Multiplatform 跨平台开发实践之加入 iOS 支持

    几个月前 Compose Multiplatform 的 iOS 支持就宣布进入了 Alpha 阶段,这意味着它已经具备了一定的可用性。 在它发布 Alpha 的时候,我就第一时间尝鲜,但是只是浅尝辄止,没有做过多的探索,最近恰好有点时间,于是我又重新开始学习 Compose Multiplatform ,并且尝试移植我已有的项

    2024年02月07日
    浏览(48)
  • 【HarmonyOS开发】ArkUI-X 跨平台框架(使用ArkTs开发Android&IOS)

    ArkUI-X 跨平台框架进一步将 ArkUI 开发框架扩展到了多个OS平台,目前支持OpenHarmony、HarmonyOS、Android、 iOS,后续会逐步增加更多平台支持。开发者基于一套主代码,就可以构建支持多平台的精美、高性能应用。 React Native 是一个基于 JavaScript 和 React 的开源框架,由 Facebook 开发和

    2024年01月20日
    浏览(49)
  • ComPDFKit PDF SDK(支持Web、Android、IOS、Windows、Server、API、跨平台)

    SDK是软件开发工具包的缩写,指的是一组用于开发软件应用的工具、库和文档。SDK包含一系列的函数、类和方法,开发人员可以使用这些工具和资源来开发、测试和部署应用程序。SDK可以提供各种功能和技术支持,如图形界面、网络通信、数据库操作等,帮助开发人员更高效

    2024年02月14日
    浏览(43)
  • 滚动条详解:跨平台iOS、Android、小程序滚动条隐藏及自定义样式综合指南

    滚动条是用户界面中的图形化组件,用于指示和控制内容区域的可滚动范围。当元素内容超出其视窗边界时,滚动条提供可视化线索,并允许用户通过鼠标滚轮、触屏滑动或直接拖动滑块来浏览未显示部分,实现内容的上下或左右滚动。它在保持界面整洁、避免内容溢出的同

    2024年04月27日
    浏览(34)
  • 【LocalSend】开源跨平台的局域网文件传输工具,支持IOS、Android、Mac、Windows、Linux

    工作前提条件:设备使用相同的局域网。 LocalSend is a cross-platform app that enables secure communication between devices using a REST API and HTTPS encryption. Unlike other messaging apps that rely on external servers, LocalSend doesn’t require an internet connection or third-party servers, making it a fast and reliable solution for local

    2024年02月17日
    浏览(55)
  • 【unity与android的交互】移动游戏发布更安心!Unity安卓平台打包相关的常见参数全详解

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity基础实战 首先需要切换到安卓平台 step1 :打包前的基础参数的设置 step2:包名的设置需要勾选,必须要去设置的内容 打包后进行测

    2024年04月17日
    浏览(75)
  • 跨平台应用开发进阶(五十)uni-app ios web-view嵌套H5项目白屏问题分析及解决

    应用 uni-app 框架开发好APP上架使用过程中,发现应用经过长时间由后台切换至前台时,通过 webview 方式嵌套的H5页面发生白屏现象。 任何手机设备上,当手机内存不足时,os都会回收资源。一般是先回收后台打开的资源。如果当前应用占用的资源过高,当前应用也有可能崩溃

    2024年02月14日
    浏览(55)
  • 【QT+QGIS跨平台编译】之三:【OpenSSL+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。 SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。SSL能使用户/服务器应用

    2024年01月22日
    浏览(93)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包