Не используйте transform.forward
и transform.right
для создания вектора движения, просто сделайте его в мировом пространстве. Затем вы можете установить transform.forward
в качестве направления движения.
Также, как derHu go, упомянутый ниже в комментарии, вы должны
избегайте использования точного равенства для сравнения чисел с плавающей запятой. Вместо этого используйте Mathf.Approximately
или используйте свой собственный порог, как показано ниже
, избегайте установки триггеров каждый кадр. вместо этого вы можете использовать флаг, чтобы определить, находитесь ли вы уже в режиме ожидания или уже работаете, и устанавливать триггер только в том случае, если вы еще не сделали этого.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveController : MonoBehaviour
{
private CharacterController controller = null;
private Animator animator = null;
private float speed = 5f;
bool isIdle;
void Start()
{
controller = gameObject.GetComponent<CharacterController>();
animator = gameObject.GetComponent<Animator>();
isIdle = true;
}
void Update()
{
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
Vector3 move = new Vector3(x, 0f, z);
controller.Move(move * speed * Time.deltaTime);
var angle = Mathf.Atan2(move.z, move.x) * Mathf.Rad2Deg;
if (move.magnitude > idleThreshold)
{
transform.forward = move;
if (isIdle)
{
animator.SetTrigger("run");
isIdle = false;
}
}
else if (!isIdle)
{
animator.SetTrigger("idle");
isIdle = true;
}
}
}