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);
}
}
}
原文地址:https://blog.csdn.net/hookby/article/details/145226952
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!