97 lines
3.1 KiB
C#
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);
|
|
}
|
|
} |