Как осуществить движение персонажа за курсором мыши в 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 шт):

Автор решения: Yaroslav

С вектором движения ошибка. Нет смысла множить на скорость, если затем нормализируешь (если значение меняется -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 =

→ Ссылка