如何实现Android向Unity传递参数?已发Intent但不知接收方法
解决Android App向Unity App传递Int参数的问题
我来帮你搞定这个参数传递的问题,你已经成功用Intent唤起Unity App了,现在只需要把参数正确递到Unity脚本里就行,这里有两种靠谱的方案,你可以按需选择:
方案一:Android端主动将参数发送到Unity脚本
之前你调用UnitySendMessage报错,大概率是调用时机不对、GameObject名称拼写错误,或者参数格式不匹配。按下面的步骤修改就能解决:
1. 更新UnityPlayerActivity代码
修改导出后的UnityPlayerActivity,在初始化完成后处理Intent参数,并调用UnitySendMessage传递给Unity:
public class UnityPlayerActivity extends Activity { protected UnityPlayer mUnityPlayer; @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); mUnityPlayer = new UnityPlayer(this); setContentView(mUnityPlayer); mUnityPlayer.requestFocus(); // 处理启动时的Intent参数 passParamToUnity(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); // 处理App从后台唤起时的新Intent参数 passParamToUnity(intent); } // 封装参数传递逻辑 private void passParamToUnity(Intent intent) { if (intent != null) { // 获取Intent中的int参数,第二个值是默认 fallback int typeValue = intent.getIntExtra(Constant.TYPE, Constant.VISUAL); // UnitySendMessage参数说明:GameObject名称(大小写敏感)、脚本方法名、传递的字符串(仅支持string类型) UnityPlayer.UnitySendMessage("GameObjectUI", "TipoTest", String.valueOf(typeValue)); } } }
2. 确认Unity端脚本配置
检查你的Unity脚本是否满足以下要求:
- 脚本必须挂载在**名称完全为"GameObjectUI"**的GameObject上(Unity对GameObject名称大小写敏感,不能写错)
TipoTest方法必须是public修饰,参数类型为string(因为UnitySendMessage仅支持传递字符串,你可以在Unity里再转回int)- 这个GameObject在Unity启动时必须处于激活状态,不能是动态生成的(否则调用时会找不到目标)
你的Unity脚本可以保留,也可以优化下转int的逻辑:
using UnityEngine; using UnityEngine.UI; public class YourScript : MonoBehaviour { public Text prueba; // 记得在Inspector面板中给这个Text组件赋值 public void TipoTest(string token) { // 安全转换字符串为int if(int.TryParse(token, out int typeValue)) { prueba.text = $"Received type: {typeValue}"; } else { prueba.text = "Invalid parameter"; } } }
方案二:Unity端主动从Android Intent获取参数(推荐)
这种方式不需要修改UnityPlayerActivity,Unity自己在启动时主动读取Intent参数,能完美避免调用时机的问题(比如Unity还没加载好GameObject就触发了UnitySendMessage),步骤更简洁:
直接在Unity脚本里添加如下代码:
using UnityEngine; using UnityEngine.UI; public class GetIntentParam : MonoBehaviour { public Text prueba; void Start() { // 仅在Android平台生效,编辑器下不执行 #if UNITY_ANDROID && !UNITY_EDITOR // 获取当前Unity对应的Activity AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity"); // 获取Intent对象 AndroidJavaObject intent = currentActivity.Call<AndroidJavaObject>("getIntent"); if(intent != null) { // 替换成你Java端Constant.TYPE对应的字符串(比如"LEARNING_STYLE_ID") string paramKey = "TYPE"; // 获取int参数,第二个值是默认 fallback int typeValue = intent.Call<int>("getIntExtra", paramKey, 0); prueba.text = $"Received type: {typeValue}"; } #endif } }
把这个脚本挂载到任意一个启动时就激活的GameObject上,给prueba赋值Text组件,Unity启动后就会自动读取Intent里的参数了。
关键注意事项
- 确保Java端和Unity端的参数Key完全一致:比如Java里
Constant.TYPE对应的字符串是啥,Unity里就要用一模一样的字符串 - 测试要覆盖两种场景:Unity App完全关闭时启动,以及Unity App在后台时被唤起,确保两种情况都能正常接收参数
- 如果用方案一,一定要保证
UnitySendMessage在UnityPlayer初始化完成后调用,上面的代码放在onCreate里是安全的
内容的提问来源于stack exchange,提问作者Oscar.Aldaz
相关产品推荐
相关产品推荐

