- Скорость зависит от расстояния от объекта до щелчка. Как это исправить?
Как заблокировать движение (после щелчка) по оси y?единство 2d крана для ходьбы
public int speed; Vector3 position; bool go; void FixedUpdate() { if (Input.GetKey (KeyCode.Mouse0)) { go=true; Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); RaycastHit hit; if (Physics.Raycast (ray, out hit, Mathf.Infinity)) { position = hit.point; } } ////////////////////////////////////////////////////////////////////// if(go) { Vector2 direction = position - transform.position; float targ_pos = Vector2.Distance (transform.position, position); if(targ_pos>0) { rigidbody2D.AddForce ((position - transform.position)*speed); } else {go=false;} } }
ответ
Может быть, вы все еще ищете ответ, но это могло бы помочь другим интересно, то же самое.
Я сделал игру, в которой персонаж перемещался с помощью метода ClickToMove. Вот как я это сделал. Моя игра была 3D, поэтому вам, возможно, придется немного подкорректировать.
Мы храним точку, которую мы ударили, которая принадлежит к этажу моей сцены (floorHit). В верхней части моего класса я объявил Vector3 toGo. У моего игрока жесткая привязка к нему, и я поворачиваюсь к точке, которую он должен двигаться. Затем используйте MoveTowards (от, до, скорость);
if (Physics.Raycast (camRay, out floorHit, camRayLength, floorMask)) {
Vector3 playerToMouse = floorHit.point - transform.position;
// the quaternion defines the rotation, looking through the vector
Quaternion newRotation = Quaternion.LookRotation (playerToMouse);
playerRigidbody.MoveRotation (newRotation);
toGo = floorHit.point; // We save the point we touched }
Тогда вне из если, по-прежнему в функции обновления, мы называем MoveTowards с ToGo Vector3 мы сохранили ранее:
transform.position = Vector3.MoveTowards (transform.position, toGo, speed * Time.deltaTime);
Надежда, что помогает,
Кроме того, , У меня есть код, если вы хотите оживить своего персонажа.
Не стесняйтесь просить больше,
BRO
Сила, что вы в настоящее время добавления является относительно расстояния, которое вы пытаетесь «перевести». Вам нужно создать нормализованный вектор, а затем умножить его на скорость. Что касается пункта 2, то в ваших объектах жесткое тело вы можете динамически устанавливать ограничения движения, я думаю, что это то, что вы ищете? – Zze
Спасибо, что ответили. Я знаю о «нормализации», но я действительно новичок.) Нечто вроде: rigidbody2D.AddForce ((позиция - transform.position) .Normalize * speed); вызывает ошибки. Что касается пункта 2 (если вы написали о позиции/повороте блокировок Constraints), эта функция доступна только для RigidBody (3D), а не для 2D. –