92 lines
2.8 KiB
C#
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);
|
|
}
|
|
} |