游戏项目都会做
iOS、Android平台的,那在使用unity开发时,想要调用两个平台之间的一些数据该如何处理呢,这就是下面要给大家
讲解的Unity与iOS、Android平台相互主动调用实现,一起来看看吧。
零、前言
由于本文涉及到较多基础知识,建议读者们把前面几篇补完后再往下看
一、前期工作
1.控制台
Debug.Log();
这个API是我们比较常用的Log输出工具,但是只能在调试的时候看到,所以我自己写了个在设备上显示Log的简单控制台,具体制作和使用大家可以在我之后附带的工程中看到。
控制台的编辑器配置
控制的显示
2.创建一个C#的类
ConnectUnityToiOSAndroid.cs
这个类需要挂载在一个场景内存在的GameObject上,我选择了摄像机,当然你也可以选择其他,但是必须要有一个确定的name,这个涉及到iOS、Android主动调用Unity是否成功的问题,不理解的话请仔细看
上一篇文章
挂载物体示意图
为了方便,我会把C#相关的示例代码都写在这里。
为了方便,面向Unity开发者的接口我都直接通过编辑器拖拽挂载的方式用按钮调用。
实际开发中原理都是一样的,但是不建议像我这样简单粗暴地使用~
ConnectUnityToiOSAndroid.cs
using
UnityEngine;
public
class
ConnectUnityToiOSAndroid
:
MonoBehaviour
{}
3.创建一个Objective-C的类
这两个文件需要关联到Xcode工程中
关联示意图
ConnectUnityToiOS.h
#
ifndef
ConnectUnityToiOS_h
#
define
ConnectUnityToiOS_h
#
endif
end
ConnectUnityToiOS.mm
#import
"ConnectUnityToiOS.h"
@implementation
ConnectUnityToiOS
static
ConnectUnityToiOS *instance =
nil
;+(ConnectUnityToiOS *)sharedInstance{
@synchronized
(
self
) {
if
(instance ==
nil
) { instance = [[[
self
class
] alloc] init]; } }
return
instance;}
@end
extern
"C"
{}
4.创建一个Java的类
这个文件需要关联到AndroidStudio或Eclipse工程
关联示意图
ConnectUnityToAndroid.java
package com.wsc.
ConnectUnityToAndroid
;
import
android.app.AlertDialog;
import
com.unity3d.player.UnityPlayer;
public
class
ConnectUnityToAndroid
{}
二、Unity主动调用iOS、Android
首先,我们需要设计一个调用需求
现在策划说:需要一个原生弹窗提示
好的,需求有了,可以开始设计接口了
C#需要向外提供一个接口,供其他C#代码调用
OC需要提供一个接口,用于调用iOS系统弹窗
Java需要提供一个接口,用于调用Android系统弹窗
0.Unity内部
在ConnectUnityToiOSAndroid.cs中写两个方法,写得很简单,大家看一下注释就清楚了
public
void
ShowNativeTip
()
{ MyConsole.Print(
"显示原生弹窗"
); ShowNativeTip_();}
#
if
UNITY_EDITOR
private
void
ShowNativeTip_
()
{ MyConsole.Print(
"这是在Unity环境"
);}
#
endif
1.Unity -> iOS
在ConnectUnityToiOSAndroid.cs中关联C++的接口
#
if
UNITY_IOS
[DllImport(
"__Internal"
)]
private
static
extern
void
ShowNativeTip_
()
;
#
endif
在ConnectUnityToiOS.mm中用OC写调用系统弹窗
-(
void
)ShowNativeTip{
UIAlertView
*alertView = [[
UIAlertView
alloc] initWithTitle:
@"这是iOS的原生弹窗"
message:
nil
delegate:
self
cancelButtonTitle:
@"确定"
otherButtonTitles:
nil
]; [alertView show];}
在ConnectUnityToiOS.mm中用C++调用OC的接口
extern
"C"
{ void
ShowNativeTip_(){
[[ConnectUnityToiOS
sharedInstance]
ShowNativeTip];
}}
运行效果~
iOS下调用原生弹窗运行效果
2.Unity -> Android
在ConnectUnityToiOSAndroid.cs中关联Java的接口
#
if
UNITY_ANDROID
private
static
void
ShowNativeTip_
()
{
using
(AndroidJavaClass jc =
new
AndroidJavaClass(
"com.wsc.ConnectUnityToiOSAndroid.ConnectUnityToAndroid"
)) { jc.CallStatic(
"ShowNativeTip_"
); }}
#
endif
在ConnectUnityToAndroid.java中用Java调用系统弹窗
public
static
void
ShowNativeTip_
()
{ AlertDialog.Builder builder =
new
AlertDialog.Builder(UnityPlayer.currentActivity) .setMessage(
"这是Android的原生弹窗"
) .setPositiveButton(
"确定"
,
null
) builder.show();}
运行效果~
Andorid下调用原生弹窗运行效果
三、iOS、Android主动调用Unity
首先,我们又需要设计一个调用需求,诶为什么要说又
现在策划说:需要获得原生弹窗关闭的时候时间
好的,需求有了,可以开始设计接口了
C#需要向OC、Java提供一个接口,以接收原生弹窗关闭的通知
OC需要在弹窗关闭时主动调用C#
Java需要在弹窗关闭时主动调用C#
0.Unity
将ConnectUnityToiOSAndroid.cs挂载在某个物体上,我选择了名为「Camera」的摄像机物体。
在ConnectUnityToiOSAndroid.cs中写一个方法,写得很简单,大家看一下注释就清楚了
private
void
NativeTipClosed
()
{ MyConsole.Print(
"原生弹窗被关闭了"
);}
1.iOS -> Unity
在ConnectUnityToiOS.mm中写OC添加系统弹窗按钮的监听
-
(void)
alertView:
(UIAlertView *)
alertView clickedButtonAtIndex:
(NSInteger)
buttonIndex{ if
(buttonIndex==
0
)
{ UnitySendMessage
(
"Camera"
,
"NativeTipClosed"
,
""
)
; }}
运行效果~
iOS下主动调用Unity运行效果
2.Android -> Unity
在ConnectUnityToAndroid.java中写Java添加系统弹窗按钮的监听
由于Java这边可以直接添加匿名事件,我就不重新分一个函数写了,以下是和原文的区别示意图
相对上文添加的内容示意图
public
static
void
ShowNativeTip_
()
{ UnityPlayer.currentActivity.runOnUiThread(
new
Runnable() {
@Override
public
void
run
()
{ AlertDialog.Builder builder =
new
AlertDialog.Builder(UnityPlayer.currentActivity) .setMessage(
"这是Android的原生弹窗"
) .setPositiveButton(
"确定"
,
new
DialogInterface.OnClickListener() {
@public
void
onClick
(DialogInterface dialog,
int
which)
{
UnityPlayer.UnitySendMessage(
"Camera"
,
"NativeTipClosed"
,
""
); } }); builder.show(); } });}
运行效果~
Android下主动调用Unity运行效果
四、收个尾
以上内容为Unity与iOS、Android之间相互主动调用的所有内容。
如果你不知道如何导出工程,请看一下前几篇文章
如果你不能理解我的实现步骤,请看一下前几篇文章
附上我的Unity示例工程,里面包含了上文中所有代码,打包编译,进行对应修改应该就能跑~
下载链接:
https://pan.baidu.com/s/1ge7yRxp
密码: uppp
关于传递参数的实现
由于上面的内容写得非常详细,如果结合理论篇的内容完全可以自己实现,我一直在考虑有没有必要如此喂饭。
这样吧,大家可以先自己尝试一下,如果在思考、尝试之后还是不会,可以在评论中留个言,我会考虑再出一篇传递参数的实践篇~
如社区发表内容存在侵权行为,您可以
点击这里
查看侵权投诉指引