UnityEditor脚本:调用ADB推送文件到手机

embedded/2025/1/19 6:09:02/

因为经常要直接把工程文件推入到手机上跑真机测试,就做了一个,在工程内选中文件,推送到手机的简单脚本。

这里的根据项目需要,按文件的目录结够push进手机,如果只是推buddle,会更简单点,不做拓展了。

核心部分,unity调用ADB命令, 文件目录。

using UnityEngine;
using UnityEditor;
using System.Diagnostics;
using System.IO;public class PushFileToPhone : EditorWindow
{[MenuItem("Tools/ADB/Push Selected File To Phone")]public static void OpenWindow(){GetWindow<PushFileToPhone>("Push File To Phone");}private string luaFolderPath = "Assets/Lua"; // Lua文件夹路径private string phonePath = "/storage/emulated/0/Android/data/com.xxx.dev/files/"; // 修改为目标可写目录void OnGUI(){GUILayout.Label("Push Selected File To Phone", EditorStyles.boldLabel);luaFolderPath = EditorGUILayout.TextField("Lua Folder Path", luaFolderPath);phonePath = EditorGUILayout.TextField("Phone Path", phonePath);if (GUILayout.Button("Push File")){PushSelectedFile();}if (GUILayout.Button("Open Phone Path")){OpenPhonePath();}}private void PushSelectedFile(){try{// 获取选中的文件路径string selectedFilePath = AssetDatabase.GetAssetPath(Selection.activeObject);if (string.IsNullOrEmpty(selectedFilePath)){UnityEngine.Debug.LogError("No file selected.");return;}UnityEngine.Debug.Log("Selected File Path: " + selectedFilePath);// 判断选中文件是否为txt文件if (!selectedFilePath.EndsWith(".txt")){UnityEngine.Debug.LogError("Selected file is not a txt file.");return;}// 获取相对Lua文件夹的路径string relativePath = GetRelativePath(selectedFilePath, luaFolderPath);if (string.IsNullOrEmpty(relativePath)){UnityEngine.Debug.LogError("Selected file is not in the Lua folder.");return;}// 构建目标路径string targetPath = Path.Combine(phonePath, relativePath);UnityEngine.Debug.Log("Target Path: " + targetPath);// 创建目标目录string targetDir = Path.GetDirectoryName(targetPath);UnityEngine.Debug.Log("Target Directory: " + targetDir);CreateDirectory(targetDir);// 构建ADB命令string adbPath = GetAdbPath();string command = $"push \"{selectedFilePath}\" \"{targetPath}\"";// 执行ADB命令ProcessStartInfo processStartInfo = new ProcessStartInfo{FileName = adbPath,Arguments = command,UseShellExecute = false,RedirectStandardOutput = true,RedirectStandardError = true,CreateNoWindow = true};Process process = new Process { StartInfo = processStartInfo };process.Start();// 输出命令执行结果string output = process.StandardOutput.ReadToEnd();string error = process.StandardError.ReadToEnd();process.WaitForExit();if (string.IsNullOrEmpty(error)){UnityEngine.Debug.Log("File pushed successfully: " + output);}else{UnityEngine.Debug.LogError("Error pushing file: " + error);}}catch (System.Exception ex){UnityEngine.Debug.LogError("Exception: " + ex.Message);}}private string GetRelativePath(string filePath, string baseFolderPath){// 确保基础文件夹路径以斜杠结尾if (!baseFolderPath.EndsWith("/")){baseFolderPath += "/";}// 判断文件是否在基础文件夹内if (!filePath.StartsWith(baseFolderPath)){return null;}// 获取相对路径string relativePath = filePath.Substring(baseFolderPath.Length);relativePath = relativePath.Replace("\\", "/");return relativePath;}private void CreateDirectory(string dirPath){try{// 构建ADB命令string adbPath = GetAdbPath();string command = $"shell mkdir -p \"{dirPath}\"";// 执行ADB命令ProcessStartInfo processStartInfo = new ProcessStartInfo{FileName = adbPath,Arguments = command,UseShellExecute = false,RedirectStandardOutput = true,RedirectStandardError = true,CreateNoWindow = true};Process process = new Process { StartInfo = processStartInfo };process.Start();// 输出命令执行结果string output = process.StandardOutput.ReadToEnd();string error = process.StandardError.ReadToEnd();process.WaitForExit();if (!string.IsNullOrEmpty(error)){UnityEngine.Debug.LogError("Error creating directory: " + error);}else{UnityEngine.Debug.Log("Directory created successfully: " + dirPath);}}catch (System.Exception ex){UnityEngine.Debug.LogError("Exception creating directory: " + ex.Message);}}private string GetAdbPath(){// 这里假设ADB工具已安装在系统环境变量中,直接返回"adb"即可// 如果ADB工具未安装在环境变量中,需要指定ADB工具的完整路径return "adb";}private void OpenPhonePath(){try{// 构建ADB命令string adbPath = GetAdbPath();string command = $"shell am start -a android.intent.action.VIEW -d \"file://{phonePath}\"";// 执行ADB命令ProcessStartInfo processStartInfo = new ProcessStartInfo{FileName = adbPath,Arguments = command,UseShellExecute = false,RedirectStandardOutput = true,RedirectStandardError = true,CreateNoWindow = true};Process process = new Process { StartInfo = processStartInfo };process.Start();// 输出命令执行结果string output = process.StandardOutput.ReadToEnd();string error = process.StandardError.ReadToEnd();process.WaitForExit();if (string.IsNullOrEmpty(error)){UnityEngine.Debug.Log("Phone path opened successfully: " + output);}else{UnityEngine.Debug.LogError("Error opening phone path: " + error);}}catch (System.Exception ex){UnityEngine.Debug.LogError("Exception opening phone path: " + ex.Message);}}
}

