You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:10:35