Как в Unity реализовать выбор COM-порта через всплывающее окно?

Как мне реализовать выбор COM-порта через выпадающий список (dropdown) в Unity, чтобы при нажатии кнопок отправлялись определенные буквы в сериал порт, и Arduino их принимала и выполняла соответствующие задачи?
  • 10 декабря 2024 г. 20:03
Ответы на вопрос 1
Для реализации выбора COM-порта через выпадающее меню в Unity, вам понадобится выполнить несколько шагов. Вы можете использовать класс `SerialPort` из пространства имен `System.IO.Ports` для работы с COM-портами. Далее будет представлена упрощенная версия, как это можно реализовать в Unity.

### Шаги для реализации:

1. **Создайте интерфейс пользователя**:
    - Создайте Canvas в сцене.
    - Добавьте Dropdown для выбора COM-порта.
    - Добавьте несколько кнопок для отправки данных через COM-порт.

2. **Скрипт для работы с COM-портами**:
   Вам потребуется создать скрипт для управления COM-портами и отправкой данных. Вот пример кода:

```csharp
using UnityEngine;
using UnityEngine.UI;
using System.IO.Ports;
using System.Collections.Generic;

public class SerialPortManager : MonoBehaviour
{
    public Dropdown portDropdown;
    public Button sendButtonA;
    public Button sendButtonB;
    
    private SerialPort serialPort;

    void Start()
    {
        // Заполнитеdropdown доступными COM-портами
        List<string> portNames = new List<string>(SerialPort.GetPortNames());
        portDropdown.AddOptions(portNames);

        // Подписка на событие изменения выбора в dropdown
        portDropdown.onValueChanged.AddListener(OnPortSelected);

        // Подписка на события кнопок
        sendButtonA.onClick.AddListener(() => SendData("A"));
        sendButtonB.onClick.AddListener(() => SendData("B"));
    }

    void OnPortSelected(int index)
    {
        // Закрытие порта, если ранее он был открыт
        if (serialPort != null && serialPort.IsOpen)
        {
            serialPort.Close();
        }

        // Открытие нового порта
        string selectedPort = portDropdown.options[index].text;
        serialPort = new SerialPort(selectedPort, 9600); // Установите скорость порта
        serialPort.Open();
    }

    void SendData(string data)
    {
        if (serialPort != null && serialPort.IsOpen)
        {
            serialPort.Write(data);
            Debug.Log($"Sent: {data}");
        }
        else
        {
            Debug.LogError("Serial port is not open!");
        }
    }

    void OnApplicationQuit()
    {
        // Закрытие порта при выходе
        if (serialPort != null && serialPort.IsOpen)
        {
            serialPort.Close();
        }
    }
}
```

### Инструкции по работе с кодом:

- **Dropdown**: Передайте ваш экземпляр Dropdown из Unity в поле `portDropdown` в инспекторе. Это гарантирует, что скрипт сможет получать доступ к вашим вариантам COM-портов.
- **Кнопки**: Аналогично, свяжите ваши кнопки с методами отправки данных. В примере выше при нажатии кнопки будет отправлена буква "A" или "B" в зависимости от кнопки.

### Обратите внимание:
- Убедитесь, что в вашей сборке Unity включен доступ к `System.IO.Ports`. Это может требовать дополнительные настройки в зависимости от используемой платформы.
- Не забудьте подключить ваше Arduino устройство и установить его скорость передачи данных (Baud Rate) на ту же величину, что и в Unity.
- Для тестирования вы можете использовать Serial Monitor в Arduino IDE, чтобы убедиться, что ваши данные поступают корректно.

### Заключение
Данный подход позволяет вам динамически выбирать доступные COM-порты и отправлять данные по выбранному порту. Этот код является базовой реализацией, и его можно расширять в зависимости от ваших конкретных потребностей и функций.
Похожие вопросы