Войти
ПрограммированиеФорум2D графика и изометрия

Столкновение с мышкой в Unity3D

Страницы: 1 2 Следующая »
#0
21:54, 30 янв. 2017

Здравствуйте, как сделать так, чтобы курсор был определенной картинкой, при этом чтобы курсор был как бы твёрдым телом, и иметь при этом свой коллаидер, чтобы я мог мышкой толкать/двигать объекты, как только коллаидер курсора соприкасается с каким-то 2D объектом.

Что собственно у меня имеется сейчас, но не работает...
Есть спрайт, он имеет rigidbody 2d, коллаидер, трансформ естественно, спрайтрендер

Извиняюсь, не сообщил, что это речь про Unity 3D соотвественно, но я думаю, знающие игроделы догадались =)


#1
5:30, 31 янв. 2017

Сделай коллайдер и каждый кадр обновляй его позицию в соответствии с мышиными координатами.

#2
10:29, 31 янв. 2017

тут нет хорошего решения, можно рассмотреть два:
1
youtube
> Сделай коллайдер и каждый кадр обновляй его позицию в соответствии с мышиными
> координатами.
в этом случае коллайдер будет двигаться нарушая законы физики, при резких движениях мышки возникнет эффект "телепортации" коллайдера, из-за этого воздействие на объекты не всегда будет выглядеть нормально
2
сделать коллайдер, который смещается в точку курсора приложением сил, в этом случае воздействие на объекты будет максимально реалистичным, но при резких движениях мышки коллайдер будет отставать от курсора

#3
16:36, 31 янв. 2017

Ммм дело в том, что если я создаю объект, вешаю на него то, что я перечислил + скрипт вот такого содержания

public class ДвижениеМышки : MonoBehaviour 
{
Transform Трансформ;

  void Start () 
  {
          Cursor.visible = false;
          Трансформ = GetComponent<Transform>();
  }
 void Update () 
  {

  }
  void OnGUI()
  {
        Трансформ.position = Event.current.mousePosition;
  }
}

