unity onmousedown правая кнопка мыши

Mouse events

Mouse events occur when you interact with the UI (User Interface) Allows a user to interact with your application. Unity currently supports three UI systems. More info
See in Glossary using a mouse. Touch, pens, or other pointing devices generate other events, not mouse events. In the Mouse event APIs and in this documentation, the term “mouse” refers only to a physical mouse or a virtual mouse that emulates a physical mouse.

The base class for all mouse events is MouseEventBase.

Event Description Trickles down Bubbles up Cancellable
MouseDownEvent Sent when the user presses a mouse button.
MouseUpEvent Sent when the user releases a mouse button.
MouseMoveEvent Sent when the user moves the mouse.
WheelEvent Sent when the user activates the mouse wheel.
MouseEnterWindowEvent Sent when the mouse enters a window.
MouseLeaveWindowEvent Sent when the mouse leaves a window.
MouseEnterEvent Sent when the mouse enters an element or one of its descendants.
MouseLeaveEvent Sent when the mouse leaves an element or one of its descendants.
MouseOverEvent Sent when the mouse enters an element.
MouseOutEvent Sent when the mouse leaves an element.
ContextClickEvent (obsolete) Sent when the user presses and releases the third mouse button. Exists for backwards compatibility with IMGUI.

Unique Properties

button : The button property returns an integer that identifies the mouse button pressed to trigger an event. The following table lists the integer and associated mouse button:

Integer Button
0 Left button
1 Right button
2 Middle button

pressedButtons : The pressedButton property returns an integer that identifies which combination of mouse buttons are currently pressed.

The number is the sum of the individual buttons’ integer value (see table below). For example, holding the right mouse button and the middle mouse button pressed at the same time will result in pressedButton having a value of 6.

Integer Button
1 Left button
2 Right button
4 Middle button

For more information, see the Modifier keys section of the MDN documentation.

mousePosition : The mousePosition property returns the mouse position within the panel, also known as the screen coordinate system. For more information on panel coordinates, see the Visual Tree page.

localMousePosition : The localMousePosition property returns the coordinates relative to the target visual element.

mouseDelta : The difference between the pointer’s position during the previous mouse event and its position during the current mouse event.

Event list

The following list provides the name, description, and target of each event in the event family. For more information on the event, see the UI Toolkit API.

MouseDownEvent

A MouseDownEvent is sent when the mouse button is pressed while the cursor is inside a visual element.

target : The visual element that receives the mouse capture. Otherwise, it’s the topmost selectable element under the cursor.

MouseUpEvent

target : The visual element that receives the mouse capture. Otherwise, it’s the topmost selectable element under the cursor.

MouseMoveEvent

The MouseMoveEvent is sent when the cursor hotspot is moved within a visual element.

target : The visual element that receives the mouse capture. Otherwise, it’s the topmost selectable element under the cursor.

WheelEvent

The WheelEvent is sent when the mouse wheel is pressed.

target : The visual element that receives the mouse capture. Otherwise, it’s the topmost selectable element under the cursor.

MouseEnterWindowEvent

A MouseEnterWindowEvent triggers when the cursor is moved into an Editor window. Runtime panels don’t receive this event when you enter the Game view window.

target : The visual element that receives the mouse capture. Otherwise, it’s the topmost selectable element under the cursor.

MouseLeaveWindowEvent

target : The visual element that receives the mouse capture. Otherwise it returns null, as the cursor isn’t over an element.

MouseEnterEvent

The MouseEnterEvent is sent when the cursor is moved into a visual element, or one of its descendants.

target : The visual element under the mouse cursor, or one of its descendants.

MouseLeaveEvent

MouseLeaveEvent triggers when the cursor moves outside of a visual element. This event differs from MouseOutEvent as this event is sent to each element the mouse exits. This event doesn’t propagate.

target : The visual element (or one of its descendants) that the mouse cursor exits.

MouseOverEvent

