如何在Unity安卓应用中通过C#脚本调用Termux实现交互
Unity安卓端调用Termux执行命令实现方案
前置要求
- 已完成Termux侧要求的权限、组件导出相关配置
- Unity项目已切换至安卓平台,完成基础安卓环境配置
核心实现逻辑
Unity安卓平台下通过内置的AndroidJavaClass/AndroidJavaObject类直接调用原生Android Intent接口,逻辑与给出的Java示例完全对齐,不需要额外编写Java插件。
执行ls命令的完整C#脚本
把脚本挂载到场景内任意GameObject上,将UI按钮的点击事件绑定到ExecuteLsCommand方法即可触发执行。
using UnityEngine; public class TermuxCommandRunner : MonoBehaviour { public void ExecuteLsCommand() { #if UNITY_ANDROID && !UNITY_EDITOR // 获取当前安卓Activity上下文 AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); // 初始化Intent对象 AndroidJavaObject runCommandIntent = new AndroidJavaObject("android.content.Intent"); // 配置Termux服务组件与Action runCommandIntent.Call<AndroidJavaObject>("setClassName", "com.termux", "com.termux.app.RunCommandService"); runCommandIntent.Call<AndroidJavaObject>("setAction", "com.termux.RUN_COMMAND"); // 配置命令参数:执行home目录下的ls命令 // ls命令在Termux中的绝对路径 runCommandIntent.Call<AndroidJavaObject>("putExtra", "com.termux.RUN_COMMAND_PATH", "/data/data/com.termux/files/usr/bin/ls"); // 命令参数,无额外参数传空数组,需要加-la等参数时写入数组即可 string[] cmdArgs = new string[] { }; runCommandIntent.Call<AndroidJavaObject>("putExtra", "com.termux.RUN_COMMAND_ARGUMENTS", cmdArgs); // 命令执行工作目录,默认使用Termux家目录 runCommandIntent.Call<AndroidJavaObject>("putExtra", "com.termux.RUN_COMMAND_WORKDIR", "/data/data/com.termux/files/home"); // 是否后台运行:false为打开Termux前台会话显示执行结果,true为静默后台执行 runCommandIntent.Call<AndroidJavaObject>("putExtra", "com.termux.RUN_COMMAND_BACKGROUND", false); // 会话行为:0代表新建会话执行命令 runCommandIntent.Call<AndroidJavaObject>("putExtra", "com.termux.RUN_COMMAND_SESSION_ACTION", "0"); // 适配安卓8.0+的前台服务启动规则 AndroidJavaClass buildVersion = new AndroidJavaClass("android.os.Build$VERSION"); int sdkLevel = buildVersion.GetStatic<int>("SDK_INT"); if (sdkLevel >= 26) { currentActivity.Call("startForegroundService", runCommandIntent); } else { currentActivity.Call("startService", runCommandIntent); } #endif } }
自定义调整说明
- 要执行其他命令时,只需要替换
RUN_COMMAND_PATH为对应命令在Termux环境中的绝对路径,将命令参数按顺序写入cmdArgs字符串数组即可 - 若需要后台静默执行不弹出Termux窗口,将
RUN_COMMAND_BACKGROUND的传值改为true RUN_COMMAND_SESSION_ACTION参数可选值:0新建会话执行、1在现有活动会话执行、2执行完毕后自动结束会话
注意事项
- 执行前必须确保设备已安装Termux,且Termux已经完成首次启动初始化(解压完基础环境包),否则会出现命令找不到的错误
- Unity Player Settings中需将Write Permission设置为External,避免权限拦截
- 仅通过Intent只能实现命令触发,如果需要在自定义Unity UI中实时显示Termux命令输出、向会话输入指令,需要额外建立本地跨进程通信通道(比如本地Socket、ContentProvider)做输入输出流转发
内容的提问来源于stack exchange,提问作者saricden
相关产品推荐
相关产品推荐

