我的角色有时候无法跳跃 - Unity2D

时间:2013-12-03 10:25:03

标签: c# unity3d

所以,我在Unity中设置了一个基本脚本来移动2D精灵,它运行得很好,除了偶尔玩家角色在被告知时不会跳跃的事实。它似乎只发生在角色水平移动的同时或之后不久。我真的不知道为什么会这样。希望其他人可以对此有所了解。这是控制器脚本。任何反馈都是有帮助的,即使它与问题无关,我这样做是为了学习练习。

using UnityEngine;
using System.Collections;

public class PlayerControlsCs : MonoBehaviour {

public KeyCode walkLeft;
public KeyCode walkRight;
public KeyCode jumpUp;

public float speed = 5;
public float jumpForce = 750;
public int jumpCapacity = 1;
public int extraJumps = 0;

public bool facingRight = true;
public bool grounded = false;
private Transform groundCheck;
private Animator anim;

void Awake () {
    groundCheck = transform.Find("GroundCheck");
    anim = GetComponent<Animator>();
}

void Update () {
    grounded = Physics2D.Linecast(transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Terrain"));

    if(grounded){
        anim.SetTrigger("Grounded");
        anim.ResetTrigger("Falling");
        extraJumps = jumpCapacity;
    }
    else {
        anim.ResetTrigger("Grounded");
        anim.SetTrigger("Falling");
    }

}

void FixedUpdate () {
    anim.SetFloat("Speed", Mathf.Abs(rigidbody2D.velocity.x));
    anim.SetFloat("Ascent", rigidbody2D.velocity.y);

    if(Input.GetKey(walkLeft))
    {
        if(facingRight){
            Flip();
        }
        rigidbody2D.velocity = new Vector2(-speed, rigidbody2D.velocity.y); 
    }
    else if(Input.GetKey(walkRight))
    {
        if(!facingRight){
            Flip();
        }
        rigidbody2D.velocity = new Vector2(speed, rigidbody2D.velocity.y);  
    }
    else
    {
        rigidbody2D.velocity = new Vector2(0, rigidbody2D.velocity.y);  
    }

    if(Input.GetKeyDown(jumpUp) && grounded)
    {
        anim.SetTrigger("Jump");

        rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, 0);

        rigidbody2D.AddForce(new Vector2(0f, jumpForce));
    }
    else if(Input.GetKeyDown(jumpUp) && extraJumps > 0) 
    {
        anim.SetTrigger("Jump");

        rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, 0);

        rigidbody2D.AddForce(new Vector2(0f, jumpForce));

        extraJumps -= 1;
    }

}

void Flip ()
{
    // Switch the way the player is labelled as facing.
    facingRight = !facingRight;

    // Multiply the player's x local scale by -1.
    Vector3 theScale = transform.localScale;
    theScale.x *= -1;
    transform.localScale = theScale;
}
}

如果它有帮助,这就是我所做的:

https://www.dropbox.com/s/ka4vgc0s0205sbd/test.html

https://www.dropbox.com/s/40i8kltwfz1jgyu/test.unity3d

3 个答案:

答案 0 :(得分:1)

更新和FixedUpdate不保证每次都会发生。我没有碰到这种错误,所以我不能肯定地说,但你可能会遇到你的基础状态不正确的情况。不要将此值保存为字段,而是在每次需要时尝试检查它 - 至少在Update和FixedUpdate中单独检查。

答案 1 :(得分:0)

以Max的回答为基础......

你应该使用FixedUpdate()作为物理内容,例如对RigidBody施加一个力,因为它每秒运行50次,无论游戏运行的速度有多快。这使得帧速率无关

请参阅the documentation

Update()每帧运行一次,因此依赖于帧速率。在这里,大多数非物理学的东西应该去,例如检查输入。

This video是对差异的一个很好的解释。

评论中的链接也是正确的:

  

你需要从Update函数调用这个函数,因为   每个帧重置状态

因此,只有当玩家按下跳转时才检查是否接地,因为光线/线路广播的计算成本很高,在FixedUpdate()中应用物理,并检查Update()中的输入。

答案 2 :(得分:0)

输入应该在更新中进行处理,因为更新会在每一帧运行,而固定更新不像更新,并且它不会每帧都运行,所以当输入在固定更新中被处理时,它可能会错过输入和它不会跳! 我建议你将固定更新中的所有输入代码剪切并粘贴到更新!