Как осуществить движение персонажа за курсором мыши в Unity 3D?
Пытаюсь сделать игру на Unity, где персонаж при нажатии клавиши W должен двигаться в сторону курсора мыши, S - назад и AD вправо и влево соответственно. Плохо получилось, не понимаю как это сделать. Единственное, что пришло в голову:
using System.Collections.Generic;
using UnityEngine;
public class CharacterMove : MonoBehaviour
{
[Header("Parameters: ")]
[SerializeField] public float Speed = 1;
Rigidbody rigidBody;
Vector3 LookPosition;
void Start()
{
rigidBody = GetComponent<Rigidbody>();
}
void Update()
{
Ray Ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit HitInfo;
if (Physics.Raycast(Ray, out HitInfo, 100000000))
{
LookPosition = HitInfo.point;
}
Vector3 LookDirection = LookPosition - transform.position;
LookDirection.y = 0;
transform.LookAt(transform.position + LookDirection, Vector3.up); //смотрим в сторону курсора мыши
if (Input.GetKey(KeyCode.W))
{
rigidBody.AddForce((LookDirection * Speed).normalized / Time.deltaTime);
}
else if (Input.GetKey(KeyCode.S))
{
rigidBody.AddForce((LookDirection * -Speed).normalized / Time.deltaTime); //"двигаемся"
}
}
}
Но при таком раскладе я не знаю, как сделать движение влево и вправо. Подскажите, пожалуйста, как это можно решить. Заранее спасибо!
P.S. по моей задумке, если постоянно нажимать A или D - персонаж будет ходить по кругу вокруг курсора. Это не баг, а фича :).
Ответы (1 шт):
С вектором движения ошибка. Нет смысла множить на скорость, если затем нормализируешь (если значение меняется -1/1 тогда это называется не скорость) и ненужно учитывать Y, на не ровной поверхности может сказаться.
Vector3 LookVector = LookPosition-transform.position;
LookVector = new Vector3(LookDirection.x, 0, LookDirection.z);
Vector3 MoveVector = transform.normalized*Speed*Time.DeltaTime;
Но если ты поворачиваешь объект в нужную сторону, то можешь использовать
transform.forward*Speed*Time.DeltaTime; // forward
-transform.forward*Speed*Time.DeltaTime; // back
transform.right*Speed*Time.DeltaTime; // right
-transform.right*Speed*Time.DeltaTime; // left
AddForce пользуешся не правильно. Во первых физику обновляют в FixedUpdate() и с Time.fixedDeltaTime, обновление физики не привязано к обновлению фрейма. Во вторых ты каждый кадр накидываешь новых сил, помимо тех, которые уже есть, аля снежный ком. У AddForce есть разные моды, но ты лучше пользуйся просто rigidBody.velocity =