Как сделать курсор невидимым unity

Добавил пользователь Владимир З.
Обновлено: 10.09.2024

Я создаю 2D-проект, который не имеет символа. Поэтому я создал пустой игровой объект и привязал к нему сценарий. В сценарии я объявил другие объекты, которые находятся в сцене следующим образом:

Как узнать, были ли нажаты obj1 или obj2 или obj3? Является ли raycasting единственным решением?

3 ответа

Да, вы можете использовать raycasting для обнаружения объектов в вашей сцене. Вам не нужно прикреплять пользовательский скрипт к игровым объектам, которые вы хотите обнаружить, но вам нужно прикрепить к ним коллайдеры.

В методе обновления вашего скрипта, прикрепленного к пустующему объекту, вы можете проверить, когда нажата кнопка мыши. Затем, бросьте луч в кадр из камеры, через мышь. Что-то вроде следующего:

Я изменил скрипт, и теперь он работает. Во-первых, я удаляю:

Обновленный сценарий выглядит следующим образом:

Я все еще верю, что на часть этого вопроса не ответил. Часть

Является ли raycasting единственным решением?

Ну, это не единственное решение, которое есть:

Прикрепите этот скрипт к целевому объекту, то есть к тому, который хочет зарегистрировать щелчки мыши.

Похожие вопросы

Популярные теги

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

Моя цель это чтобы при нажатии мыши объект следовал за курсором, при отпускании, чтобы он уничтожался. Вот код к которому я пришел (все происходит в Unity).

Я навесил на объект колайдер, поставил галочку isTrigger, даже закинул на него RigidBody, выбрал что rb Kinematic. К сожалению объект не движется при нажатии, но при отпускании уничтожается, это да. Помогите собственно сделать так чтобы объект двигался.

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

Шаг 1. Обработка клика мышкой по объекту сцены. Для данной ситуации в Unity3D существует специальная функция которую нужно дописать в скрипт Change созданный в статье 3) Смена цвета блока . выглядит она следующим образом.

Unity3d Обработка нажатий мышкой

Шаг 2. При нажатии мышкой на данный объект попробуем спрятать его изменив параметр IndexImg на 0; Для этого открываем наш скрипт Change и добавляем в него следующий код.

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

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


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


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

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

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

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

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

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


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

Данная статья рассказывает о новой системе пользовательского интерфейса, которая появилась в новых версиях Unity, начиная с Unity 4.6.

Вступление

Раньше весь интерфейс строился на основе кода. В нужных скриптах было необходимо обрабатывать событие OnGUI, отображать и обрабатывать события всех элементов которые нам необходимы. В результате код получался громоздким. Конечно существовали и альтернативы, например nGUI, однако данный компонент предоставляется на платной основе. С выходом Unity 4.6 все изменилось. В Unity теперь добавилась отличная система пользовательского интерфейса, с нужными для этого инструментами. Конечно старая система осталась полностью работоспособной, но не переходить на новую систему я считаю не правильно. Лично меня очень сильно поразили возможности для создания интерфейса. Новая UI System получилась одновременно и гибкой, и простой, и при этом весьма функциональной.

Начало. Canvas.

Создание полотна для интерфейса

Я думаю объяснять как создавать сцену нет смысла, поэтому пропустим все лишние действия и перейдем непосредственно к самому интерфейсу. Новая система построена на модулях ввода (Input Module), полотне (Canvas) и самих объектах интерфейса. Для создания интерфейса нам надо знать только про полотно и сами элементы.
Как вы уже догадались нам потребуется полотно, на котором мы будем размещать наши элементы. Для этого идем в меню "GameObject -> UI -> Canvas"
После того, как оно появилось на сцене, выберите его и нажмите F для того, чтобы отобразить его перед камерой, так же удобство можно переключиться в 2D режим Unity. В инспекторе для редактирования доступны следующие очень важные свойства, которые определяют поведение нашего полотна:

Render Mode

В зависимости от этого параметра становятся доступны другие остальные поля. Поэтому сперва рассмотрим значения данного поля.

Screen Space - Overlay

В данном режиме полотно растягивается по размерам экрана и отображается без связи со сценой или камерой (UI будет показан даже в том случае, когда на сцене нету камеры). В случае изменения размера окна, полотно будет растянуто под размеры экрана и размещенные элементы будут перегруппированы. Полотно будет рисоваться поверх всех остальных графических элементов.
Pixel perfect - использовать ли antialiasing

Screen Space - Camera

В данном режиме полотно рисуется на плоскости перпендикулярной взгляду камеры, на некотором расстоянии от точки взгляда. Размер полотна не меняется с изменением расстояния, оно всегда растягивается, чтобы заполнять разрез пирамиды видимости у камеры (camera frustrum view). Интерфейс будет заслоняться любыми 3D элементами, которые находятся перед плоскостью интерфейса.
Pixel perfect - использовать ли antialiasing.
Render camera - камера с помощью которой будет отображен интерфейс.
Plane distance - дистанция плоскости нашего интерфейса от камеры.

