上一篇主要說了將Unity集成到原生iOS應(yīng)用程序中贞让,集成之后肯定是要通信的,所以這篇來說一下Unity 和 iOS之間的通信续镇。
1销部、iOS調(diào)用Unity的方法并傳參數(shù)
在UnityFramework中提供的有專門的方法,因此我們只要調(diào)用就可以了酱虎。
首先在AppDelegate.h中聲明一個調(diào)用方法擂涛,方便后面使用。
- (void)sendMessageWithName:(const char*)goName functionName:(const char*) functionName message:(const char*)msg;
在AppDelegate.m中實(shí)現(xiàn)方法
- (void)sendMessageWithName:(const char*)goName functionName:(const char*) functionName message:(const char*)msg{
[self.ufw sendMessageToGOWithName:goName functionName:name message:msg];
}
這三個參數(shù)還是要解釋一下的
goName:表示Unity里面的場景的名字恢暖,Unity中方法一般是通過添加腳本的方式踩身,使用C#來進(jìn)行定義,每一個腳本都對應(yīng)一個使用的場景琼娘,這邊后面會簡單說一下這個場景附鸽。
functionName:就很好理解,iOS調(diào)用Unity具體的方法名字熄浓。
msg:就是方法的參數(shù)
針對上面??的,我們簡單做一個小demo(會的就直接跳過 );
我們就簡單將原生iOS的值傳遞給Unity俯在,并通過Label顯示出來娃惯。
我們在unity中創(chuàng)建一個Text和腳本,并把腳本綁定在這個場景中愕提。
雙擊腳本進(jìn)入代碼編寫皿哨,我這時(shí)候添加一些庫的引用证膨,聲明上面的Text,以及書寫方法修改Text的指,這里的方法正是給原生調(diào)用的方法椎例。
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工程就到此結(jié)束了订歪。
在原生工程中調(diào)用了
AppDelegate *appDelegate = (AppDelegate *)([UIApplication sharedApplication].delegate);
[appDelegate showUnityView];
[appDelegate sendMessageWithName:"Canvas" functionName:"changeLabel" message:"好硬好強(qiáng)呀~~~~~"]
2肆捕、Unity調(diào)用iOS的方法并傳參數(shù)
首先創(chuàng)建一個.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。將上訴兩個文件拖入其中寇钉。
現(xiàn)在我們在場景上新建一個輸入框和一個按鈕舶赔,點(diǎn)擊按鈕將輸入框的內(nèi)容,通過iOSLog打印出來撵溃。
控件創(chuàng)建好之后,在腳本中申明一下input石咬。并書寫相應(yīng)邏輯
上代碼
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);
}
//這個很重要鬼悠,關(guān)聯(lián)iOS方法
[DllImport("__Internal" )]
static extern void iOSLog(string value);
}
申明之后就是將input關(guān)聯(lián)到場景中亏娜。
然后就OK了,打包出來看看效果它掂。
按照上一篇文章中說的溯泣,整合在一起。
看到了我們添加的文件了客给。
改為public
按照之前的操作
添加#import <UnityFramework/NativeCallProxy.h>引用
注冊協(xié)議
[NSClassFromString(@"FrameworkLibAPI") registerAPIforNativeCalls:self];
最后可以在Appdelegate中實(shí)現(xiàn)協(xié)議里面的方法了
然后就可以run了
結(jié)果正確
代碼都在里面了(unity和Xcode 工程包也在里面):https://pan.baidu.com/s/13ywva1gPPkc334o7YCW_Lg
提取碼:e90o