【问题标题】:Character animations are not playing correctly角色动画播放不正确
【发布时间】:2020-08-29 04:04:06
【问题描述】:

我刚刚开始创建我的第一个非常简单的 2D 平台游戏。在this 教程之后,我现在正在为我的角色添加移动动画(移动、奔跑、跳跃等)。一切都很完美,直到我对我的玩家移动脚本进行了编辑(按照教程的说明),这解决了玩家从蹲下动画状态返回空闲动画状态的动画问题,当蹲下键被释放但播放器仍然蹲着(由于头顶上有物体,玩家无法站起来)。在对我的代码进行修改并运行我的游戏时,玩家现在只是不断地播放/取消播放蹲伏动画,而不管玩家实际上是否处于蹲伏状态。

用于控制角色及其动作的脚本如下所示:

PlayerMovment.cs:

using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public CharacterController2D controller;
    public Animator animator;

    public float runSpeed = 100f;

    float horizontalMove = 0f;
    bool jump = false;
    bool crouch = false;
    


    // Update is called once per frame
    void Update()
    {
        // Get user input
        horizontalMove = Input.GetAxisRaw("Horizontal") * runSpeed;
        // Set animator paramaters
        animator.SetFloat("Speed", Mathf.Abs(horizontalMove));

        if (Input.GetButtonDown("Jump"))
        {
            jump = true;
            animator.SetBool("isJumping", true);
        }

        if (Input.GetButtonDown("Crouch"))
        {
            crouch = true;
            animator.SetBool("isCrouching", true);
        }
        else if (Input.GetButtonUp("Crouch"))
        {
            crouch = false;
            animator.SetBool("isCrouching", false);
        }
    }

    // Update is called a fixed amount of times per second
    void FixedUpdate()
    {
        // Move player
        controller.Move(horizontalMove * Time.fixedDeltaTime, crouch, jump);
        jump = false;
    }
    
    // Function is called when player lands
    public void OnLanding()
    {
        animator.SetBool("isJumping", false);
    }

    // Function is called whenever player crouches/uncrouches
    public void OnCrouching (bool isCrouching)
    {
        animator.SetBool("isCrouching", isCrouching); // this is the modification which was made to the code
    }
}

【问题讨论】:

  • 如果您正在学习教程,并且正确地完成了教程,您将拥有与他们相同的行为,因此,他们要么很快修复它,要么您的代码与他们的不同..
  • 你能尝试用更少的代码重现你的bug,以便更容易帮助你吗?
  • 您发布的代码过多。可能是因为你不知道问题出在哪里。可能是因为你没有调试。 You need to do that before posting.
  • 我看到的一件事是,当您在 PlayeMovement 类中调用此行“if (Input.GetButtonDown("Crouch"))”时,您不需要此行“animator.SetBool("isCrouching" , 真的);”同样在“else if (Input.GetButtonUp("Crouch"))”行之后的同一类上,您不需要“animator.SetBool("isCrouching", false);”.....原因是因为您已经是处理来自 OnCrouchEvent 的 IsCrouching 参数

标签: c# unity3d


【解决方案1】:

我发现您的问题有两个可能的原因。

所以进行以下更改:

  1. 在您的 PlayerMovement 类中,将 Update 方法更改为:

    void Update()
    {
        // Get user input
        horizontalMove = Input.GetAxisRaw("Horizontal") * runSpeed;
        // Set animator paramaters
        animator.SetFloat("Speed", Mathf.Abs(horizontalMove));
    
        if (Input.GetButtonDown("Jump"))
        {
            jump = true;
            animator.SetBool("isJumping", true);
        }
    
        if (Input.GetButtonDown("Crouch"))
        {
            crouch = true;
            //animator.SetBool("isCrouching", true); Remove this line of code
        }
        else if (Input.GetButtonUp("Crouch"))
        {
            crouch = false;
            //animator.SetBool("isCrouching", false); Remove this line of code
        }
    }
    

不需要这两行代码,因为您使用 OnCrouch 事件处理蹲伏。

  1. 确保在将 OnCrouching 事件处理程序方法添加到 Inspector 窗口中的 On Crouch 事件时,您选择了 OnCrouching 方法的 TOP 版本。 动态布尔下的那个,而不是静态参数下的那个...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多