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

devtools/2025/1/21 3:40:34/

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

这里的根据项目需要,按文件的目录结够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/devtools/152253.html

相关文章

Redis 中 TTL 的基本知识与禁用缓存键的实现策略(Java)

目录 前言1. 基本知识2. Java代码 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 单纯学习Redis可以看我前言的Java基本知识路线&#xff01;&#xff01; 对于Java的基本知识推荐阅读&#xff1a; java框架…

一文读懂服务器的HBA卡

什么是 HBA 卡 HBA 卡&#xff0c;全称主机总线适配器&#xff08;Host Bus Adapter&#xff09; &#xff0c;是服务器与存储装置间的关键纽带&#xff0c;承担着输入 / 输出&#xff08;I/O&#xff09;处理及物理连接的重任。作为一种电路板或集成电路适配器&#xff0c;HBA…

简述mysql 主从复制原理及其工作过程,配置一主两从并验证。

MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志中的操作。 MySQL主从同步是基…

【C++学习篇】哈希表的实现

目录 1.哈希的概念 1.1 直接定址法 1.1.1 例题 字符串中的第一个唯一字符 1.2 哈希函数 1.2.1除法散列法/除留余数法 1.2.2 乘法散列法 1.3 哈希冲突 1.4 负载因子 1.5 处理哈希冲突 1.5.1 开放定址法 1.5.1.1 线性探测 1.5.1.2 二次探测 1.5.1.3 双重探测 1.哈…

使用Go语言中的Buffer实现高性能处理字节和字符串

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

golang标准库path/filepath使用示例

文章目录 前言一、常用方法示例1.将相对路径转换为绝对路径2.获取路径中最后一个元素3.获取路径中除去最后一个元素的部分4.路径拼接5.将路径拆分为目录和文件名两部分6.返回一个相对路径7.文件路径遍历8.根据文件扩展名过滤文件9.使用正则表达式进行路径匹配 前言 path/filep…

如何将本地电脑上的文件夹设置为和服务器的共享文件夹

将本地电脑上的文件夹设为与服务器共享的文件夹&#xff0c;通常是在本地开启文件共享&#xff0c;并配置相应的权限&#xff0c;使服务器可以访问该文件夹。以下以 Windows 系统为例说明具体操作步骤&#xff1a; 一、在本地电脑上设置共享文件夹 选择文件夹 找到需要共享的文…

ARM学习(42)CortexM3/M4 MPU配置

笔者之前学习过CortexR5的MPU配置,现在学习一下CortexM3/M4 MPU配置 1、背景介绍 笔者在工作中遇到NXP MPU在访问异常地址时,就会出现总线挂死,所以需要MPU抓住异常,就需要配置MPU。具体背景情况可以参考ARM学习(41)NXP MCU总线挂死,CPU could not be halted以及无法连…