Unity с использованием C#
В игре сверху вниз, где вращение камеры заблокировано, я создал контроллер персонажа, который ограничен 8 осями и будет вращаться только с шагом 45 градусов. Подумайте ссылки пробуждения. Все работает, кроме как при движении по диагонали (с использованием WASD).
Когда я даю, например, go W & D, какую бы клавишу я не дал go последней, даже если за долю секунды игрок окажется в этом направлении, а не в намеченном вверх и вправо по диагонали.
Я хочу изменить следующий код, чтобы добавить какой-то буфер, чтобы игрок оставался лицом к намеченному направлению, когда я нажимаю go из 2 клавиш. Я хотел бы сделать это как можно более простым.
public float defaultSpeed = 6f;
CharacterController controller;
private Vector3 playerMovement;
Vector2 input;
float angle;
Quaternion targetRotation;
Transform cam;
// Start is called before the first frame update
void Start()
{
controller = GetComponent<CharacterController>();
cam = Camera.main.transform;
}
// Update is called once per frame
void Update()
{
Movement();
}
public void Movement()
{
//Get inputs
input.x = Input.GetAxisRaw("Horizontal");
input.y = Input.GetAxisRaw("Vertical");
//Only update if keys are pressed
if (Mathf.Abs(input.x) < deadZone && Mathf.Abs(input.y) < deadZone) return;
//Get camera angle: input to radians - radians to degrees - degrees plus the camera angle - limit angle to 45 degree increments
angle = Mathf.Atan2(input.x, input.y);
angle = Mathf.Rad2Deg * angle;
angle += cam.eulerAngles.y;
angle = Mathf.Round(angle / 45) * 45;
//Rotate Character
targetRotation = Quaternion.Euler(0, angle, 0 );
transform.rotation = targetRotation;
//Move Character
transform.position += transform.forward * defaultSpeed * Time.deltaTime;
}