target : The visual element that’s under the mouse cursor.

MouseOutEvent

The MouseOutEvent triggers when a pointing device moves the cursor outside the boundary of a visual element.

MouseOutEvent is different from MouseLeaveEvent in that MouseOutEvent is sent when leaving the visual element to any other element, while MouseLeaveEvent isn’t sent when transitioning from a visual element to descendant elements.

target : The visual element that the mouse cursor exited.

ContextualMenuPopulateEvent

Event sent by the ContextualMenuManager when the contextual menu needs to be populated with menu items.

target : The visual element for which the contextual menu is being built.

ContextClickEvent (obsolete)

Event sent when the user presses and releases the third mouse button. This event only exists for backward compatibility with IMGUI.

Examples

Editor window example

The following code sample creates an Editor window with three buttons that prints messages to the console when the mouse moves over an element, or buttons are pressed on the mouse.

To see the example in action, do the following:

Runtime example

The following code sample prints messages to the console when any mouse buttons are pressed, showing which button triggered the event, and which buttons are currently pressed.

This code sample highlights registering a callback to the MouseDownEvent and how to use the event parameters. To see the example in action, do the following:

Источник

Отлавливание левой и правой кнопки мыши в Unity при нажатии на Button. C#

2 ответа 2

Вообще реакция на правую кнопку мыши отключается в Edit > Project Settings > Input

(найдено по запросу в гугле «unity button ignore right click» по первой ссылке)

Но можно и просто написать свою реализацию кнопки которая это будет делать. Это так же просто в реализации.

dRPDg

Далее, в методе OnPointerClick ты сможешь перехватить нажатие. Не важно, как именно добавлено событие к твоей Button, через скрипт или через inspector. Теперь ты можешь отследить, какая именно кнопка мыши была нажата и если это не левая кнопка мыши-тогда ты просто сбрасываешь вызов через eventData.Reset();

Привожу небольшой пример кода ниже.

mpaEJ

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# unity3d или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.11.12.40736

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Как я делал CandyCrash на Unity3D( Часть 2)

04) Группировка блоков

Использование группировки объектов игры очень помогает при создании логики. Поэтому данный раздел очень важен для дальнейшего описания всего алгоритма игры. Хотя можно было его и включить в предыдущий раздел. Итак но что сделано то сделано.

У большинства объектов Unity3D есть такой параметр как tag именно он позволит нам понимать на какой именно тип кубика пользователь нажал мышкой. Итак для того чтобы присвоить теги каждому элементу нужно сначала создать их. Их будет 8 штук и они будут называться точно так же как номера элементов массива. В дальнейшем Вы поймете зачем так упрощать.

1) создаем теги. Для этого выбираем наш prefab в списке ресурсов и смотрим на окно его свойств.

Видим в окне свойств небольшое выпадающее меню именно в него мы и добавим список наших тегов. К сожалению как это сделать из кода я не знаю. Поэтому щелкаем по данному списку и нажимаем на пункт Add tag (добавить тэг).

В Unity3d параметр в tag есть встроенный набор а так же можно добавлять свои уникальные значения для этого в открывшемся редакторе жмем на клавишу + и добавляем в поля цифры от 0 до 8

Если ничего нет то возвращаемся обратно и повторяем попытку с кнопкой плюс. Если все хорошо то продолжаем. Теперь когда теги существуют мы можем их присваивать нашим игровым объектам. Для этого снова заходим в наш скрипт Change созданный в предыдущем примере. И дополняем функцию Update присвоением значения tag.

Дополняем функцию Update

/*при обновлении экрана задаем картинку по номеру из списка*/

Sprite.sprite = ImgList [IndexImg];

/*задаем уникальный tag для данного типа картинки*/

Теперь при запуске нашего уровня разные цвета будут иметь разные уникальные значения параметра tag. И нам не нужно будет выбирать все элементы из сцены и проверять. Мы будем просто выбирать элементы той группы на которую кликнул игрок и в них смотреть нашу логику. Но об этом чуть позже.

