You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:13:11