Unity作为库运行在独立进程时,如何从Xamarin.Forms的Android端传递数据?
问题根因
UnityPlayer.UnitySendMessage是进程内API,只能在同一个进程的内存空间内调用生效。你给Unity Activity配置了Process=":unityplayer"后,Unity运行在独立进程,和Xamarin主进程内存隔离,所以原有调用直接失效,必须通过Android跨进程通信(IPC)方案实现数据传递。
可落地的实现方案
方案1:BroadcastReceiver(实现成本最低,适合轻量数据传递)
通过Android系统广播实现跨进程通信,主进程发广播,Unity进程注册接收器接收消息
- 操作步骤:
- 自定义全局唯一的广播Action,例如
com.你的包名.SEND_TO_UNITY - Unity侧C#代码注册对应Action的广播接收器,收到消息后调用内部业务方法处理参数
- Xamarin Android主进程需要传数据时,发送携带参数的对应Action广播即可
- 自定义全局唯一的广播Action,例如
- Xamarin主进程发广播示例代码:
var sendIntent = new Intent("com.你的包名.SEND_TO_UNITY"); sendIntent.PutExtra("payload", "要传递的字符串内容"); SendBroadcast(sendIntent);
- Unity侧接收广播示例代码:
#if UNITY_ANDROID using UnityEngine; public class UnityMsgReceiver : AndroidJavaProxy { public UnityMsgReceiver() : base("android.content.BroadcastReceiver") { } public void onReceive(AndroidJavaObject context, AndroidJavaObject intent) { string data = intent.Call<string>("getStringExtra", "payload"); // 这里直接调用你原本要触发的Unity方法,例如 GameObject.Find("Gameobject").SendMessage("MyMethod", data); } } // 注册逻辑放在Unity入口脚本的Start生命周期中 void Start() { AndroidJavaObject currentActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaObject intentFilter = new AndroidJavaObject("android.content.IntentFilter", "com.你的包名.SEND_TO_UNITY"); UnityMsgReceiver receiver = new UnityMsgReceiver(); currentActivity.Call("registerReceiver", receiver, intentFilter); } #endif
方案2:AIDL(适合高频、复杂数据传输场景)
如果需要频繁传递数据、或者需要传递自定义结构体、双向通信,用AIDL实现更稳定高效
- 操作步骤:
- 定义通用AIDL接口文件,分别放到Xamarin主进程和Unity进程的AIDL目录下
- 在Unity进程的Activity中实现AIDL的Stub接口,处理主进程的调用请求
- 主进程绑定Unity进程的Service,拿到AIDL代理对象后直接调用接口方法传参
方案3:共享存储(适合非实时的参数传递)
如果只是传递非实时的简单配置类数据,可以用跨进程模式的SharedPreferences中转
- 主进程写入数据到SharedPreferences时指定
MODE_MULTI_PROCESS模式,Unity进程读取对应Key的取值即可 - 优点:实现成本极低,不需要额外的通信逻辑
内容的提问来源于stack exchange,提问作者droid3d
相关产品推荐
相关产品推荐

