https://play.google.com/store/apps/deta ... ssic&hl=ru
Игра называется Falcon Squad. Лучше потыкать самому, чтобы понять какой контроллер нужен.
Суть такая. В любой точке экрана можно провести пальцем и корабль повторит траекторию параллельно, начиная от своей позиции. Проблемы появляются на моменте, когда я хочу реализовать увеличение скорости/чувствительности корабля. Путь получается либо ломанный, либо не точный, либо с багами.
Ввод должен быть через Input.GetMousePosition и GetMouseButton, а движение через методы rigidbody2d.
1. Я брал вектор от места клика, до позиции корабля, затем прибавлял к вектору клика и получал тем самым смещенное положение игрока, которое передавал в MovePosition, тем самым корабль повторяет точные движения пальцем, но при таком вводе нет возможности увеличивать скорость. Конечно можно умножить полученный вектор на скорость, но при каждом клике корабль смещается на вектор кратный скорости, и только после этого летит быстрее.
2. Пробовал брать дельту позиции курсора, тем самым получая направление свайпа и передавая его rigidbody velocity, но тогда при умножении этого вектора на скорость, сам вектор увеличивается и путь получается ломанным. А если вектор нормализовать, тогда при обычном прикосновении к экрану, палец дрожит, получается нормализованный вектор и корабль улетает быстро в сторону, при большой заданной скорости.
3. Пробовал записывать точки свайпа в массив, и потом по этому пути следовать, но так и не получилось корректной работы.
Может кто поможет с решением данной задачи. Лучше конечно пощупать управление в игре по ссылке, чтобы понять что мне нужно.
Вот скрипт с первым способом:
Синтаксис:
Используется csharp
using System;
using UnityEngine;
public class Player : MonoBehaviour
{
[SerializeField] private float speed;
private Camera camera;
private Vector2 touchPosition;
private Vector2 offset;
private Vector2 direction;
private Rigidbody2D rb2d;
private void Awake()
{
rb2d = GetComponent<Rigidbody2D>();
camera = Camera.main;
Input.multiTouchEnabled = false;
direction = transform.position;
}
private void Update()
{
GetInput();
}
private void FixedUpdate()
{
rb2d.MovePosition(direction);
}
private void GetInput()
{
if (!Input.GetMouseButton(0)) return;
touchPosition = camera.ScreenToWorldPoint(Input.mousePosition);
if (Input.GetMouseButtonDown(0))
{
offset = (Vector2)transform.position - touchPosition;
}
if (Input.GetMouseButton(0))
{
direction = touchPosition * speed + offset;
}
if (Input.GetMouseButtonUp(0))
{
direction = transform.position;
}
}
}
using UnityEngine;
public class Player : MonoBehaviour
{
[SerializeField] private float speed;
private Camera camera;
private Vector2 touchPosition;
private Vector2 offset;
private Vector2 direction;
private Rigidbody2D rb2d;
private void Awake()
{
rb2d = GetComponent<Rigidbody2D>();
camera = Camera.main;
Input.multiTouchEnabled = false;
direction = transform.position;
}
private void Update()
{
GetInput();
}
private void FixedUpdate()
{
rb2d.MovePosition(direction);
}
private void GetInput()
{
if (!Input.GetMouseButton(0)) return;
touchPosition = camera.ScreenToWorldPoint(Input.mousePosition);
if (Input.GetMouseButtonDown(0))
{
offset = (Vector2)transform.position - touchPosition;
}
if (Input.GetMouseButton(0))
{
direction = touchPosition * speed + offset;
}
if (Input.GetMouseButtonUp(0))
{
direction = transform.position;
}
}
}
Тут очевидно, что не так, но зато с с таким ускорением игрок движется плавно и всё работает круто, кроме того что при клике он перемещается в сторону кратно скорости. Может решение простое, и я чего-то не догоняю. А может не всё так очевидно и надо хитрить.