http://www.ppmy.cn/embedded/155155.html

相关文章

【.net core】【sqlsugar】时间查询示例

1、时间包含查询示例 //model.TimeInterval为时间区间参数&#xff0c;参数格式为2024-01-01~2025-01-01 //query为当前查询的语句内容 //为当前查询语句增加创建时间模糊搜索查询条件 query query.Where(a > ((DateTime)a.F_CreatorTime).ToString("yyyy-MM-dd HH:m…

C++学习记录

本文章建立在已学C语言的基础上 第一阶段 生成随机数函数&#xff1a;rand()。rand()%100指的是生成0~99的随机数。这样生成的随机数每次都是一样顺序出现的&#xff0c;为了防止这个问题出现&#xff0c;我们可以使用随机数种子&#xff0c;如下代码 #include<iostream&…

三数之和力扣--15

目录 题目 思路 代码 题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以…

Kibana:ES|QL 编辑器简介

作者&#xff1a;来自 Elastic drewdaemon ES|QL 很重要 &#x1f4aa; 正如你可能已经听说的那样&#xff0c;ES|QL 是 Elastic 的新查询语言。我们对 ES|QL 寄予厚望。它已经很出色了&#xff0c;但随着时间的推移&#xff0c;它将成为与 Elasticsearch 中的数据交互的最强大…

openharmony/build/README_zh.md学习

编译构建 简介目录约束与限制说明常见问题说明相关仓 简介 编译构建子系统提供了一个基于Gn和ninja的编译构建框架。 根据产品配置&#xff0c;编译生成对应的镜像包。其中编译构建流程为&#xff1a; 使用Gn配置构建目标。Gn运行后会生成ninja文件。通过运行ninja来执行编…

JAVA:利用 RabbitMQ 死信队列实现支付超时场景的技术指南

1、简述 在支付系统中&#xff0c;订单支付的超时自动撤销是一个非常常见的业务场景。通常用户未在规定时间内完成支付&#xff0c;系统会自动取消订单&#xff0c;释放相应的资源。本文将通过利用 RabbitMQ 的 死信队列&#xff08;Dead Letter Queue, DLQ&#xff09;来实现…

中间件 MetaQ

MetaQ&#xff08;全称Metamorphosis&#xff09;是一个高性能、高可用、可扩展的分布式消息中间件&#xff0c;其思路起源于LinkedIn的Kafka&#xff0c;但并不是Kafka的一个Copy。以下是关于MetaQ的详细介绍&#xff1a; 基本特性 • 高性能&#xff1a;具有消息存储顺序写、…

前端——换行

大家都知道<br />和\n是有换行的作用 很多时候&#xff0c;有些区分不开<br />和\n的区别&#xff0c;他俩各自在什么情形下使用呢 一、<br /> 在浏览器中&#xff0c;<br /> 会强制文本在当前位置换行。 适用于需要在特定位置插入换行的场景。 二、…