Input.mousePosition
Благодарим вас за то, что вы помогаете нам улучшить качество документации по Unity. Однако, мы не можем принять любой перевод. Мы проверяем каждый предложенный вами вариант перевода и принимаем его только если он соответствует оригиналу.
Ошибка внесения изменений
По определённым причинам предложенный вами перевод не может быть принят. Пожалуйста попробуйте снова через пару минут. И выражаем вам свою благодарность за то, что вы уделяете время, чтобы улучшить документацию по Unity.
Ваше имя Адрес вашей электронной почты Предложение * Разместить предложенное
public static var mousePosition : Vector3;
public static Vector3 mousePosition ;
Описание
Текущее положение мыши в пиксельных координатах. (Read Only)
The bottom-left of the screen or window is at (0, 0). The top-right of the screen or window is at (Screen.width, Screen.height).
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour < public GameObject particle; void Update() < if (Input.GetButtonDown("Fire1")) < Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray)) Instantiate(particle, transform.position, transform.rotation); > > >
Координаты курсора сцены в редакторе
Очень давно была необходимость отображать координаты курсора в редакторе сцены. Unity, на сколько я понимаю, до сих пор этого не умеет. Написал давно. Выглядит просто. Сегодня в очередной раз пригодилось, так как нужно было половить пиксели на сцене в режиме паузы.
После открытия окна, перемещая курсор по редактору сцены и нажимая на пробел, в окошке будет выводится координаты мира.
Из этого простого решение можно сделать интересный инструмент. Например, пускать луч и отображать список объектов, слоев и другую информацию для отладки.
2д стрельба в сторону курсора мыши на Unity

Приветствую начинающих разработчиков. В данной статье мы научимся производить выстрелы, направленные в позицию курсора мыши. Для этого разобъём нашу статью на 2 части:
- В первой части данной статьи мы будем рассматривать простую реализацию стрельбу
- А во второй части, на основе простой стрельбы, мы сделаем так, чтобы стрельба происходило в направлении курсора мыши.
Так же хочется обратить Ваше внимание, что в одной из предыдущих статей мы рассматривали, как сделать простую реализацию стрельбы. Поэтому, чтобы не повторяться, первую часть данной статьи мы рассмотрим кратко, и в упрощённой форме.
Простая реализация стрельбы
Первым делом создадим префаб пули. Обязательно добавьте к нему компонент Rigidbody2d. А в поле Body Type данного компонента, укажите значение Kinematic — чтобы на пулю не дейстовала гравитация.

Теперь создаём для префаба нашей пули новый компонет(скрипт C#), и назовём его, например, Bullet. Данный скрипт должен производить полёт пули в указанное направление и с определённой скоростью, а так же уничтожать сам себя по истечении определённого времени, чтобы пуля не летела бесконечно долго.
Пропишем всё это в нашем скрипте:
using UnityEngine; public class Bullet : MonoBehaviour < public float timeDestroy = 3f; public float speed = 3f; public Rigidbody2D rb; void Start() < rb = GetComponent(); rb.velocity = transform.up * speed; Invoke("DestroyBullet", timeDestroy); > void DestroyBullet() < Destroy(this.gameObject); >>
Давайте разберём данный код:
- В строках #5-7 мы объявили три переменные: timeDestroy — для самоуничтожения пули; speed — для указании скорости пули; rb — которая будет хранить ссылку на компонент Rigidbody2D.
- В строках #11-13 мы сначала получили ссылку на компонент Rigidbody2D. Потом указали движение нашей пули вверх. А так же указали, что через 3 секунды запустится метод DestroyBullet, который уничтожит наш объект пули.
Наша пуля готова. Как только она появится в игровой сцене, она автоматически будет лететь вверх, и через 3 секунды пропадёт.
Теперь нам нужно сделать саму стрельбу персонажа, чтобы по клике мыши он создавал эту пулю. Для этого создадим скрипт C# для нашего персонажа. Скрипт назовём Player, и впишем в данный скрипт следующее содержимое:
using UnityEngine; public class Player : MonoBehaviour < public GameObject bullet; void Update() < if (Input.GetKeyDown(KeyCode.Mouse0)) < Instantiate(bullet, transform.position, Quaternion.identity); >> >
В строке #5 мы объявили переменную bullet, в которой будет хранится ссылка на наш префаб пули. Поэтому обязательно перетащите префаб пули в поле bullet в Инспекторе.
А в строке #11 с помощью метода Instantiate() мы создаём пулю на игровой сцене, из вашего префаба пули. И она сразу же будет осуществлять полёт вверх.
Стрельба в направление курсора мыши
Мы добрались до самого интересного. Для того, чтобы стрельба осуществлялась в направлении курсора мыши, первым делом нам необходимо определить, в какой же позиции игрового пространства располагается наша мышь, чтобы при появлении нашей пули, она летела не вверх, а в направлении курсора мыши. Поэтому и весь следующий код мы должны прописывать в скрипте Bullet, который находится на префабе нашей пули.
Пропишем следующую строчку:
Vector3 diference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
Если вкратце, то она находит векторные координаты курсора относительно объекта пули. А если более подробней, то рекоммендуем посетить нашу статью по определении позиции курсора мыши.
Далее нам нужно развернуть нашу пулю в сторону позиции курсора мыши, для это пропишем следующее:
float rotateZ = Mathf.Atan2(diference.y, diference.x) * Mathf.Rad2Deg; transform.rotation = Quaternion.Euler(0f, 0f, rotateZ);
Используя данные в переменной diference, с помощью метода Mathf.Atan2 мы получает угол в радианах. А потом с помощью константы Mathf.Rad2Deg, мы преобразовываем преобразовывает радиан в градусы.
Затем с помощью метода Quaternion.Euler мы получаем значение поворота, и присваиваем это значение нашему персонажу.
Готово! Теперь склеим всё что мы написали с кодом из персой части скрипта Bullet префаба пули. Весь код выглядит так:
using UnityEngine; public class Bullet : MonoBehaviour < public float timeDestroy = 3f; public float speed = 3f; public Rigidbody2D rb; void Start() < rb = GetComponent(); Vector3 diference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; float rotateZ = Mathf.Atan2(diference.y, diference.x) * Mathf.Rad2Deg; transform.rotation = Quaternion.Euler(0f, 0f, rotateZ); rb.velocity = transform.up * speed; Invoke("DestroyBullet", timeDestroy); > void DestroyBullet() < Destroy(this.gameObject); >>
Поздравляем, теперь пуля сразу при появлении на сцене, единоразово сделает поворот в сторону пули, а потом запустит её туда.
Тема была сложная, но надеюсь у меня получилось объяснить данную тему. Но если остались вопросы, пишите в комментариях.
Как отслеживать transform позицию курсора мыши в Unity2d?
Я делаю игру песочницу, в ней объекты создаются нажатием мыши. Но я не нашёл кода который выдавал бы transform позицию, Input.MousePosition выдаёт позицию в пикселях а использовать это в transform position слишком крупно для игры с размером камеры 0.5.
Отслеживать
задан 1 июн 2021 в 16:38
Фёдор Матвеев Фёдор Матвеев
3 2 2 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
ScreenToWorldPoint(Vector3 position);
где position x,y — экранная точка, а z — глубина на которой нужно разместить обьект на сцене.
Отслеживать
ответ дан 1 июн 2021 в 20:49
Andrew Stop_RU_war_in_UA Andrew Stop_RU_war_in_UA
19k 6 6 золотых знаков 36 36 серебряных знаков 98 98 бронзовых знаков
- c#
- unity3d
- transform
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.