原生Android工程与Unity互相调用

张开发
2026/4/10 4:09:22 15 分钟阅读

分享文章

原生Android工程与Unity互相调用
原生Android工程与Unity互相调用教程包含代码实现和注意事项。以下是详细步骤一、Unity调用Android原生方法1.Android端准备在Android Studio中创建原生模块// MyNativePlugin.java package com.example.unityplugin; import android.util.Log; import com.unity3d.player.UnityPlayer; public class MyNativePlugin { // Unity调用的静态方法 public static void showToast(String message) { Log.d(Native, 收到Unity消息: message); // 调用Android原生功能例如Toast UnityPlayer.currentActivity.runOnUiThread(() - Toast.makeText(UnityPlayer.currentActivity, message, Toast.LENGTH_SHORT).show() ); } // 带返回值的调用 public static int addNumbers(int a, int b) { return a b; } }2.Unity端调用在Unity C#脚本中// UnityCallAndroid.cs public class UnityCallAndroid : MonoBehaviour { void Start() { // 调用无返回值方法 AndroidJavaClass pluginClass new AndroidJavaClass(com.example.unityplugin.MyNativePlugin); pluginClass.CallStatic(showToast, Hello from Unity!); // 调用带返回值方法 int result pluginClass.CallStaticint(addNumbers, 3, 5); Debug.Log(Android返回结果: result); } }二、Android调用Unity方法1.Unity端准备在Unity中创建接收消息的脚本// AndroidCallUnity.cs public class AndroidCallUnity : MonoBehaviour { // 声明为静态以便Android通过GameObject名称调用 public static AndroidCallUnity Instance; void Awake() { Instance this; } // 供Android调用的方法 public void OnNativeMessage(string message) { Debug.Log(收到Android消息: message); } // 带参数和返回值的方法 public string ProcessData(string input) { return Unity处理后的: input.ToUpper(); } }将脚本挂载到常驻GameObject如MainCamera2.Android端调用在Android原生代码中// 调用Unity方法 private void callUnityMethod() { UnityPlayer.UnitySendMessage( MainCamera, // Unity场景中的GameObject名称 OnNativeMessage, // 方法名 Hello from Android // 参数仅限一个字符串 ); } // 调用带返回值的方法通过接口回调 public void getProcessedData(String input) { // 获取Unity实例 AndroidJavaObject unityActivity new AndroidJavaObject(com.unity3d.player.UnityPlayer); AndroidJavaObject currentActivity unityActivity.GetStaticAndroidJavaObject(currentActivity); // 调用方法 String result currentActivity.CallString(ProcessData, input); Log.i(Native, Unity返回: result); }三、复杂参数处理1.传递JSON数据// Android端 JSONObject json new JSONObject(); json.put(score, 100); UnityPlayer.UnitySendMessage(MainCamera, OnJsonData, json.toString());// Unity端 [Serializable] public class GameData { public int score; } public void OnJsonData(string jsonString) { GameData data JsonUtility.FromJsonGameData(jsonString); Debug.Log($解析数据: {data.score}); }2.使用Android接口// 定义接口 public interface UnityCallback { void onResult(String result); } // Unity实现接口 public class MyUnityCallback implements UnityCallback { Override public void onResult(String result) { UnityPlayer.UnitySendMessage(MainCamera, OnCallbackResult, result); } }四、工程配置Unity导出设置导出Android工程时勾选Export Project在Assets/Plugins/Android放置原生模块的.aar文件AndroidManifest.xml确保UnityActivity是主入口activity android:namecom.unity3d.player.UnityPlayerActivity android:themeandroid:style/Theme.NoTitleBar.Fullscreen intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.LAUNCHER / /intent-filter /activityProguard混淆在proguard-rules.pro添加-keep class com.example.unityplugin.** { *; }五、常见问题解决线程问题Android原生代码需在主线程操作UIUnityPlayer.currentActivity.runOnUiThread(() - { /* UI操作 */ });方法签名匹配Unity调用Java方法时需完全匹配参数类型和数量。跨平台库冲突避免Android原生模块与Unity的.so库如libunity.so的ABI冲突建议仅保留armeabi-v7a和arm64-v8a。六、双向调用流程图graph LR Unity[Unity引擎] --|CallStatic| Android[Android原生] Android --|UnitySendMessage| Unity Android --|runOnUiThread| Unity[主线程安全]通过以上步骤可实现完整的双向通信。实际开发中建议使用接口封装例如// Unity端封装类 public static class AndroidBridge { public static void ShowToast(string msg) { using (var plugin new AndroidJavaClass(com.example.unityplugin.MyNativePlugin)) { plugin.CallStatic(showToast, msg); } } }

更多文章