World Space

В данном режиме полотно располагается в мировых координатах и является плоским 3D объектом на который действую законы обычного процесса визуализации.
Event camera - камера с помощью которой будут происходить обработки событий ввода пользователя.

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

Screen Space - Overlay Screen Space - Camera World Space

С полотном мы разобрались, можно приступать к созданию простого интерфейса.

Начало. Элементы.

Для начало нам надо принять удобную позу. Поэтому заварите себе кружечку горячего чая, откиньтесь на спинку вашего мягкого кресла (или не менее мягкую деревянную спинку стула :) ) и расслабьтесь. Расслабились? Отлично, теперь возвращаемся к Unity. Если у вас полотно используется в режиме мировых координат (World Space), то выберите его и нажмите F и дальше просто подгоните камеру как вам удобно. В другом случае лучше сделать так. Установить режим использования камеры, указать любую камеру, и поставить дистанцию равную 1.0 и нажимаем F, так же не забываем переключиться в 2D режим для удобства работы с интерфейсом. Подгоняем вид как нам удобно, желательно чтобы было видно всю область полотна, и переходим к созданию элементов.

В нашем распоряжении есть классический набор элементов, без которых не возможно существование ни одного нормального интерфейса:

Все эти элементы можно создать из меню "GameObject -> UI -> . ".
После того как вы создадите элемент, надо будет переключиться на новый инструмент Rect tool

Пользовательский интерфейс — Unity — DevTribe: инди-игры, разработка, сообщество

С помощью него можно легко настраивать расположение и размеры элементов. Давайте посмотрим на возможности данного инструмента

  • Вы можете менять положение элементов, перетаскивая сами элементы (Pos X, Pos Y, Pos Z).
  • Вы можете менять размер элементов, перетаскивая их границы или угловые точки (Width, Height).
  • Вы можете вращать элемент, перетаскивая область вне элемента рядом с угловой точкой (Rotation).
  • Вы можете менять центр вращения, чтобы правильно настроить вращение элемента (Pivot).
  • Вы можете настроить точки крепления к родительскому объекту (Anchors).

В принципе если с первыми 3-мя все понятно, то про остальные я думаю стоит рассказать подробнее.
Начнем с точки вращения. Чтобы его изменить нужно перетаскивать синий кружочек (изначально он находится в центре). Сейчас покажу на скриншотах как это работает. Во всех случаях позиция самого элемента не менялась, лишь якорь и угол вращения.

якорь находится в центре якорь находится слева

окно пресетов

Теперь давайте ка разберемся с точками крепления. Для их изменения придумали такой вот крестик (скриншот справа). Его можно перемещать либо весь, либо только один из его углов. Так же присутствуют так называемые пресеты для данного параметра. При выборе одного из них, позиция якоря будет меняться. Так же можно зажать клавишу Alt во время выбора пресета и тогда будет меняться положение самого элемента. А если еще и зажать Shift - то так же будет изменена позиция точки вращения.

А теперь давайте поговорим о смысле якоря. В принципе если вам абсолютно не важно как ваш интерфейс выглядит, то (стоп, что за бред?) . К сути: настройки якоря помогают сделать ваш интерфейс адаптивным, чтобы он мог подстраиваться и растягиваться под разные размеры экрана. Вот например если вы оставите у всех элементов точку крепления в центре, то при изменении размеров родительского элемента (будь то панель, или полотно) элементы так и останутся в центре. Если поставить якорь в левом верхнем углу, то и элементы всегда будут там. Но если правильно настроить якорь, то можно добиться классных эффектов. В общем это трудно описать на словах и показать на скриншотах, поэтому советую вам самим поэкспериментировать с данным свойством. Но все же я хочу рассмотреть один не больший пример. Запомните, если вы сможете понять, что к чему, то вам будет не сложно построить интерфейс любой сложности. Давайте рассмотрим такой вот пример:

состояние 1 состояние 2 иерархия

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

панель кнопка

  • Красная - обозначает итоговое расстояние от границы родителя до границы элемента.
  • Синяя - обозначает расстояние от границы родителя до границы якоря.
  • Зеленая - обозначает расстояние от границы якоря до границы элемента.

Принцип их работы прост. Красная высчитывается UI системой. А вот остальные мы задаем сами. Запоминайте:

  • расстояние от границы родителя до границы якоря - всегда в процентном соотношение с размерами родителя.
  • расстояние от границы якоря до границы элемента - всегда фиксировано.

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

После того как вы научились размещать элементы на полотне, я думаю можно поближе познакомится с особенностью элементов. Начнем с самого простого - картинки!

