MadDoberman
@MadDoberman
Начинающий Unity разработчик

Почему вычитание векторов дает нужную позицию для перемещения объекта мышью?

Привет! Дебютирую со своим вопросом и прошу разъяснить знающих принцип поведения объекта в моем кейсе.
И так - воплощаю прототип из книги "Unity and C#. Геймдев от идеи до реализации" под названием Mission Demolition (игра по типу Angry Birds).
Опишу суть:
- Мне необходимо, чтобы при наведении мыши в зону "пуска снаряда" и нажатии мыши появлялся снаряд и перемещался за мышью (так будет регулироваться направление и сила выстрела).
- Перемещение снаряда должно ограничиваться радиусов коллайдера зоны пуска

В процессе изучения столкнулся с непониманием...
Есть код:
private void Update()
    {
        Vector3 mouse2D = Input.mousePosition;
        mouse2D.z = -Camera.main.transform.position.z;
        Vector3 mouse3D = Camera.main.ScreenToWorldPoint(mouse2D); //чекаем координаты 
//мыши

        mouse3D -= lounchPos; //корень моей головной боли !!!

        float maxMagnitude = GetComponent<SphereCollider>().radius; 
//ограничиваем перемещение в радиусе "зоны пуска" lounchPoint
        if (mouse3D.magnitude > maxMagnitude)
        {
            mouse3D.Normalize();
            mouse3D *= maxMagnitude;
        }
        projectile.transform.position = projPos; //переменная чтоб дебаг проще делать
        projPos = mouse3D + lounchPos; //перемещаем объект в новую точку
    }
   
    private void OnMouseDown()
    {
        projectile = Instantiate<GameObject>(projectile);
        projectile.transform.position = lounchPos;
    }


Весь код выше, взят из книги и мной осознан вдоль и поперек, кроме строки
mouse3D -= lounchPos;
Решив писать самостоятельно, я просто определял позицию мыши, ограничивал вектор мыши радиусом коллайдера и перемещал туда объект.

НО, в этом случае объект перемещался только на половину сферы коллайдера. На картинке зеленым отмечена полусфера где объект мог перемещаться за мышкой, а красным отмечена зоны куда объект за мышью уже не следовал.
5e9effe85ace1295332258.jpeg

Если же я добавлял в код mouse3D -= lounchPos; то объект вел себя так как нужно.

Я пытаюсь осознать все части кода из книги, чтобы мочь спокойно решать другие задачи похожего формата в будущем (в общем, хочется именно научиться, а не просто копипастить). Я прочел, что вычитание позиции пуска из точки мыши дает мне направление вектора перемещения между мышью и точкой пуска и дает мне расстояние между этими точками. Но вот ОСОЗНАТЬ как/зачем это происходит сил мне не хватает. Повтор линейной алгебры только запутал сильнее, потому что по правилу параллелограмма при вычитании mouse3D-lounnchPos получается вектор вообще другого направления и почему это вычитание работает в коде мне не ясно.
За любые ресурсы или простые разъяснения буду крайне признателен. 3 дня самопыток пока не увенчались успехом. Спасибо!
  • Вопрос задан
  • 372 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы