using UnityEngine; using UnityEngine.UI; public class ToolRadialMenu : MonoBehaviour { [Header("Ссылки")] [SerializeField] private GameObject menuPanel; [SerializeField] private PlayerToolManager toolManager; [SerializeField] private Image[] sectorIcons; // 3 иконки (0: Руки, 1: Шлифмашинка, 2: Баллончик) [Header("Цвета выделения")] [SerializeField] private Color normalColor = Color.white; [SerializeField] private Color selectedColor = Color.yellow; private int selectedIndex = 0; private bool isMenuOpen = false; private void Start() { menuPanel.SetActive(false); } private void Update() { // Открытие/закрытие по клавише Tab if (Input.GetKeyDown(KeyCode.Tab)) { OpenMenu(); } else if (Input.GetKeyUp(KeyCode.Tab)) { CloseMenuAndApply(); } if (isMenuOpen) { CalculateMouseSector(); } } private void OpenMenu() { isMenuOpen = true; menuPanel.SetActive(true); // Разблокируем курсор для кругового выбора Cursor.lockState = CursorLockMode.None; Cursor.visible = true; } private void CalculateMouseSector() { Vector2 screenCenter = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f); Vector2 mouseDelta = (Vector2)Input.mousePosition - screenCenter; // Если мышь почти в центре — ничего не меняем if (mouseDelta.magnitude < 30f) return; // Вычисляем угол мыши от -180 до 180 градусов float angle = Mathf.Atan2(mouseDelta.y, mouseDelta.x) * Mathf.Rad2Deg; if (angle < 0) angle += 360f; // Переводим в 0..360 // 3 сектора по 120 градусов: // Сектор 0 (0..120): Руки // Сектор 1 (120..240): Шлифмашинка // Сектор 2 (240..360): Баллончик selectedIndex = Mathf.FloorToInt(angle / 120f); HighlightSelection(); } private void HighlightSelection() { for (int i = 0; i < sectorIcons.Length; i++) { sectorIcons[i].color = (i == selectedIndex) ? selectedColor : normalColor; } } private void CloseMenuAndApply() { isMenuOpen = false; menuPanel.SetActive(false); // Возвращаем прицел от первого лица Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; // Применяем выбранный инструмент toolManager.SelectTool((ToolType)selectedIndex); } }