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) 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!针对您的问题,这里提供一些相关的信息供您参考。 首先,Unity是一款跨平台的游戏开发引擎,可以支持在多个平台上进行游戏开发。而Android和iOS是其中比较常见的移动平台。 在Android和iOS平台上嵌入Unity的开发示例,可以参考官方文档中的相关内容。具体步骤如下: 1. 创建Unity项目并设置相关参数,例如选择Android或iOS平台,设置屏幕分辨率等。 2. 在Unity项目中添加所需的场景和游戏对象,并设置相应的脚本和材质等。 3. 将Unity项目导出为Android或iOS平台所需的文件格式,例如APK或IPA文件。 4. 在Android或iOS项目中嵌入Unity文件,并通过相关代码进行调用和交互。 需要注意的是,Android和iOS平台上嵌入Unity的具体实现方式可能会有所不同,需要根据具体情况进行调整和修改。 另外,关于在Unity中开发Android或iOS应用的示例,也可以参考官方文档中的相关内容。具体步骤如下: 1. 创建Unity项目并设置相关参数,例如选择Android或iOS平台,设置屏幕分辨率等。 2. 在Unity项目中添加所需的场景和游戏对象,并设置相应的脚本和材质等。 3. 使用Unity提供的Android或iOS插件进行开发,例如调用相机或GPS等硬件功能,或者进行网络通信等。 4. 将Unity项目导出为Android或iOS应用程序,并进行相关的测试和调试。 需要注意的是,开发Android或iOS应用程序需要遵循相应的规范和标准,例如Android应用程序需要满足Google Play的要求,iOS应用程序需要通过苹果的审核。因此,在开发过程中需要谨慎处理相关问题。 希望以上信息对您有所帮助,如有任何疑问,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值