You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:33:23