Страница 1 из 1

Круговое меню. Выбор наведением. Как?

СообщениеДобавлено: 05 сен 2018, 11:57
Raspad
Для своей выживалки решил использовать тему из Rust для постройки зданий
Изображение
Реализую конечно по уровню своих знаний.. Пункты реализованы как объекты с центром в круге и повернутые на нужный градус в зависимости от количества.

Вопросы вот в чем..
-Как сделать выбор через наведение? Механика выбора в том, что при зажатой ПКМ вылазит кольцо, где нужно навести на нужный "элемент" и отпустить ПКМ, подтвердив тем самым выбранный элемент.(по сути я не знаю как определить выбираемый предмет, так как кнопки тут бессильны).
-Как можно реализовать "нарисовывание" кольца под пунктами и сегмента "выбираемого" элемента?

Re: Круговое меню. Выбор наведением. Как?

СообщениеДобавлено: 05 сен 2018, 13:13
getAlex
Это просто квадратная панелька с текстурой кольца, либо белый квадрат с маской инвертированного кольца, кнопки размещены математически по формуле точки на окружности, вместе с заранее нарисованными сегментами для подсветки при наведении, которые правильно смотрят в центр панели(точнее он там только один. Просто меняет своё положение и ротацию). А наведение через обычный ивент триггер интерфейса.

Re: Круговое меню. Выбор наведением. Как?

СообщениеДобавлено: 05 сен 2018, 13:29
waruiyume
1 Сложите "кнопки в массив".
2 Заведите переменную в которой будет храниться клампнутая дельта мышиной позиции.
3 При драге добавляйте дельту в эту переменную.
4 Теперь смотрим угол на который этот(2) вектор отклонён от направления на первую "кнопку", для простоты можно ставить первую кнопку точно наверх.
5 получаем элемент массива на который направлен драг. Что-то вроде:
var selected = buttons[(int)(buttons.Lenght*Matn.Atan2(bufferedDeltaY, bufferedDeltaX)*Math.Rad2Deg/180)];

Re: Круговое меню. Выбор наведением. Как?

СообщениеДобавлено: 05 сен 2018, 13:44
getAlex
waruiyume писал(а):1 Сложите "кнопки в массив".
2 Заведите переменную в которой будет храниться клампнутая дельта мышиной позиции.
3 При драге добавляйте дельту в эту переменную.
4 Теперь смотрим угол на который этот(2) вектор отклонён от направления на первую "кнопку", для простоты можно ставить первую кнопку точно наверх.
5 получаем элемент массива на который направлен драг. Что-то вроде:
var selected = buttons[(int)(buttons.Lenght*Matn.Atan2(bufferedDeltaY, bufferedDeltaX)/180)];


Зачем так усложнять себе жизнь углами и математикой? Нормализуем вектор от центра круга до позиции мыши и смотрим дистанцию до кнопок в пределах окружности, находим ближайшую кнопку. Это же простейшая реализация рулетки.

Изображение

Картинка немного ущербная: секторы должны стоять так, чтоб красные точки на окружности были в их центре, а не по краям.

Re: Круговое меню. Выбор наведением. Как?

СообщениеДобавлено: 05 сен 2018, 13:49
waruiyume
Вы то радели за оптимизацию в крайне кхм... экстремальной форме, а теперь предлагаете массив перебирать, когда этого можно не делать, и банально букафф больше получится (popcorn1)

Re: Круговое меню. Выбор наведением. Как?

СообщениеДобавлено: 05 сен 2018, 14:04
getAlex
waruiyume писал(а):Вы то радели за оптимизацию в крайне кхм... экстремальной форме, а теперь предлагаете массив перебирать, когда этого можно не делать, и банально букафф больше получится (popcorn1)

Букв получится не больше, а найти дистанцию к нескольким кнопкам - не сказал бы что это что-то сложное в плане вычислений, чем нахождение каких-то дельт, углов и прочего.

А вот из явных плюсов - абсолютная очевидность и простота кода даже для человека, который вообще не знает что такое углы и как они работают в юнити и за его пределами. А значит и вероятность ошибки и продолжительности написания кода сведётся к минимуму.

Re: Круговое меню. Выбор наведением. Как?

СообщениеДобавлено: 05 сен 2018, 15:48
Raspad
Вроде получилось.. Хотя реализовал как то иначе видать.
На "элементы" был помешен скрипт с довольно простым кодом:
Синтаксис:
Используется csharp
using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;

public class EvetnSelectBurron : MonoBehaviour, IPointerEnterHandler {

        public int IDb;
        public BuildingSystem buildingSystem;

        void IPointerEnterHandler.OnPointerEnter (PointerEventData e){
                buildingSystem.selectBC = IDb;
        }

}

Ну и все.. при наведении он пинает "строй скрипт", говоря какой выбран вариант, а другой код вращает выделение.

Про нарисовать кольцо.. Просто попадался на глаза ассет который делал такие меню на лету, выбирай тока размеры внешней, внутренний границы,количества сегментов. И есть моменты где не выгодно использовать заранее нарисованные элементы, вроде того, где есть 5 пунктов, но потом их 4.. и следовательно размер "сегмента выделения" уже другой.

Re: Круговое меню. Выбор наведением. Как?

СообщениеДобавлено: 06 сен 2018, 02:52
getAlex
Raspad писал(а): и следовательно размер "сегмента выделения" уже другой.

Да, там можно ещё проще сделать: кольцо выступает маской, а "сегмент" это просто большой квадрат с радиальным отображением от градуса к градусу, которые берутся исходя из числа элементов в круге. Тогда ширина сегмента будет динамична относительно любых размеров кольца и плотности элементов в нём.

Re: Круговое меню. Выбор наведением. Как?

СообщениеДобавлено: 06 сен 2018, 11:02
Raspad
getAlex писал(а):
Raspad писал(а): и следовательно размер "сегмента выделения" уже другой.

Да, там можно ещё проще сделать: кольцо выступает маской, а "сегмент" это просто большой квадрат с радиальным отображением от градуса к градусу, которые берутся исходя из числа элементов в круге. Тогда ширина сегмента будет динамична относительно любых размеров кольца и плотности элементов в нём.

Также подумал, тока там надо вычитать из угла поворота половину "размера" сегмента(в теории, мне так кажется ибо не проверял на практике еще).
Хотя в последней версии игры у них сегмент выделения немного смещен и вылазит за кольцо, но думаю решается все тем же методом.