Perekyp/Assets/Scripts/Player/Tools/ToolRadialMenu.cs

92 lines
2.8 KiB
C#

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);
}
}