using System.Collections.Generic; using TMPro; using Unity.VisualScripting; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.HID; public class SettingsPage : MonoBehaviour { private const string TextNoConnected = "Не подключено"; [SerializeField] private TMP_Dropdown _dropdownDevices; [SerializeField] private TMP_Text _textPreset; [SerializeField] private ButtonSubmenu[] _buttonsSubmenu; [SerializeField] private GameObject _submenuControlElement; [SerializeField] private GameObject _submenuNetwork; private List _devices = new List(); private TypeSubmenu _thisSubmenu; private void OnEnable() { foreach (ButtonSubmenu buttonSubmenu in _buttonsSubmenu) { buttonSubmenu.OpenSubmenu += OpenSubmenu; } _dropdownDevices.onValueChanged.AddListener(SelectJoystick); InputSystem.onDeviceChange += DeviceChange; } private void OnDisable() { foreach (ButtonSubmenu buttonSubmenu in _buttonsSubmenu) { buttonSubmenu.OpenSubmenu -= OpenSubmenu; } _dropdownDevices.onValueChanged.RemoveListener(SelectJoystick); InputSystem.onDeviceChange -= DeviceChange; } private void Start() { ResetDevice(); } private void DeviceChange(InputDevice device, InputDeviceChange change) { //Перепиши метод! switch (change) { case InputDeviceChange.Added: ResetDevice(); break; case InputDeviceChange.Removed: ResetDevice(); break; case InputDeviceChange.Disconnected: ResetDevice(); break; case InputDeviceChange.Reconnected: ResetDevice(); break; } } private void ResetDevice() { //Перепиши метод! var devices = InputSystem.devices; _devices.Clear(); foreach (var inputDevice in devices) { if (inputDevice.description.interfaceName == nameof(HID)) { _devices.Add(inputDevice); } } _dropdownDevices.ClearOptions(); List data = new List { new TMP_Dropdown.OptionData(TextNoConnected) }; foreach (var device in _devices) { data.Add(new TMP_Dropdown.OptionData(device.name)); } _dropdownDevices.AddOptions(data); } private void SelectJoystick(int index) { if (index == 0) { _textPreset.text = "Тип:"; return; } InputController.SetDevice(_devices[index - 1]); SetPreset(_devices[index - 1]); } private void SetPreset(InputDevice inputDevice) { byte[] bytes = (byte[])inputDevice.ReadValueAsObject(); switch (bytes.Length) { case 8: InputController.SetPreset(new InputPreset8()); _textPreset.text = "Тип: 8 байт"; break; case 20: InputController.SetPreset(new InputPreset20()); _textPreset.text = "Тип: 20 байт"; break; default: _textPreset.text = "Тип: Мы такое не знаем"; break; } } private void OpenSubmenu(TypeSubmenu typeSubmenu) { } private void SetActiveSubmenu(TypeSubmenu typeSubmenu, bool isActive) { switch (typeSubmenu) { case TypeSubmenu.ControlElement: _submenuControlElement.SetActive(isActive); break; case TypeSubmenu.Network: _submenuNetwork.SetActive(isActive); break; } } }