Страница 1 из 1

Создание объекта на экране под курсором

СообщениеДобавлено: 16 июн 2019, 13:26
anomal3
Доброго времени суток.
Подскажите пожалуйста с моей тупостью, никак не доходит.
Нужно создать объект у курсора мыши на экране
Нажал мышью на экране и в это месте создать объект
Изображение
Грубо говоря хочу кинуть шар в месте клика
Синтаксис:
Используется csharp
public Transform sphere;

if(Input.GetMouseButtonDown(0))
                {
                        Transform BulletInstance = (Transform) Instantiate(bullet, /*Как определить место клика на экране?*/, Quaternion.identity);
                        BulletInstance.GetComponent<Rigidbody>().AddForce(transform.forward * 1000);
                }
 


пробовал
Синтаксис:
Используется csharp
Input.mousePosition;
но создаётся объект в мировых координатах, а нужно именно на экране
Пробовал относительно центра экрана
Синтаксис:
Используется csharp
new Vector3(Screen.width / 2 - Input.mousePosition.x, Screen.height / 2 - Input.mousePosition.y)
, но выходит фигня
Нужно что то типа такого
Изображение

Re: Создание объекта на экране под курсором

СообщениеДобавлено: 16 июн 2019, 14:16
Saltant
Синтаксис:
Используется csharp
Camera.main.ScreenPointToRay (Input.mousePosition);

Re: Создание объекта на экране под курсором

СообщениеДобавлено: 16 июн 2019, 14:39
anomal3
Saltant писал(а):
Синтаксис:
Используется csharp
Camera.main.ScreenPointToRay (Input.mousePosition);

Синтаксис:
Используется csharp
Input.mousePosition
это же Vector3
или я чего то не понимаю?

Re: Создание объекта на экране под курсором

СообщениеДобавлено: 16 июн 2019, 15:28
1max1
Это же 3д пространство, игра не знает на какой именно дальности создавать объект.
Синтаксис:
Используется csharp
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
var pos = ray.origin + ray.direction * 10.0f;
obj.transform.position = pos;

Re: Создание объекта на экране под курсором

СообщениеДобавлено: 17 июн 2019, 10:55
anomal3
1max1 писал(а):Это же 3д пространство, игра не знает на какой именно дальности создавать объект.
Синтаксис:
Используется csharp
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
var pos = ray.origin + ray.direction * 10.0f;
obj.transform.position = pos;

Спасибо Мах.
Но я немного не догоняю с лучами, подскажи пожалуйста с комментариями.
В переменную Ray мы записываем положение клика мыши на экране,
а в переменной pos что?

Re: Создание объекта на экране под курсором

СообщениеДобавлено: 17 июн 2019, 11:46
1max1
В переменную Ray мы записываем положение клика мыши на экране,

В переменную ray мы записываем ray)), который исходит из координат камеры (ray.origin) в направлении положения курсора (ray.direction)
а в переменной pos что?

Простая математика векторов, к стартовому положению прибавляем направление луча умноженное на 10, то есть будет позиция, смещенная на +10 юнитов вперед по направлению луча относительно стартовой позиции.

Re: Создание объекта на экране под курсором

СообщениеДобавлено: 17 июн 2019, 15:21
anomal3
1max1 писал(а):
В переменную Ray мы записываем положение клика мыши на экране,

В переменную ray мы записываем ray)), который исходит из координат камеры (ray.origin) в направлении положения курсора (ray.direction)
а в переменной pos что?

Простая математика векторов, к стартовому положению прибавляем направление луча умноженное на 10, то есть будет позиция, смещенная на +10 юнитов вперед по направлению луча относительно стартовой позиции.

Вот только направление теперь странное. Хотя и указывал двигать
Синтаксис:
Используется csharp
transform.forward * 5500
все равно к центру шарики хотят
Не соображу как луч строится. Почему они в центр стремятся?



Синтаксис:
Используется csharp
 public void shoot()

    {

        if (Input.GetMouseButtonDown(0))
        {
            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            var pos = ray.origin + ray.direction * 10.0f;
            spawn.transform.position = pos;
            Transform BulletInstance = Instantiate(bullet, pos, Quaternion.identity);
            BulletInstance.GetComponent<Rigidbody>().AddForce(new Vector3(pos.x, pos.y, 5500));
        }
    }

Re: Создание объекта на экране под курсором

СообщениеДобавлено: 17 июн 2019, 15:28
1max1
Используй глобальные оси направления, к примеру Vector3.forward, хотя я не знаю, какая именно тебе нужна.
Синтаксис:
Используется csharp
BulletInstance.GetComponent<Rigidbody>().AddForce(Vector3.forward * force);

Re: Создание объекта на экране под курсором

СообщениеДобавлено: 17 июн 2019, 16:04
anomal3
1max1 писал(а):Используй глобальные оси направления, к примеру Vector3.forward, хотя я не знаю, какая именно тебе нужна.
Синтаксис:
Используется csharp
BulletInstance.GetComponent<Rigidbody>().AddForce(Vector3.forward * force);

пробовал я так. Результат такой же
Чего то я запутался.
Оказывается шары не летят к центру, а летят прямо, а из-за камеры в "Перспективе" так "кажется" что они криво летят.

Изображение

все как и положено. Я то хотел добиться другого полёта, как на видео выше. Чтобы вектор продолжал прямо куда смотришь за мышкой. я хз как объяснить. На видео выше видно какой результат хочу добиться
Изображение

Re: Создание объекта на экране под курсором

СообщениеДобавлено: 17 июн 2019, 16:30
1max1
Синтаксис:
Используется csharp
BulletInstance.GetComponent<Rigidbody>().AddForce(ray.direction * force);