栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

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

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 
@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) aApi;

@end

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

#import 
#import "NativeCallProxy.h"


@implementation FrameworkLibAPI

id api = NULL;
+(void) registerAPIforNativeCalls:(id) 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 引用

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

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

然后就可以run了

结果正确

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

提取码:e90o

 

 

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901540.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号