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

97 lines
3.1 KiB
C#

using UnityEngine;
using UnityEngine.UI;
public class ToolRadialMenu : MonoBehaviour
{
[Header("Ссылки")]
[SerializeField] private GameObject menuPanel;
[SerializeField] private PlayerToolManager toolManager;
[Tooltip("По одной иконке на инструмент в порядке ToolType: Руки, Зачистка, Шпатель, Шлифовка, Баллончик")]
[SerializeField] private Image[] sectorIcons;
[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);
// Сразу подсвечиваем текущий инструмент
selectedIndex = Mathf.Clamp((int)toolManager.currentTool, 0, Mathf.Max(0, sectorIcons.Length - 1));
HighlightSelection();
// Разблокируем курсор для кругового выбора
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
private void CalculateMouseSector()
{
if (sectorIcons.Length == 0) return;
Vector2 screenCenter = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f);
Vector2 mouseDelta = (Vector2)Input.mousePosition - screenCenter;
// Если мышь почти в центре - ничего не меняем
if (mouseDelta.magnitude < 30f) return;
// Угол мыши 0..360 (0 = вправо, против часовой стрелки)
float angle = Mathf.Atan2(mouseDelta.y, mouseDelta.x) * Mathf.Rad2Deg;
if (angle < 0) angle += 360f;
// Сектора одинакового размера: для 5 инструментов по 72 градуса
float sectorSize = 360f / sectorIcons.Length;
selectedIndex = Mathf.Clamp(Mathf.FloorToInt(angle / sectorSize), 0, sectorIcons.Length - 1);
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);
}
}