Запускаем и смотрим.

Для всех белых будет tag 1 Для всех синих будет tag 6

Таким образом мы будем знать какой цвет выбрал игрок а дальше дело техники посчитать и убрать все ненужное.

05) Создание карты

Вот и настала пора создать сложнейшую функцию которая будет генерировать наше замечательное поле с кубиками в которые игрок будет играть. Для этого в окошке Hierarchy удаляем все элементы списка кроме Main Camera

Выделяем и удаляем

Итак нужно знать, что при старте нашего уровня будет создаваться камера. Именно при ее создании будем генерировать поле из наших игровых блоков. Для этого создаем новый скрипт на C# я назову его CreateMap

Создаем и называем CreateMap

Далее двойным щелчком откроем код CreateMap. Он откроется в том редакторе который настроен в Unity3D. У меня MonoDevelop не работают горячие клавиши поэтому я перенастроил Unity на Visual Studio в параметрах.

Объявим 2 переменные которые будут обозначать ширину и высоту поля в квадратах.

Переменные определяющие размеры карт

public class CreateMap : MonoBehaviour <

public float StartX, StartY;

// Use this for initialization

// Update is called once per frame

Чтобы создать объект нужно передать в функцию оригинал объекта и задать его координаты и скорость движения. Итак решаем задачи по порядку.

1) создаем переменную типа GameObject для ссылки на оригинал нашего Prefab который мы создавали все это время. У нашей камеры после сохранения проекта появиться ряд параметров.

2) Свяжем переменную Box с нашем Prefab перетащив из Assert Store объект с названием Box.

3) Зададим размеры поля пусть это будет 2х2 для пробы а далее может вынесем их в отдельные настройки но пока так.

Теперь у нас есть все элементы. Для задания логики работы создания карты. Итак как будем создавать.

1) В центре экрана у нас точка 0 0 как в OpenGL а квадратики у нас размером 1 х 1 поэтому будем от точки 0 х 0 зеркально двигаться в обе стороны таким образом вместо 2 блоков будут создаваться 4 по диагонали и 4 по вертикали. С помощью двух циклов.

Но сначала попробуем программно добавить 1 блок чтобы был понятен принцип. Для этого используется команда Instantiate(Box, new Vector3(0, 0, 0), Quaternion.identity); Ее мы и запишем в функцию Start нашего скрипта CreateMap

Модифицируем Start функцию

Instantiate(Box, new Vector3(0, 0, 0), Quaternion.identity);

Запускаем игру и видим что Unity3d самостоятельно добавим на нашу сцену блок в точку 0 0 0.

Теперь достаточно написать цикл который будет создавать блоки по оси X. Для этого добавим следующую строку к вызову функции.

Добавляем цикл к функции Start ()

Unity3D скрываем блок

/*задаем прозрачный цвет для данного объекта*/

В итоге весь код будет выглядеть следующим образом.

Unity3D код скрипта Chage

public class Change : MonoBehaviour <

//Объявим список картинок

public Sprite[] ImgList;

//Объявляем переменную для доступа к картинке

//номер выбранного элемента массива

public int IndexImg=0;

// Функция срабатывает 1 раз при создании объекта

/*получаем случайное число от 0 до 8*/

IndexImg = Random.Range (1, 8);

//получаем доступ к компоненту

// Функция срабатывает каждый раз при обновлении экрана

/*при обновлении экрана задаем картинку по номеру из списка*/

Sprite.sprite = ImgList [IndexImg];

/*задаем уникальный tag для данного типа картинки*/

/*добавляем обработчик нажатия мышкой*/

/*задаем прозрачный цвет для данного объекта*/

и начинаем нажимать на блоки. После чего их параметр изображения меняется на прозрачный создавая эффект исчезновения с поля.

