Unity3d中C#代码Animator.SetFloat无响应问题求助
问题解决:Animator.SetFloat无响应但Debug.Log正常
核心问题出在Move()函数的执行顺序上:不管触发了Walk还是Run逻辑,之后都会无条件调用Idle(),把speed参数立刻重置为0,直接覆盖了Walk/Run里的设置——这就是动画没反应的原因,而Debug.Log因为在Walk/Run里先执行,所以能正常输出。
修改方案
把Idle()的调用改成仅在没有移动输入时触发,放在else分支里:
if (isGrounded) { if (Input.GetKeyDown(KeyCode.Space)) Jump(); if (moveDirection != Vector3.zero && !Input.GetKey(KeyCode.LeftShift)) Walk(); else if (moveDirection != Vector3.zero && Input.GetKey(KeyCode.LeftShift)) Run(); else // 仅无移动输入时触发Idle Idle(); moveDirection *= moveSpeed; }
额外优化建议
- 不要直接用
moveDirection != Vector3.zero判断输入:Input.GetAxis()返回平滑值,可能存在极小非零值,建议用Mathf.Abs(moveZ) > 0.1f这类阈值判断,避免误触发。 - 确认Animator控制器里的参数名称和代码里的
"speed"完全一致(大小写敏感),从截图看参数存在,但仍需核对拼写。
修正后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { [SerializeField] private float moveSpeed; [SerializeField] private float walkSpeed; [SerializeField] private float runSpeed; [SerializeField] private float groundCheckDistance; [SerializeField] private float gravity; [SerializeField] private bool isGrounded; [SerializeField] private LayerMask groundMask; [SerializeField] private float jumpHeight; private Vector3 moveDirection; private Vector3 velocity; private CharacterController controller; private Animator anim; void Start() { controller = GetComponent<CharacterController>(); anim = GetComponentInChildren<Animator>(); } void Update() { Move(); } private void Move() { isGrounded = Physics.CheckSphere(transform.position, groundCheckDistance, groundMask); if(isGrounded && velocity.y < 0) velocity.y = -2f; float moveZ = Input.GetAxis("Vertical"); // 用阈值判断有效输入 bool hasMoveInput = Mathf.Abs(moveZ) > 0.1f; moveDirection = new Vector3(0, 0, moveZ); moveDirection = transform.TransformDirection(moveDirection); if (isGrounded) { if (Input.GetKeyDown(KeyCode.Space)) Jump(); if (hasMoveInput && !Input.GetKey(KeyCode.LeftShift)) Walk(); else if (hasMoveInput && Input.GetKey(KeyCode.LeftShift)) Run(); else Idle(); moveDirection *= moveSpeed; } controller.Move(moveDirection * Time.deltaTime); velocity.y += gravity * Time.deltaTime; controller.Move(velocity * Time.deltaTime); } private void Idle() { anim.SetFloat("speed", 0); } private void Walk() { anim.SetFloat("speed", 0.5f); moveSpeed = walkSpeed; Debug.Log("Walk"); } private void Run() { moveSpeed = runSpeed; Debug.Log("Run"); anim.SetFloat("speed", 1); } private void Jump() { velocity.y = Mathf.Sqrt(jumpHeight * -2 * gravity); isGrounded = false; } }
内容的提问来源于stack exchange,提问作者Daniil Galitskii
相关产品推荐
相关产品推荐

