繁体   English   中英

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

[英]My character sometimes fails to jump - Unity2D

因此,我在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

不能保证Update和FixedUpdate每次都发生。 我还没有遇到过此类错误,所以不能肯定地说,但是您可能会遇到一种情况,即您的接地状态不正确。 不用每次将此值保存为字段,而是尝试在每次需要时都对其进行检查-至少在Update和FixedUpdate中进行单独检查。

以Max的答案为基础...

您应该将FixedUpdate()用于物理操作,例如对RigidBody施加力,使其RigidBody运行50次,而不管游戏的运行速度如何。 这使其独立于帧速率

请参阅文档

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

该视频很好地解释了两者之间的差异。

评论中的链接也正确:

您需要从Update函数中调用此函数,因为状态会在每帧中重置

因此,仅当玩家按下跳转时才检查是否接地,因为射线/线路广播的计算量FixedUpdate() ,请在FixedUpdate()应用物理FixedUpdate() ,并在Update()检查输入。

输入应该在Update中处理,因为update运行在每一帧,而固定更新不像update一样,它也不是运行在每一帧,所以当在固定更新中处理输入时,它可能会错过输入并且不会跳转! 我建议您剪切并粘贴所有从固定更新到更新的输入代码!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM