如何阻止角色在脚本中无限跳跃?

问题描述

这是用来控制角色移动的移动脚本。这取决于他的github上的Brackeys 2d控制器脚本,因此,如果那是问题所在,那么您应该可以查看它,但是因为我相信问题出在此脚本的某个地方。

我决定展示这个。 我的角色可以反复跳跃,我不知道问题出在哪里,所以我将不胜感激。

public CharacterController2D controller;
 public Animator animator;
 public float runSpeed = 40f;
 float horizontalMove = 0f;
 bool jump = false;

 void Update()
 {
     horizontalMove = Input.GetAxisRaw("Horizontal") * runSpeed;
     animator.SetFloat("speed",Mathf.Abs(horizontalMove));
     
     if (Input.GetButtonDown("Jump"))
     {
         jump = true;
         animator.SetBool("IsJumping",true);      
     } 
 }
 
 public void OnLanding()
 {
     animator.SetBool("IsJumping",false);
     jump = false;
 }
 

  void FixedUpdate()
 {
     controller.Move(horizontalMove * Time.fixedDeltaTime,crouch,jump);
     jump = false;
     
 }

解决方法

如果满足两个条件,

OnLanding显然将停止跳转动画:

  1. 将调用OnLanding。看来这是要在事件上使用的。无论哪种方式,您都可以设置一个断点并附加到Unity。如果您从未达到断点,那么您将知道从未调用过OnLanding
  2. 另一个条件是您的动画状态机已正确设置。尤其是,无论计算机处于哪种动画状态,都必须允许bool更改以触发向另一个动画状态的转换。
,

我相信您的问题是,从未调用过OnLanding()函数。仅在将动画事件添加到跳跃动画剪辑的某一点时,它才起作用。 您知道如何调用OnLanding动画事件吗?

此链接中有一个非常好的动画事件教程。 https://docs.unity3d.com/Manual/script-AnimationWindowEvent.html

基本上,此动画事件应插入到跳转动画结尾附近的某个位置。仅当首先正确连接了跳转和着陆动画剪辑之间的过渡时,这才起作用。假设您已这样做,则可以插入此动画事件,也可以尝试其他方法(更有效,但更难一点)。

物理重叠法:

第二种方法要求您使用一个名为Grounded的bool变量,而不是bool变量jump。(我知道它们都是布尔值,但用途不同)。在这里,您可以初始化一个内置的名为overlaycircle()的函数的bool变量。此函数将要求您声明要在手之前声明的其他三个局部变量:layermask,radius和point。

从此处开始,如果扎根等于true,则可以确保条件语句包含附加条件。

有关基于层的冲突检测的更多信息,请阅读此文档

https://docs.unity3d.com/Manual/LayerBasedCollision.html

如果我说的话不清楚的话,随时可以问其他问题。