Ура мы создали игру если вам этого хватит то можно закончить. Но мы продолжаем. Задачка в том что нам необходимо нажав на один кубик посмотреть что вокруг и если он стоит один то не уничтожать его а если вокруг есть кубики того же цвета то уничтожить их все.

Для того чтобы выбрать все кубики такого же типа что и наш мы задали им свойство tag в статье 4) Группировка блоков и теперь воспользуемся этой замечательной штукой.

Итак Unity3D умеет искать на сцене объекты по одному из типов либо о имени но все кубики у нас называются box либо по типу элемента но все элементы у нас одного типа prefab либо по параметру tag вот то что нужно нам. Так же поиск может возвращать первый найденный элемент а может все в виде массива. Мы будем получать весь массив элементов.

Добавляем в нашу функцию OnMouseDown поиск элементов по значению tag который совпадает со значением выбранного кубика.

Unity3D поиск объектов по tag

//Объявляем динамический список игровых объектов

//Для сохранения результатов поиска

GameObject[] O = GameObject.FindGameObjectsWithTag (tag);

/*задаем прозрачный цвет для данного объекта*/

А далее чтобы проверить что функция нашла элементы. Мы возьмем найденные объекты по очереди и зададим для каждого параметр IndexImg = 0; Таким образом спрятав все квадратики одного цвета целиком. Итак после щелчка мышкой по компоненту в функцию поиска FindGameObjectsWithTag мы передаем значение параметра tag текущего кубика на сцене, как мы помним для разных цветов данное значение отлично. Далее мы получаем динамический список элементов в котором лежат все объекты с таким же параметром tag что и наш. С помощью цикла foreach очень просто перебирать значения из массива. Выбрав из массива игровой объект GameObject мы понимаем что параметр IndexImg лежит в нестандартных компонентах объекта в опубликован нами в скрипте Chage.

По этому мы воспользуемся знакомой командой GetComponent ( ); для получения доступа к компоненту change. А далее просто зададим параметр IndexImg=0 в компоненте change для найденного квадратика. И последнее если мы нашли все объекты с нужным нам tag то перебрав массив мы зададим значение для всей группы элементов. Поэтому строку IndexImg=0 для этого элемента можно закомментировать либо просто удалить. Я не удалил вдруг пригодиться.

Unity3D поиск объектов по tag и изменение значения поля

//Объявляем динамический список игровых объектов

//Для сохранения результатов поиска

GameObject[] O = GameObject.FindGameObjectsWithTag (tag);

/*Перебираем полученный результат поиска в цикле*/

foreach (GameObject M in O) <

//компонент в котором расположен параметр IndexImg называется Change

Change Flag =M.GetComponent ();

//получаем доступ к параметру IndexImg через переменную Flag

/*задаем прозрачный цвет для данного объекта*/

Теперь запустим проект и выберем один из кубиков.

Как видим цепная реакция уничтожила все зеленные клетки. Таким образом мы можем либо удалять по одному либо все сразу элементы одного цвета. Но вот незадача а как нам удалять только рядом стоящие одноцветные значения. Вот тут нужно продумать алгоритм (шаги) которые будет выполнять программа при принятии решения нужно ли удалять объект или нет.

07) Алгоритм проверки объектов

Теперь мы знаем как получить отдельно информацию о выделенном кубике на сцене и как получить значения всех кубиков с тем же цветом на этом уровне.

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

Итак решим задачу поиска кубиков стоящих рядом с выделенным нами мышкой. Для этого нужно вспомнить как мы в статье 5) Создание карты рас читывали координаты элементов сцены. Таким образом зная координаты куба на который нажал пользователь мы можем рассчитать допустимые координаты точек в которых должны находиться подходящие нам кубы.

Unity3d OnMouseDown() получение координат объекта при нажатии по нему мыкой

/*обьявим переменную для хранения координат*/

Vector3 Pozition = transform.position;

/*выведем данную позицию в консоль*/

