当前位置: 首页 > article >正文

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

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

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

相关文章:

  • 差异基因富集分析(R语言——GOKEGGGSEA)
  • ARP Check
  • 设计模式-单例模式
  • QT 使用QTableView读取数据库数据,表格分页,跳转,导出,过滤功能
  • 3D 视觉语言推理中的态势感知
  • dl学习笔记:(4)简单神经网络
  • Spring参数校验,数组入参校验 :List<E>
  • 打造智能气象预测系统:AI如何改变天气预报的未来
  • 电梯系统的UML文档04
  • 创建一个简单的spring boot+vue前后端分离项目
  • Jmeter Beanshell脚本批量提取接口的值生成csv文档
  • 蓝桥杯训练—斐波那契数列
  • 我的常用vim操作
  • Harmony OS 5.0.1 模拟器报未开启 Hyper-V解决方法
  • 华为HuaweiCloudStack(一)介绍与架构
  • 【STM32-学习笔记-13-】WDG看门狗
  • python有goto语句吗
  • 《Java开发手册》核心内容
  • Qt开发:QSqlDatabase的常见用法
  • JAVA实现捡金币闯关小游戏(附源码)
  • xclip和xsel命令行工具详解
  • 大语言模型的语境中“越狱”和思维链
  • 最新-CentOS 7安装Docker容器(适合本地和云服务器安装)
  • 统信V20 1070e X86系统编译安装PostgreSQL-13.11版本以及主从构建
  • 嵌入式工程师必学(67):SWD仿真接口(for ARM)的使用方法
  • 在 Windows 上,如果忘记了 MySQL 密码 重置密码