Unity引擎与原生安卓和iOS开发的交互是游戏开发中常见的需求,尤其是在需要调用平台特性(如支付、广告、相机、传感器等)时。这种交互通常通过Unity与原生代码的桥接来实现,包括在Unity中调用原生安卓/Objective-C代码,或者让原生应用调用Unity代码。以下是详细的实现方法与示例。
1. Unity与原生交互的核心原理
1.1 Unity调用原生代码
Unity可以通过插件机制调用安卓的Java
或iOS的Objective-C/Swift
代码。核心机制为:
- 安卓:通过
AndroidJavaObject
和AndroidJavaClass
调用原生Java
方法。 - iOS:通过
[DllImport("__Internal")]
调用Objective-C或Swift的C接口。
1.2 原生代码调用Unity
安卓和iOS可以通过Unity提供的接口与Unity的C#脚本交互:
- 安卓:使用
UnityPlayer
对象的静态方法UnitySendMessage
。 - iOS:通过
UnitySendMessage
函数与Unity通信。
2. Unity调用安卓代码
2.1 实现步骤
- 创建安卓原生插件。
- 在Unity中调用安卓插件。
- 处理数据的传递与回调。
2.2 示例:调用安卓的Toast提示
(1) 创建安卓原生插件
- 在
Android Studio
中新建一个安卓模块,添加一个包含Toast逻辑的类。 - 编译此模块为
.aar
文件。
以下是一个简单的安卓插件代码:
package com.example.unityplugin;
import android.content.Context;
import android.widget.Toast;
public class AndroidPlugin {
private static Context unityContext;
// 初始化Unity的Context
public static void initialize(Context context) {
unityContext = context;
}
// 显示Toast消息
public static void showToast(final String message) {
if (unityContext != null) {
Toast.makeText(unityContext, message, Toast.LENGTH_LONG).show();
}
}
}
-
添加
UnityPlayerActivity
的Context初始化代码:// 在UnityPlayerActivity的onCreate方法中调用 AndroidPlugin.initialize(this);
-
编译生成
.aar
插件,并将其放入Unity项目的Assets/Plugins/Android/
文件夹。
(2) Unity中调用安卓代码
在Unity项目中,使用AndroidJavaObject
调用Java代码:
using UnityEngine;
public class AndroidToast : MonoBehaviour
{
public void ShowToast(string message)
{
if (Application.platform == RuntimePlatform.Android)
{
// 调用安卓插件中的方法
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass pluginClass = new AndroidJavaClass("com.example.unityplugin.AndroidPlugin");
// 调用插件的showToast方法
pluginClass.CallStatic("showToast", message);
}
}
}
(3) 测试效果
- 在Unity中创建一个UI按钮。
- 将上述
AndroidToast
脚本挂载到按钮的OnClick
事件。 - 在安卓设备上运行,点击按钮会显示Toast消息。
3. Unity调用iOS代码
3.1 实现步骤
- 在Xcode中创建Objective-C或Swift代码。
- 通过
DllImport
桥接Unity与原生代码。 - 处理数据传递与回调。
3.2 示例:调用iOS的系统弹框
(1) 创建iOS原生代码
在Unity项目的Plugins/iOS
目录下创建一个Objective-C文件(如NativeIOSPlugin.m
),实现弹框逻辑。
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
// 显示iOS原生弹框
void ShowIOSAlert(const char* title, const char* message) {
NSString* alertTitle = [NSString stringW