为什么可以';我跳得不好
本文关键字:为什么 | 更新日期: 2023-09-27 18:27:33
现在我没有从中得到太多。根据我所做的不同,我要么陷入无限循环,要么跳跃能力差。我用计时器勾选了我的跳跃bool,但我的跳跃能力是双倍的,我的地面探测不够好。你明白我为什么跳不起来,或者跳得不好吗?
using UnityEngine;
using System.Collections;
public class player : MonoBehaviour
{
public float speed = 0.05f;
public float jumpVelocity = 0.05f;
public bool onGround = true;
public bool jumped = false;
// Use this for initialization
void Start () { }
// Update is called once per frame
void Update ()
{
//test if player is on the ground
if (onGround) { jumped = false; }
// USER CONTROLS HERE.
if (Input.GetKeyDown(KeyCode.Space) && onGround == true)
{
jumped = true;
while(jumped)
{
this.rigidbody2D.AddForce(new Vector2(0, jumpVelocity));
if (onGround) { jumped = false; }
}
}
else if (Input.GetKey(KeyCode.RightArrow))
{
this.transform.position += Vector3.right * speed * Time.deltaTime;
}
else if (Input.GetKey(KeyCode.LeftArrow))
{
this.transform.position += Vector3.left * speed * Time.deltaTime;
}
}
void OnCollisionEnter2D(Collision2D col)
{
if(col.gameObject.tag == "floor") { onGround = true; }
}
void OnCollisionStay2D(Collision2D col)
{
if(col.gameObject.tag == "floor") { onGround = true; }
}
}
您的问题源于对Update方法和物理原理的误解。如果你在更新方法中这样做,它将创建一个无休止的循环:
while(jumped)
{
this.rigidbody2D.AddForce(new Vector2(0, jumpVelocity));
if(onGround)
{
jumped = false;
}
}
问题是你告诉物理体加一个力。但你一次又一次地这样做。物理模拟仅在Update方法返回后发生,因此无论"地面"是什么,它都不会变为真,因为直到Update方法之后才施加力。
相反,您必须在每次Update方法运行时反复进行此检查,直到onGround为true。