Unity 和 iOS之间的通信(交互)

上一篇主要说了将Unity集成到原生iOS应用程序中,集成之后肯定是要通信的,所以这篇来说一下Unity 和 iOS之间的通信。

1、iOS调用Unity的方法并传参数

在UnityFramework中提供的有专门的方法,因此我们只要调用就可以了。
首先在AppDelegate.h中声明一个调用方法,方便后面使用。

- (void)sendMessageWithName:(const char*)goName functionName:(const char*) functionName message:(const char*)msg;

在AppDelegate.m中实现方法

- (void)sendMessageWithName:(const char*)goName functionName:(const char*) functionName message:(const char*)msg{
     [self.ufw sendMessageToGOWithName:goName functionName:name message:msg];
}

这三个参数还是要解释一下的

goName:表示Unity里面的场景的名字,Unity中方法一般是通过添加脚本的方式,使用C#来进行定义,每一个脚本都对应一个使用的场景,这边后面会简单说一下这个场景。

functionName:就很好理解,iOS调用Unity具体的方法名字。

msg:就是方法的参数

针对上面👆的,我们简单做一个小demo(会的就直接跳过 );

我们就简单将原生iOS的值传递给Unity,并通过Label显示出来。

我们在unity中创建一个Text和脚本,并把脚本绑定在这个场景中。

双击脚本进入代码编写,我这时候添加一些库的引用,声明上面的Text,以及书写方法修改Text的指,这里的方法正是给原生调用的方法。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Runtime.InteropServices;

public class ChangeLabel : MonoBehaviour
{
     public Text text;
    [DllImport("__Internal")]
 
    public void changeLabel(string speedStirng) {
        text.text = speedStirng;
    }
}

到这unity工程就到此结束了。
在原生工程中调用了

AppDelegate *appDelegate = (AppDelegate *)([UIApplication sharedApplication].delegate);
    [appDelegate showUnityView];
    [appDelegate sendMessageWithName:"Canvas" functionName:"changeLabel" message:"好硬好强呀~~~~~"]

2、Unity调用iOS的方法并传参数 

首先创建一个.h和.mm文件,用来书写需要交互的方法。
上代码 NativeCallProxy.h

#import <Foundation/Foundation.h>
@protocol NativeCallsProtocol

@required

- (void)iOSLog:(NSString *)value;


@end

__attribute__ ((visibility("default")))

@interface FrameworkLibAPI : NSObject
// call it any time after UnityFrameworkLoad to set object implementing NativeCallsProtocol methods
+(void) registerAPIforNativeCalls:(id<NativeCallsProtocol>) aApi;

@end

iOSLog 用来打印unity中的的文本。
NativeCallProxy.mm 

#import <Foundation/Foundation.h>
#import "NativeCallProxy.h"


@implementation FrameworkLibAPI

id<NativeCallsProtocol> api = NULL;
+(void) registerAPIforNativeCalls:(id<NativeCallsProtocol>) aApi
{
    api = aApi;
}

@end


extern "C" {

void iOSLog(const char * value);

}


void iOSLog(const char * value){
    
    return [api iOSLog:[NSString stringWithUTF8String:value]];
    
}

然后将刚才的两个文件拖到unity 中 

在Assets文件夹中新建Plugins文件夹,然后在Plugins文件夹中新建iOS。将上诉两个文件拖入其中。

现在我们在场景上新建一个输入框和一个按钮,点击按钮将输入框的内容,通过iOSLog打印出来。

控件创建好之后,在脚本中申明一下input。并书写相应逻辑
上代码

using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;

public class ChangeLabel : MonoBehaviour
{
    public Text tmpText;
    public InputField tmpInput;

    
    public void changeLabel(string speedStirng) {
        tmpText.text = speedStirng;
    }

    public void btnClick(){
       iOSLog(tmpInput.text);
    }

    //这个很重要,关联iOS方法
    [DllImport("__Internal" )]
     static extern void iOSLog(string value);
}

 申明之后就是将input关联到场景中。

然后就OK了,打包出来看看效果。
按照上一篇文章中说的,整合在一起。 

 

看到了我们添加的文件了。

改为public

按照之前的操作

添加#import <UnityFramework/NativeCallProxy.h>引用

注册协议
[NSClassFromString(@"FrameworkLibAPI") registerAPIforNativeCalls:self];

最后可以在Appdelegate中实现协议里面的方法了

然后就可以run了

结果正确

代码都在里面了(unity和Xcode 工程包也在里面):https://pan.baidu.com/s/13ywva1gPPkc334o7YCW_Lg

提取码:e90o

 

 

 

 

 

 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值