Unity C#编辑器脚本开发:如何在自定义窗口展示已连接安卓设备
解决Unity C#工具的安卓设备展示与名称提取问题
嘿,我来帮你搞定这两个问题!正好我之前也做过类似的Unity构建工具,分享下我的解决方案:
一、将安卓设备信息展示在自定义Editor窗口里
首先,你需要创建一个继承自EditorWindow的自定义窗口,然后在OnGUI()方法里绘制设备列表。这里分两种实用的展示方式:
方式1:用下拉菜单让用户选择设备
这种方式适合快速选择单个目标设备,代码示例如下:
using UnityEditor; using UnityEngine; using UnityEditor.Android; public class AndroidBuildTool : EditorWindow { private AndroidDevice[] connectedDevices; private int selectedDeviceIndex = 0; private Vector2 scrollPos; [MenuItem("Tools/安卓构建工具")] public static void OpenToolWindow() { GetWindow<AndroidBuildTool>("安卓构建助手"); } private void OnEnable() { // 窗口激活时自动刷新设备列表 RefreshConnectedDevices(); } private void RefreshConnectedDevices() { connectedDevices = AndroidDebugBridge.GetConnectedDevices(); selectedDeviceIndex = connectedDevices.Length > 0 ? 0 : -1; } private void OnGUI() { GUILayout.Label("目标设备选择", EditorStyles.boldLabel); // 刷新设备按钮 if (GUILayout.Button("刷新设备列表")) { RefreshConnectedDevices(); } // 生成设备名称选项数组 string[] deviceNames = new string[connectedDevices.Length]; for (int i = 0; i < connectedDevices.Length; i++) { deviceNames[i] = connectedDevices[i].name; // 这里直接提取设备名称 } // 绘制下拉菜单 if (connectedDevices.Length > 0) { selectedDeviceIndex = EditorGUILayout.Popup("选择设备", selectedDeviceIndex, deviceNames); AndroidDevice selectedDevice = connectedDevices[selectedDeviceIndex]; GUILayout.Label($"当前选中设备ID: {selectedDevice.id}", EditorStyles.miniLabel); } else { EditorGUILayout.HelpBox("未检测到已连接的安卓设备", MessageType.Info); } // 一键构建运行按钮 if (GUILayout.Button("构建并运行到设备")) { if (connectedDevices.Length == 0) { EditorUtility.DisplayDialog("提示", "请先连接安卓设备", "确定"); return; } RunOnSelectedDevice(selectedDeviceIndex); } } private void RunOnSelectedDevice(int index) { AndroidDevice targetDevice = connectedDevices[index]; // 这里补充你的构建逻辑,比如用BuildPipeline生成APK,再通过ADB安装运行 // 示例:AndroidDebugBridge.InstallApp(targetDevice.id, "你的APK路径"); // AndroidDebugBridge.RunApp(targetDevice.id, "你的应用包名"); } }
方式2:用滚动列表展示所有设备
如果需要同时查看所有设备的详细信息,滚动列表会更合适:
private void OnGUI() { GUILayout.Label("已连接设备列表", EditorStyles.boldLabel); if (GUILayout.Button("刷新设备")) RefreshConnectedDevices(); if (connectedDevices.Length == 0) { EditorGUILayout.HelpBox("暂无设备连接", MessageType.Info); return; } scrollPos = EditorGUILayout.BeginScrollView(scrollPos); foreach (var device in connectedDevices) { EditorGUILayout.BeginHorizontal(); GUILayout.Label($"名称: {device.name}", GUILayout.Width(200)); GUILayout.Label($"ID: {device.id}", GUILayout.Width(150)); if (GUILayout.Button("选择运行", GUILayout.Width(100))) { SelectAndRunDevice(device); } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); } EditorGUILayout.EndScrollView(); } private void SelectAndRunDevice(AndroidDevice device) { // 执行选中设备的构建运行逻辑 }
二、只提取设备名称(避免输出全部信息)
你之前输出全部信息,应该是直接把AndroidDevice对象调用ToString()了——这个对象默认会输出所有属性。要只获取名称,直接访问AndroidDevice的name属性就可以!
比如你之前可能写的是:
// 错误示例:输出设备全部信息 foreach (var device in AndroidDebugBridge.GetConnectedDevices()) { Debug.Log(device); }
改成这样就只会输出名称:
// 正确示例:只输出设备名称 foreach (var device in AndroidDebugBridge.GetConnectedDevices()) { Debug.Log($"设备名称: {device.name}"); }
如果name属性返回的是设备型号(不是你想要的自定义名称),可以用ADB命令获取更友好的设备名称:
foreach (var device in AndroidDebugBridge.GetConnectedDevices()) { string friendlyName = AndroidDebugBridge.ExecuteAdbCommand($"shell getprop ro.product.model", device.id); Debug.Log($"设备友好名称: {friendlyName.Trim()}"); }
内容的提问来源于stack exchange,提问作者StarLord
相关产品推荐
相关产品推荐

