问题描述
这是用来控制角色移动的移动脚本。这取决于他的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
显然将停止跳转动画:
- 将调用
OnLanding
。看来这是要在事件上使用的。无论哪种方式,您都可以设置一个断点并附加到Unity。如果您从未达到断点,那么您将知道从未调用过OnLanding
。 - 另一个条件是您的动画状态机已正确设置。尤其是,无论计算机处于哪种动画状态,都必须允许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
如果我说的话不清楚的话,随时可以问其他问题。