本文属于「Unity与iOS、Android平台的整合」系列文章之一,转载请注明出处。
主要讲解Unity与iOS、Android平台相互传递参数

零、前言

这篇我不打算写得太多,因为主体内容在上一篇5、与iOS、Android的交互 实践篇——主动调用有详细的讲解,希望大家能够跟着流程一步一步向下走。

一、前期工作

把上一个工程打开,然后开始添加代码

二、Unity向iOS、Android传递参数

首先,我们需要设计一个需求

现在策划说:需要一个原生弹窗,显示一个随机数和一个字符串

好的,需求有了,可以开始设计接口了

C#需要向外提供一个接口,供其他C#代码调用
OC需要提供一个接口,用于接收参数、调用iOS系统弹窗
Java需要提供一个接口,用于接收参数、调用Android系统弹窗

0.Unity内部

在ConnectUnityToiOSAndroid.cs中写两个方法,写得很简单,大家看一下注释就清楚了

//C#面向Unity开发者的接口public void ShowStringAndInt(){    MyConsole.Print("向iOS、Android传递参数");    ShowStringAndInt_("Unity向iOS、Android传递参数", Random.Range(0, 100));}#if UNITY_EDITOR//运行在编辑器环境的接口,一般用于编辑器内模拟数据private void ShowStringAndInt_(string str, int num){    MyConsole.Print(str + " " + num);}#endif

1.Unity -> iOS

在ConnectUnityToiOSAndroid.cs中关联C++的接口

#if UNITY_IOS//运行在iOS环境的接口,关联到C++接口[DllImport("__Internal")]private static extern void ShowStringAndInt_(string str, int num);#endif

在ConnectUnityToiOS.mm中用OC写调用系统弹窗

-(void)ShowStringAndInt:(NSString*)str Num:(int)num {    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:str                                                        message:[NSString stringWithFormat:@"数字是%d",num]                                                       delegate:self                                              cancelButtonTitle:@"确定"                                              otherButtonTitles:nil];    [alertView show];}

在ConnectUnityToiOS.mm中用C++调用OC的接口

extern "C"{    void ShowStringAndInt_(const char* str, const int num){        [[ConnectUnityToiOS sharedInstance] ShowStringAndInt:[NSString stringWithUTF8String:str] Num:num];    }}

运行效果~


iOS下接收参数的运行效果

2.Unity -> Android

在ConnectUnityToiOSAndroid.cs中关联Java的接口

#if  UNITY_ANDROID//运行在Android环境的接口private static void ShowStringAndInt_(string str, int num){    //注意,这边一定要把游戏的包名写正确,否则找不到类。    using (AndroidJavaClass jc = new AndroidJavaClass("com.wsc.ConnectUnityToiOSAndroid.ConnectUnityToAndroid"))    {        jc.CallStatic("ShowStringAndInt_", str, num);    }}#endif

在ConnectUnityToAndroid.java中用Java调用系统弹窗

public static void ShowStringAndInt_(final String str, final int num){    UnityPlayer.currentActivity.runOnUiThread(new Runnable() {        @Override        public void run() {            AlertDialog.Builder builder = new AlertDialog.Builder(UnityPlayer.currentActivity)                    .setTitle(str)                    .setMessage("数字是" + num)                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            UnityPlayer.UnitySendMessage("Camera", "NativeTipClosed", "");                        }                    });            builder.show();        }    });}

运行效果~


Andorid接收参数的运行效果

三、iOS、Android向Unity传递参数

首先,我们需要设计一个需求

现在策划说:需要获得当前系统的语言

好的,需求有了,可以开始设计接口了

C#需要向OC、Java提供一个接口,以接收原生代码的参数
OC需要在被调用后,主动调用C#并传递参数
Java需要在被调用后,主动调用C#并传递参数

0.Unity

将ConnectUnityToiOSAndroid.cs挂载在某个物体上,我选择了名为「Camera」的摄像机物体。
在ConnectUnityToiOSAndroid.cs中写

//C#面向Unity开发者的接口public void GetLanguage(){    MyConsole.Print("Unity请求系统语言");    GetLanguage_();}//C#面向iOS、Android的接口private void NativeLanguage(string language){    MyConsole.Print("系统语言是:" + language);}#if UNITY_EDITOR//运行在编辑器环境的接口,一般用于编辑器内模拟数据private void GetLanguage_(){    SendMessage("NativeLanguage", Application.systemLanguage + "-来自Unity");}#endif

1.iOS -> Unity

在ConnectUnityToiOSAndroid.cs中关联C++的接口

#if UNITY_IOS//运行在iOS环境的接口,关联到C++接口[DllImport("__Internal")]private static extern void GetLanguage_();#endif

在ConnectUnityToiOS.mm中用OC获取当前系统语言并回调

-(void)GetLanguage{    NSString* languageStr = [NSString stringWithFormat:@"%@ -来自iOS",[[NSLocale preferredLanguages] objectAtIndex:0]];    UnitySendMessage("Camera", "NativeLanguage", strdup([languageStr UTF8String]));}

在ConnectUnityToiOS.mm中用C++调用OC的接口

extern "C"{    void GetLanguage_(){        [[ConnectUnityToiOS sharedInstance] GetLanguage];    }}

运行效果~


Unity接收iOS传递参数的运行效果

2.Android -> Unity

在ConnectUnityToiOSAndroid.cs中关联Java的接口

#if  UNITY_ANDROID//运行在Android环境的接口private static void GetLanguage_(){    //注意,这边一定要把游戏的包名写正确,否则找不到类。    using (AndroidJavaClass jc = new AndroidJavaClass("com.wsc.ConnectUnityToiOSAndroid.ConnectUnityToAndroid"))    {        jc.CallStatic("GetLanguage_");    }}#endif

在ConnectUnityToAndroid.java中用Java调用系统弹窗

public static void GetLanguage_(){        UnityPlayer.currentActivity.runOnUiThread(new Runnable() {        @Override        public void run() {            UnityPlayer.UnitySendMessage("Camera", "NativeLanguage", Locale.getDefault().getLanguage() + " -来自Android");        }    });}
Unity接收Android传递参数的运行效果

四、收个尾

以上内容为Unity与iOS、Android之间相互传递参数的所有内容。
如果你不知道如何导出工程,请看一下前几篇文章
如果你不能理解我的实现步骤,请看一下前几篇文章
附上我的Unity示例工程,里面包含了上文中所有代码,打包编译,进行对应修改应该就能跑~
下载链接: https://pan.baidu.com/s/1miAWkwK 密码: 9yaz

更多相关文章

  1. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  2. Android中给系统控件添加配置的自定义属性
  3. vlc android 编译
  4. Android网络编程之——Android下菜单系统模块的实现(Android客户
  5. Android(安卓)系统中 Location Service 的实现与架构
  6. Android属性系统(转载)
  7. Android(安卓)AndroidManifest 清单文件以及权限详解
  8. Android(安卓)根文件系统启动分析
  9. Android(安卓)Log系统详解

随机推荐

  1. android 提示对话框显示 AlertDialog
  2. Android折叠Toolbar
  3. ViewPager的切换动画
  4. ADT eclipse打开时出现Error: Error pars
  5. Android属性动画-Property Animation(三)
  6. Android -- 网络相关的系统服务启动简要
  7. android上传图片或文件
  8. # Android(安卓)不同的第三方库有相同的
  9. Android布局的一些属性和开关、创建log图
  10. Unity与Android交互