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

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

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

Сообщение Raspad 05 сен 2018, 11:57

Для своей выживалки решил использовать тему из Rust для постройки зданий
Изображение
Реализую конечно по уровню своих знаний.. Пункты реализованы как объекты с центром в круге и повернутые на нужный градус в зависимости от количества.

Вопросы вот в чем..
-Как сделать выбор через наведение? Механика выбора в том, что при зажатой ПКМ вылазит кольцо, где нужно навести на нужный "элемент" и отпустить ПКМ, подтвердив тем самым выбранный элемент.(по сути я не знаю как определить выбираемый предмет, так как кнопки тут бессильны).
-Как можно реализовать "нарисовывание" кольца под пунктами и сегмента "выбираемого" элемента?
Аватара пользователя
Raspad
UNITрон
 
Сообщения: 221
Зарегистрирован: 28 мар 2013, 13:12

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

Сообщение getAlex 05 сен 2018, 13:13

Это просто квадратная панелька с текстурой кольца, либо белый квадрат с маской инвертированного кольца, кнопки размещены математически по формуле точки на окружности, вместе с заранее нарисованными сегментами для подсветки при наведении, которые правильно смотрят в центр панели(точнее он там только один. Просто меняет своё положение и ротацию). А наведение через обычный ивент триггер интерфейса.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

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

Сообщение waruiyume 05 сен 2018, 13:29

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

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

Сообщение getAlex 05 сен 2018, 13:44

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


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

Изображение

Картинка немного ущербная: секторы должны стоять так, чтоб красные точки на окружности были в их центре, а не по краям.
Последний раз редактировалось getAlex 05 сен 2018, 14:12, всего редактировалось 3 раз(а).
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

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

Сообщение waruiyume 05 сен 2018, 13:49

Вы то радели за оптимизацию в крайне кхм... экстремальной форме, а теперь предлагаете массив перебирать, когда этого можно не делать, и банально букафф больше получится (popcorn1)
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

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

Сообщение getAlex 05 сен 2018, 14:04

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

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

А вот из явных плюсов - абсолютная очевидность и простота кода даже для человека, который вообще не знает что такое углы и как они работают в юнити и за его пределами. А значит и вероятность ошибки и продолжительности написания кода сведётся к минимуму.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

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

Сообщение Raspad 05 сен 2018, 15:48

Вроде получилось.. Хотя реализовал как то иначе видать.
На "элементы" был помешен скрипт с довольно простым кодом:
Синтаксис:
Используется 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.. и следовательно размер "сегмента выделения" уже другой.
Аватара пользователя
Raspad
UNITрон
 
Сообщения: 221
Зарегистрирован: 28 мар 2013, 13:12

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

Сообщение getAlex 06 сен 2018, 02:52

Raspad писал(а): и следовательно размер "сегмента выделения" уже другой.

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

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

Сообщение Raspad 06 сен 2018, 11:02

getAlex писал(а):
Raspad писал(а): и следовательно размер "сегмента выделения" уже другой.

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

Также подумал, тока там надо вычитать из угла поворота половину "размера" сегмента(в теории, мне так кажется ибо не проверял на практике еще).
Хотя в последней версии игры у них сегмент выделения немного смещен и вылазит за кольцо, но думаю решается все тем же методом.
Аватара пользователя
Raspad
UNITрон
 
Сообщения: 221
Зарегистрирован: 28 мар 2013, 13:12


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 24


cron