为什么球员的弹跳不稳定?

本文关键字:不稳定 为什么 | 更新日期: 2023-09-27 18:02:40

我对Unity很陌生,所以我的做法可能不是最好的方法,但是当角色跳跃时,它是不一致的。

有些反弹比其他反弹要远得多,我不确定为什么会发生这种情况。

如果我快速按下向上的箭头,立方体会跳得很远,但如果我等几秒钟,它会像正常情况一样弹跳。

下面是我的代码:
using UnityEngine;
using System.Collections;
public class MovePlayer : MonoBehaviour
{   
    Vector3 endPos;
    int numBackwards = 0;
    bool jumping = false;
    public Rigidbody rigidBody;
    //public Collider theCollider;
    void Start()
    {
        rigidBody = GetComponent<Rigidbody> ();
    }
    // Update is called once per frame
    void Update()
    {
        rigidBody.freezeRotation = true;
        endPos = gameObject.transform.position;
        if (!jumping)
        {
            if (Input.GetButtonDown("up") && gameObject.transform.position == endPos) {
                if (numBackwards < 0)
                {
                    numBackwards++;
                } 
                else
                {
                    UpdateScore.score++;
                }
                transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
                transform.Translate(Vector3.forward * 110 * Time.deltaTime, Space.World);
            } 
            else if (Input.GetButtonDown("down") && gameObject.transform.position == endPos)
            {
                transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
                transform.Translate(-Vector3.forward * 110 * Time.deltaTime, Space.World);
                numBackwards--;
            }
            else if (Input.GetButtonDown("left") && gameObject.transform.position == endPos)
            {
                transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
                transform.Translate(Vector3.left * 110 * Time.deltaTime, Space.World);
            }
            else if (Input.GetButtonDown("right") && gameObject.transform.position == endPos)
            {
                transform.Translate(Vector3.up * 50 * Time.deltaTime, Space.World);
                transform.Translate(Vector3.right * 110 * Time.deltaTime, Space.World);
            }
        }
    }
    void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.CompareTag("Ground"))
            jumping = false;
    }
    void OnCollisionExit(Collision other)
    {
        if (other.gameObject.CompareTag("Ground"))
            jumping = true;
    }
}

为什么球员的弹跳不稳定?

不是平移对象,而是利用刚体的能力给它添加一个力。我还用一种更简单的方式替换了碰撞事件。它检查物体中心和地面之间的距离。(显然你仍然可以用你的方式)。fixeduupdate确保代码将被定期调用,而不是依赖于帧速度。(更多关于这个话题在这里)

//PUBLIC
public float distance;      
public float fspeed;
public float uspeed;
//PRIVATE
private Rigidbody rigidBody;

void Awake()
{
    rigidBody = GetComponent<Rigidbody>();
    rigidBody.freezeRotation = true;
}
void FixedUpdate()
{
    if (Physics.Raycast(transform.position, -Vector3.up, distance + 0.1F))
    {
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            rigidBody.AddForce(new Vector3(0, uspeed, fspeed));
        }
        if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            rigidBody.AddForce(new Vector3(0, uspeed, -fspeed));
        }
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            rigidBody.AddForce(new Vector3(fspeed, uspeed, 0));
        }
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            rigidBody.AddForce(new Vector3(-fspeed, uspeed, 0));
        }
    }
}

public float distance

是到地面的最小距离,直到你可以再次跳跃


public float fspeed

是前进或侧向速度(跳跃距离)


public float uspeed

为向上速度(跳跃高度)