using System.Collections; using System.Collections.Generic; using UnityEngine; public class move01 : MonoBehaviour { public float turnSpeed = 20f; Animator m_Animator; Rigidbody m_Rigidbody; Vector3 m_Movement; Quaternion m_Rotation = Quaternion.identity; void Start() { m_Animator = GetComponent(); m_Rigidbody = GetComponent(); } void FixedUpdate() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); m_Movement.Set(horizontal, 0f, vertical); m_Movement.Normalize(); float vel = Mathf.Sqrt(horizontal * horizontal + vertical * vertical); //print("m_Movement.magnitude="+ m_Movement.magnitude.ToString()); m_Animator.SetFloat("speed",vel); bool hasHorizontalInput = !Mathf.Approximately(horizontal, 0f); bool hasVerticalInput = !Mathf.Approximately(vertical, 0f); bool isWalking = hasHorizontalInput || hasVerticalInput; m_Animator.SetBool("IsWalking", isWalking); Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f); m_Rotation = Quaternion.LookRotation(desiredForward); } void OnAnimatorMove() { //1.官網方法:失敗(因為m_Animator.deltaPosition.magnitude=0) //m_Rigidbody.MovePosition(m_Rigidbody.position + m_Movement * m_Animator.deltaPosition.magnitude); //2.改良方法:令m_Animator.deltaPosition.magnitude=0.05f // m_Rigidbody.MovePosition(m_Rigidbody.position + m_Movement * 0.05f); //3.方法3:m_Animator.deltaPosition.magnitude = m_Movement * Time.fixedDeltaTime m_Rigidbody.MovePosition(m_Rigidbody.position + m_Movement * Time.fixedDeltaTime*2.5f); m_Rigidbody.MoveRotation(m_Rotation); } }