为什么可以';我跳得不好

本文关键字:为什么 | 更新日期: 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。