Запускаем проект и нажимаем на любой кубик и видим как в окне Console отображается текущая позиция элемента.

Ура теперь когда мы знаем позицию элемента мы можем рассчитать значения для соседних координат где нужно искать подходящих соседей. Так как мы будем пользоваться этим расчетом много раз в дальнейшем то опишем ее как отдельную функцию в нашем коде. Она будет принимать на входе координаты которые нужно рассчитать и в результате возвращать нам массив значений типа Vector3 с координатами место которые нам нужно будет проверить.

Текстовое поле

/*Объявим массив из 4 точек*/

Vector3[] S = new Vector3[4];

/*задаем координаты для точек*/

S [0] = T; S [0].x++; //правая точка

S [1] = T; S [1].x—; //левая точка

S [2] = T; S [2].y++; //верхняя точка

S [3] = T; S [3].y—; //нижняя точка

/*возвращаем позиции для проверки*/

Данную функция вставим перед вызовом процедуры OnMouseDown() теперь в нее передадим координаты нашего кубика и получим список точек которые нужно будет проверить. И выведем их в окно Console для проверки. Таким образом весь код нашего скрипта стал выглядеть следующим образом.

Unity3D текст скрипта Chage

public class Change : MonoBehaviour <

//Объявим список картинок

public Sprite[] ImgList;

//Объявляем переменную для доступа к картинке

//номер выбранного элемента массива

public int IndexImg=0;

// Функция срабатывает 1 раз при создании объекта

/*получаем случайное число от 0 до 8*/

IndexImg = Random.Range (1, 8);

//получаем доступ к компоненту

// Функция срабатывает каждый раз при обновлении экрана

/*при обновлении экрана задаем картинку по номеру из списка*/

Sprite.sprite = ImgList [IndexImg];

/*задаем уникальный tag для данного типа картинки*/

/*функция создания массива координат*/

Vector3[] GenCoordTest(Vector3 T)

/*Объявим массив из 4 точек*/

Vector3[] S = new Vector3[4];

/*задаем координаты для точек*/

S [0] = T; S [0].x++; //правая точка

S [1] = T; S [1].x—; //левая точка

S [2] = T; S [2].y++; //верхняя точка

S [3] = T; S [3].y—; //нижняя точка

/*возвращаем позиции для проверки*/

/*добавляем обработчик нажатия мышкой*/

/*объявим переменную для хранения координат*/

Vector3 Pozition = transform.position;

/*выведем данную позицию в консоль*/

Debug.Log («выбранная точка » + Pozition);

//получаем список координат для проверки

Vector3[] TestCoord = GenCoordTest (Pozition);

Debug.Log («координаты точек для проверки «);

/*выводим данный список на консоль*/

foreach(Vector3 T in TestCoord)Debug.Log (T);

При запуске нажав на любой из блоков мы увидим его позицию и список предполагаемых позиций соседей которых нужно будет проверить.

Теперь можно получить массив объектов в которых будем искать подходящих соседей как в статье 6) Обработка нажатия на кубик для этого вызовем команду GameObject.FindGameObjectsWithTag (tag); которая вернет только необходимые для проверки объекты сцены. Добавим данный код в функцию OnMouseDown().

Unity3D OnMouseDown() поиск объектов по параметру tag

/*обьявим переменную для хранения координат*/

Vector3 Pozition = transform.position;

/*выведем данную позицию в консоль*/

Debug.Log («выбранная точка » + Pozition);

//получаем список координат для проверки

Vector3[] TestCoord = GenCoordTest (Pozition);

Debug.Log («координаты точек для проверки «);

/*выводим данный список на консоль*/

foreach(Vector3 T in TestCoord)Debug.Log (T);

/*получаем список кубиков с одним цветом*/

GameObject[] O = GameObject.FindGameObjectsWithTag (tag);

Далее выбираем каждый объект из найденных и сверяем с координатами, если координаты совпадут то выведем сообщение в console. Добавим данный код в функцию OnMouseDown().

