[英]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;
}
}
如果有幫助,這就是我所做的:
不能保證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.