上一篇主要说了将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。将上诉两个文件拖入其中。
image.png
现在我们在场景上新建一个输入框和一个按钮,点击按钮将输入框的内容,通过iOSLog打印出来。
image.png
控件创建好之后,在脚本中申明一下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关联到场景中。
image.png
然后就OK了,打包出来看看效果。
按照上一篇文章中说的,整合在一起。
image.png
看到了我们添加的文件了。
image.png
改为public
image.png
按照之前的操作 image.png
添加#import <UnityFramework/NativeCallProxy.h>引用
注册协议
[NSClassFromString(@"FrameworkLibAPI") registerAPIforNativeCalls:self];
最后可以在Appdelegate中实现协议里面的方法了
然后就可以run了
结果正确
image.png
代码都在里面了(unity和Xcode 工程包也在里面):https://pan.baidu.com/s/13ywva1gPPkc334o7YCW_Lg
提取码:e90o
网友评论