首页 > 解决方案 > 如何阻止我的角色在我的脚本中无限跳跃?

问题描述

这是为控制我的角色移动而编写的移动脚本。这取决于他的 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;
     
 }

标签: c#unity3d

解决方案


我相信您的问题是永远不会调用 OnLanding() 函数。只有在跳跃动画剪辑的某一点添加了动画事件时,它才会起作用。你知道如何调用 OnLanding 动画事件吗?

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

基本上这个动画事件应该插入到跳跃动画结束附近的某个地方。仅当您首先正确连接了跳跃和着陆动画剪辑之间的过渡时,这才有效。假设你做到了,要么插入这个动画事件,要么你可以尝试另一种方法(更有效但有点困难)。

物理重叠法:

第二种方法要求您使用名为 grounded 的 bool 变量,而不是 bool 变量 jump。(我知道它们都是布尔变量,但它们的用途不同)。从那里您可以初始化基于名为overlapcircle() 的内置函数的bool 变量。此函数将要求您声明您将事先声明的其他三个局部变量:图层蒙版、半径和点。

从那里,您可以确保您的条件语句包含一个附加条件(如果接地等于真)。

有关基于层的碰撞检测的更多信息,请阅读本文档

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

如果我说的话似乎不清楚,请随时提出任何问题。


推荐阅读