То в игре получается местоположение картинки меняется на местоположение курсора, но сама мышка исчезает с экрана, т.е. картинка не отрисовывается...почему - не пойму =(


-—————————————————
А если запилить вот такой скрипт и отключить Spriterender, перетащив в скрипт картинку мышки, то она нормально двигается, но опять же, ею ничего не сдвинуть на сцене, т.к. не двигается Transform и коллаидер....
Но даже если двигать коллаидер с помощью  Event.current.mousePosition, то тоже ничего мышкой не толкнуть =( Ещё знаю есть Input.mousePosition.... но чем он отличается от Event-a не совсем догоняю....

public class ДвижениеМышки : MonoBehaviour 
{
    public Texture2D Картинка;
    Vector2 Расположение_Мышки;

  void Start () 
  {
          Cursor.visible = false;
  }
  void Update () 
  {

  }
  void OnGUI()
  {
         Расположение_Мышки = Event.current.mousePosition;
         Graphics.DrawTexture(new Rect(Расположение_Мышки.x, Расположение_Мышки.y, 26, 25), Картинка);
  }
}
#4
19:29, 31 янв. 2017

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

#5
23:58, 3 фев. 2017
Трансформ.position = Event.current.mousePosition;

Ты учёл, что mousePosition - в пиксельных координатах экрана, а Трансформ.position - в координатах сцены, которые не всегда совпадают с пикселями, и начало (0, 0) может вообще за пределами экрана быть?
Используй Camera.ScreenToWorldPoint
#6
10:43, 4 фев. 2017

добавь в название темы тег

#7
16:57, 4 фев. 2017

DistinGa
> Ты учёл, что mousePosition - в пиксельных координатах экрана, а
> Трансформ.position - в координатах сцены, которые не всегда совпадают с
> пикселями, и начало (0, 0) может вообще за пределами экрана быть?
> Используй Camera.ScreenToWorldPoint

Ну да, в том-то и беда, что это абсолютно разные координаты, а мне нужно, чтобы естественно, вне игры координаты не учитывались, а учитывались координаты игрового экрана, независимо от разрешения экрана...а насчёт Camera.ScreenToWorldPoint, отдельная беда... ну во-первых такого нет, есть:

Camera.main.ScreenPointToRay(Vector3 xxx) - который вроде как возвращает точку, которая получается исходя из выпущенного луча от камеры до мышки... ну верней, до точки назначения, а точку назначения указываю координаты мышки.  (притом вроде именно центра камеры и именно от камеры, которая имеет тэг "Main camera", с другими камерами и их лучами я так понял тоже полный капут).

И есть еще...
Camera.main.ScreenToWorldPoint (Vector3 xxx) - о котором ты написал, это дело вроде как переделывает игровые координаты в мировые... тут короче вообще хз, что за фигня, я когда пытался через это дело получить координаты мышки то тоже ничего не получалось...тут вообще жопа наступает, прям беда короче... я уже совсем запутался....=(

Сейчас я скажу, как я рассматриваю всяческие координаты в Unity 3D, и способ их получения, с учётом того, что у меня есть canvas и к нему прицеплена в компонентах камера, а вы пожалуйста поправьте меня, если что-то я в чём-то ошибаюсь, очевидно я ошибаюсь, но не могу понять в чём =(. Начнём с того, что работу Unity, я делю по координатам на 3 типа:

(1) координаты всей сцены (scene) - я так понимаю эти координаты народ и называет мировыми.
(2) координаты в пределах всего монитора (т.е. непосредственно разрешение монитора)
(3) последнее это координаты игровые, т.е. непосредственно, то, что показывает игровая камера.

1) Есть координаты Transorm.position — это у нас координаты объекта в игровом пространстве (т.е. всей сцены), имеют тип Vector3, и если у нас камера находится на сцене в координатах 0,0,0 допустим, то Transform.position объекта расположенный в координатах 0,0,0 будет находиться ровно по центру камеры. Но опять же, если эти координаты больше чем Screen.width  и  Screen.height, то соотвественно объект улетает за пределы игрового экрана.
2) Так же есть Input.mousePosition — это у нас текущее расположение мышки, это вообще стрёмные и непонятные координаты, они у меня берут отсчёт с нижнего левого угла (там оно считает 0,0,0) игрового экрана и увеличиваются до максимального разрешения экрана монитора. Тип этой ерунды Vector3, координата Z постоянно равна 0.
3) Есть Event.current.mousePosition — это тоже самое, что и (2), но только отсчёт координат берётся с левого верхнего угла игрового экрана, и увеличивается соответственно вниз и право до разрешения монитора. Тип этой хрени Vector2. Координаты и размеры сцены роли не играют, такая же ерунда - просто тупо до краев монитора.

Короче получается, что фактически нет никаких функций, которые могли бы помочь определить где находится мышка в пределах игрового экрана, а не монитора в целом.
То, что я могу определить размеры игрового экрана и запилить их в переменные с помощью  Screen.width  и  Screen.height это понятно, но как определять координаты мышки именно в этих координатах не понятно...
Например надо чтобы кликом мышки появлялся юнит в игре.... получается например чтобы он был чуть левее и ниже чем центр камеры. Например в координатах (-3, -5) от центра камеры.... но я не могу никаким образом получить эти координаты, т.к. мышка имеет то (230, 350), то (350, 240).... но никак не хочет начинать отсчёт от центра камеры.... просто я так понял, что все эти координаты мышки которые можно достать - это всё мониторные координаты, а как их переделать в координаты игрового экрана ? =(

Я думаю, что это нужно всё завязывать с лучами, но опять же, после обновы теперь получается есть классы Ray, Ray2D, RaycastHit и RaycastHit2D... а еще есть вот такие методы Physics2D.Raycast(...) и Physics.Raycast(...), а как этим всем нормально пользоваться тоже не понятно.

Благодаря переменным классов Ray и Ray2D - я так понимаю, могу задать начальную точку луча и его направление
С помощью RaycastHit и RaycastHit2D - я так понимаю можно указать то, во что именно я планирую упереть луч, т.е. тип конечной точки, будь то, объект, точка, коллаидер
А с помощью методов Physics2D.Raycast(...) и Physics.Raycast(...) - я так понимаю в параметры этих методов я заношу данные из этих классов, но суть в том, что не получается задать нормальный луч, т.к. направление луча - должна быть точка расположения мышки в игровом экране =(

#8
18:38, 4 фев. 2017

Каша. И в центре этой каши игровой экран. Не понял, что ты под этим понимаешь.
Предлагаю упростить.
0. Есть справка, в которой все объекты и их методы описаны. Некоторые объекты, особенно которые появились в старых версиях Юнити, описаны даже на русском языке.
0а. Не вешай компонент камеры на канвас, если у тебя нет для этого особо веских причин. Лучше создай для камеры отдельный объект.
1. Есть мировые координаты, измеряемые в абстрактных единицах units, которые в Unity принято брать за метры. Transorm.position - в этих координатах.
2. Есть экранные координаты, измеряемые в пикселях. Естественно, что максимальные их значения будут соответствовать разрешению монитора. С мировыми они не имеют ничего общего. Только в этих координатах можно получить положение указателя мыши. Для этого нужно использовать Input.mousePosition.
3. Для перевода экранных координат в мировые используется метод камеры ScreenToWorldPoint.

Таким образом, если у тебя 2Д, и ты хочешь, чтобы объект оказался под указателем мыши нужно написать что-то в роде:

transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition)
Но если применяется физика, то могут быть проблемы, о которых писал leonardo98.
В этом случае лучше использовать Rigidbody.MovePosition и делать это в событии FixedUpdate:
    
public Rigidbody2D rb;
void Start() 
{
    rb = GetComponent<Rigidbody2D>();
}
void FixedUpdate() 
{
    rb.MovePosition((Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition));
}

#9
19:16, 4 фев. 2017

DistinGa
> 0а. Не вешай компонент камеры на канвас, если у тебя нет для этого особо веских
> причин. Лучше создай для камеры отдельный объект.
> Таким образом, если у тебя 2Д, и ты хочешь, чтобы объект оказался под
> указателем мыши нужно написать что-то в роде:
>
> transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition)

Сейчас я вкратце объясню, то, что ты написал - это конечно работает, но работает плохо. И в моём случае это не работает вообще.
А у меня случай следующий, есть на сцене Canvas, я его сделал, чтобы засунуть в него интерфейс игрока, в нем я указал приоритетное разрешение. Ну и картинку интерфейса загнал в этот canvas, всё хорошо, при любом разрешении интерфейс нормально отображается....
В канвасе, в компонентах есть такая хрень - Render mode, если я засовываю туда свою камеру, то канвас уменьшается до размеров камеры, ну и соответственно интерфейс тоже....
Так же, получается, что для того, чтобы юнит был правильного размера в игре, я должен указать размер (Size) камеры 5... и получается, что если в канвасе не указывать камеру в рендере, то у меня есть здоровый канвас и малюсенькая камера в левом нижнем углу этого канваса...В принципе посмотрел туториалы и прочие хрени это все по идее так и должно быть, но суть в том, что исходя из этого
transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition)
Юнит получает точку мыши, но не точку в пределах видимости камеры, а точку мыши, которая находится хрен знает где вне камеры, т.к. камера-то малюсенькая.... у камеры каждый x и y там 0.01, потом еще если чуть правее то 0.02 и т.п....а то, что ты указал - это координаты монитора и они равны (462, 421) т.е. юнит делается далеко за пределами камеры, и если канвас имеет в рендере камеру, то юнит даже вне канваса появляется =(
1 | Столкновение с мышкой в Unity3D

#10
19:44, 4 фев. 2017
2 | Столкновение с мышкой в Unity3D
#11
19:49, 4 фев. 2017

В месте, где я кликнул мышкой, там координаты мышки были 462, 421, это вот по той функции которую ты написал, но эти координаты далеко от того, что видит камера, можно конечно сделать размер камеры тогда 250, перетащить ее в границы интерфейса и к примеру задать чтобы юнит был не размером 1, а Scale к примеру 80.... но это мне кажется совсем все не верно...

#12
20:02, 4 фев. 2017

Странно... После моих объяснений каша не уменьшилась :)
Что-то я делаю не так.
Ещё раз...
Координаты экрана в пикселях (которые вернёт Input.mousePosition) и мировые координаты - это координаты совсем в разных системах. Это всё равно как определить по линейке координаты объекта на фотографии и надеяться, что координаты этого объекта в реальном мире будут такими же (2см; 4см).
Твои координаты мышки 462, 421 - это в пикселях экрана. Camera.main.ScreenToWorldPoint(Input.mousePosition) переведёт их в координаты игрового мира. Не важно, какой размер у камеры, Юнити сама всё преобразует с учётом этого.

Напиши значения в момент клика:
- Input.mousePosition
- Camera.main.ScreenToWorldPoint(Input.mousePosition)
- position камеры

#13
20:56, 4 фев. 2017
1a | Столкновение с мышкой в Unity3D
#14
20:57, 4 фев. 2017

при этом скрипт который генерирует юнитов выглядит вот так....
2a | Столкновение с мышкой в Unity3D

Страницы: 1 2 Следующая »
ПрограммированиеФорум2D графика и изометрия

Тема в архиве.