Чтобы исправить код для передвижения игрока в Unity с использованием подхода "top-down", необходимо убедиться, что движение происходит в плоскости, а также учесть, что игрок может поворачиваться в направлении движения. Вот исправленный код:
using UnityEngine;
public class Player : MonoBehaviour
{
[SerializeField] private float movingSpeed = 10f;
private PlayerInput playerInputActions;
private Rigidbody2D rb;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
playerInputActions = new PlayerInput();
playerInputActions.Enable();
}
private Vector2 GetMovementVector()
{
return playerInputActions.Player.ReadValue<Vector2>();
}
private void FixedUpdate()
{
Vector2 inputVector = GetMovementVector();
// Нормализуем вектор, чтобы избежать ускорения по диагонали
if (inputVector.magnitude > 1)
{
inputVector.Normalize();
}
// Двигаем игрока
rb.MovePosition(rb.position + inputVector * (movingSpeed * Time.fixedDeltaTime));
// Поворачиваем игрока в направлении движения
if (inputVector !=
Vector2.zero )
{
float angle = Mathf.Atan2(inputVector.y, inputVector.x) * Mathf.Rad2Deg;
rb.rotation = angle;
}
}
}
Изменения и пояснения:
Переименование переменной: Изменил muvingspeed на movingSpeed для лучшей читаемости.
Нормализация вектора: Добавил проверку на нормализацию вектора, чтобы избежать ускорения при движении по диагонали.
Поворот игрока: Добавил код для поворота игрока в направлении движения, используя Mathf.Atan2 для вычисления угла.
Теперь игрок будет двигаться в 2D-пространстве и поворачиваться в направлении движения, что соответствует типичному поведению для игр в жанре "top-down".
using UnityEngine;
public class Player : MonoBehaviour
{
[SerializeField] private float muvingspeed = 10f;
private PlayerInput playerinputActions;
private Rigidbody2D rb;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
playerinputActions = new PlayerInput();
playerinputActions.Enable();
}
private Vector2 GetMovementVector()
{
Vector2 inputVector = playerinputActions.Player.ReadValue<Vector2>();
return inputVector;
}
private void FixedUpdate()
{
Vector2 inputVector = GetMovementVector();
inputVector = inputVector.normalized;
rb.MovePosition(rb.position + inputVector * (muvingspeed * Time.fixedDeltaTime));
}
}