【问题标题】:How can i get it so i dont have my character infinitely jump?我怎样才能得到它,这样我的角色就​​不会无限跳跃?
【发布时间】:2020-02-06 09:43:09
【问题描述】:

这是我到目前为止编写的代码,它使玩家控制的角色能够持续跳跃,我只希望他们能够在地面上跳跃。

void Update()
    {
        this.transform.Translate(Input.GetAxis("Horizontal"), 0, 0);
        xdirectionMovement = Input.GetAxis("Horizontal") * runspeed; //GetAxisRaw("Horizontal") 

        if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space))  //makes player jump
        {
            GetComponent<Rigidbody2D>().AddForce(jumpdistance, ForceMode2D.Impulse);

【问题讨论】:

  • 添加检查以查看它们是否在地面上。
  • C# 不是 UnityScript。 UnityScript 不是 C#。
  • 未设置为 unityscript 这是我用来编码的 Visual Studio

标签: c# unity3d


【解决方案1】:

确保您只允许在角色接地时跳跃。一种检查方法是使用向下光线投射并查看命中是否低于某个阈值:

void Update()
{
    print(IsGrounded());
}

bool IsGrounded()
{
    const float distanceToGround = 1f;
    return Physics.Raycast(
        transform.position, -Vector3.up, distanceToGround) != null;
}

另一个是使用 CharacterController 组件并检查它的布尔值:

CharacterController controller = null;

void Start()
{
    controller = GetComponent<CharacterController>();
}

void Update()
{
    print(controller.isGrounded);
}

另外一种是监听碰撞事件并设置一个bool:

bool collides = false;

void FixedUpdate()
{
    print(collides);

    collides = false;
}

void OnCollisionStay(Collision collision)
{
    collides = true;
}

请注意,有时候,留出一点余地是一种很好的可用性实践,这样用户即使错过了几个像素的地面或错过了几毫秒的时间也可以跳跃。祝你好运!

【讨论】:

  • 如果 OP 想要搜索,您所说的那一点余地通常称为郊狼时间。
  • 另外,由于显示的代码使用刚体,也许最好执行 CapsuleCast 或 SphereCast 以确保在地面不平或由于某种原因有一个洞时发生碰撞地板。
【解决方案2】:

添加一个布尔值来检查玩家是否接地,添加向量和碰撞器来确定玩家相对于地面的位置。

private BoxCollider2D box;
Vector3 maxValue= box.bounds.max;
Vector3 minValue=box.bounds.minValue;
Vector2 x = new Vector2(max.x, minValue.y -0.1f);
Vector2 y = new Vector2(minValue.x, minValue.y - 0.1f);
Collider2D ground = Physics.OverlapArea(x,y);
bool jump = false;
if (ground != null)
{
    jump = true;
}

最后你可以将 bool 添加到你的 Input 中,例如,

if (Input.GetKeyDown(KeyCode.Space) && jump == true)
{
    //player jump 
}

【讨论】:

  • 如果下面的地面 y 值发生变化,这是否有效,或者必须让地面处于相同的高度才能让玩家跳跃?
  • @JamesRogers BoxCollider2D 附着在地面上,所以无论地面处于什么水平,它都可以工作。
  • @JamesRogers 实际上盒子对撞机用于检查其他对撞机(地面)以确定玩家是在空中还是在地面上
猜你喜欢
  • 2012-02-25
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多