Image

  • Source Image - спрайт, который будет использовать для картинки.
  • Color - окрас спрайта, например можно добавить красных тонов картинке, указав здесь красный цвет.
  • Material - можно задать материал для картинки.
  • Image Type - способ отображения изображения
  • Simple - отображение изображения как есть
  • Sliced - спрайт имеющий 9 частей будет отображен в виде повторяющихся частей, что позволяет картинке выглядеть качество при разных размерах элемента
  • Tiled - картинка будет повторяться, чтобы заполнить всю область
  • Filled - один из самых интересных режимов. Как он работает, смотрим на скриншотах

оригинал Horizotal + Left Vertical + Bottom Radial90 + Bottom Left Radial180 + Bottom Radial360 + Bottom

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

Button

Кнопка состоит из картинки и текста, а так же специального скрипта кнопки (о нем ниже). Текст расположен как отдельный элемент внутри кнопки.

Всего есть 4 состояния:

  • Normal - обычное состояние.
  • Highlighted - на кнопку наведена мышка или кнопка была выбрана.
  • Pressed - кнопка была нажата.
  • Disabled - кнопка заблокирована и на нее нельзя нажать и выбрать.

Пользовательский интерфейс — Unity — DevTribe: инди-игры, разработка, сообщество

Добавлять события очень легко. Сперва надо нажать "+" в правом нижнем углу. В списке появится новый пункт, первым делом надо перетащить туда объект, а затем выбрать нужный метод, который будет вызван при клике на кнопку.

Slider

Часть параметров такие же как и кнопки, поэтому я думаю их можно больше не описывать.

  • Direction - направление слайдера.
  • Min Value - минимальное значение, которое будет принимать слайдер.
  • Max Value - максимальное значение, которое будет принимать слайдер.
  • Whole Numbers - если установлено, то слайдер будет принимать только целые значения.
  • OnValueChanged() - какие события будут вызываться при нажатии на эту кнопку. В качестве события должен быть метод, который принимает один параметр типа float**

Input Field

Данный элемент служит для ввода текста.

  • Starting Value - начальное значение поля.
  • InputType
  • Standart - просто текст
  • Password - текст заменяется звездочками
  • Character limit - максимальная длина текста (0 - без ограничения)
  • Multi Line - разрешить использование много-строчного текста

Scrollbar

Так же имеет событие OnValueChanged, как и у Slider'а.

Пример работы из кода

Тут я хочу вам показать, как можно реализовать кнопку способности, как в Warcraft 3. Для этого нам понадобятся знания полученные выше, немного кривых рук ну и конечно же много экспериментов (вы же хотите научиться делать игры, не так ли? Так что больше экспериментируйте и не бойтесь что-нибудь сломать тут вам всегда смогут помочь).

Сперва надо набросать примерный дизайн:

вид из редактора иерархия объектов вид в инспекторе вид из игры, активно вид из игры, перезаряжается

Затем надо написать скрипт:

В заключении

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


Одна из первых проблем, вставших передо мной — показать игроку мир вокруг него.

Но мы не ищем лёгких путей

Подготовка объектов.

Итак, начнём с того, что создадим какой-нибудь объект (например куб) и привяжем на него камеру (она у нас сейчас только одна — главная камера).

Написание скрипта.

Изначально нужно было определить позицию мышки.

Это оказалось довольно просто — через класс Input и его параметр mousePosition, который содержит три координаты для каждой из осей — x, y и z.

Итак, заведём внутреннюю переменную MousePos, и будем сохранять в неё координаты текущей позиции мышки. Делать это лучше всего перед отрисовкой экрана в событии Update().

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

Незачем это делать каждый раз, а достаточно будет сделать при создании самой камеры на сцене:

Итак, у нас уже есть ссылка на камеру, которую будем крутить, ссылка на объект, вокруг которого будем крутить, и координаты мышки.

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

Узнать состояние клавиш мышки можно через всё тот-же класс Input. Специально для этого у него есть метод GetMouseButton.

Само перемещение камеры будем располагать в событии FixedUpdate():

И наконец, мы подошли к самому интересному — определить угол поворота в зависимости от позиции мышки и повернуть камеру.

Коэффициент поворота определить довольно просто: определяем позицию мышки, отнимаем от неё координату середины экрана, и делим получившееся число на размер экрана (отдельно для оси Х и отдельно для Y).

К примеру, мышка находится на координате 852 по оси Х, а размер экрана по ширине равен 1024. Тогда, согласно формуле:

Коэффициент -0,16796875 как раз и будет отвечать за угол поворота по оси Х.

Угол мы рассчитали, теперь осталось только повернуть камеру.

Сделать это можно, используя метод RotateAround класса transform.

Примечание.

И теперь то-же самое для поворота по вертикали:

Вроде-бы можно и закругляться, но есть ещё один момент, который нужно учесть.

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

Скрипт целиком.

Вот теперь точно всё, и осталось только показать весь скрипт целиком, с моими комментариями =)

Читайте также: