簡體   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