Unity3D OnMouseDown() поиск соседних объектов на основе координат

/*объявим переменную для хранения координат*/

Vector3 Pozition = transform.position;

/*выведем данную позицию в консоль*/

Debug.Log («выбранная точка » + Pozition);

//получаем список координат для проверки

Vector3[] TestCoord = GenCoordTest (Pozition);

Debug.Log («координаты точек для проверки «);

/*выводим данный список на консоль*/

foreach(Vector3 T in TestCoord)Debug.Log (T);

/*получаем список кубиков с одним цветом*/

GameObject[] O = GameObject.FindGameObjectsWithTag (tag);

/*перебираем объекты из массива найденных*/

foreach (GameObject S in O) <

//получаем и выбранного объекта координаты

Vector3 Coord_S = S.transform.position;

/*Перебираем наш список координат*/

foreach(Vector3 T in TestCoord)

/*сравниваем с нашим списком координат*/

/*значит сосед найден выводим данные в console*/

Debug.Log(» Нашли соседа в координатах » + T);

/*прекращаем проверку для объекта*/

После запуска программы можно наблюдать что при нажатии на Объект с соседями система находит их.

Если же выбрать одиноко стоящий объект у которого визуально нет соседей то наша функция не найдет их что логично.

Теперь когда мы будем находить соседей мы будем их прятать изменяя в них параметр Indeximg на 0. Чтобы проверить как правильно ли наша функция ищет их. Итак для того чтобы понять есть ли у нас соседи мы введем переменную она будет увеличиваться каждый раз на 1 при нахождении соседа. Далее в функции где мы выводили на console (консоль лога) что сосед найден мы получим его свойство Indeximg и изменим его на 0 тем самым стерев его с экрана. В конце работы функции мы проверим нашла ли функция соседей если да то изменим и в выделенном объекте значение IndexImg на 0 если же нет то все оставим как есть.

/*количество найденных соседей*/

/*объявим переменную для хранения координат*/

Vector3 Pozition = transform.position;

/*выведем данную позицию в консоль*/

Debug.Log («выбранная точка » + Pozition);

//получаем список координат для проверки

Vector3[] TestCoord = GenCoordTest (Pozition);

Debug.Log («координаты точек для проверки «);

/*выводим данный список на консоль*/

foreach(Vector3 T in TestCoord)Debug.Log (T);

/*получаем список кубиков с одним цветом*/

GameObject[] O = GameObject.FindGameObjectsWithTag (tag);

/*перебираем объекты из массива найденных*/

foreach (GameObject S in O) <

//получаем и выбранного объекта координаты

Vector3 Coord_S = S.transform.position;

/*Перебираем наш список координат*/

foreach(Vector3 T in TestCoord)

/*сравниваем с нашим списком координат*/

/*значит сосед найден выводим данные в console*/

Debug.Log(» Нашли соседа в координатах » + T);

//компонент в котором расположен параметр IndexImg называется Change

Change Flag = S.GetComponent ();

//получаем доступ к параметру IndexImg через переменную Flag

/*прекращаем проверку для объекта*/

/*если выбранный блок имеет соседей то и его уничтожаем*/

if (CountFindBox > 0) <

Первый делом щелкаем по одиноко стоящему вверху зеленному квадратику и видим лог что у него нет соседей а значит он ничего делать не будет.

Далее щелкаем по белой полоске из 3 квадратиков и видим что алгоритм нашел 2 соседей и их удалил из поля видимости.

Отлично теперь жмем на желтую изогнутою линию внизу и тут становиться что то интересное. Желтая загогулина не удалилась до конца оставив нам маленький подарок из одной точки.

В общем все работает мы находим соседей выделенной точки и удаляем их. Дальше я расскажу как искать соседей наших соседей чтобы проверять их.

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • unity business solutions инн
  • unity android приложение не установлено