0

我是 C# 编程新手。

我在一个平面上有一个球体刚体。

我想在按下空格键时让这个球体跳跃,然后在松开键时再次弹跳两次。

这并不总是在平面上,它有时会在一个物体上,我希望反弹的高度能够反映从初始跳跃时下降的距离。

我目前有一个相机从一侧面向球体,并让它从设定的距离跟随球。球体可以向任何方向移动,但相机始终保持在同一侧并与球体保持一定距离。

问题是我的代码目前说(据我所知)如果未按下空格键,请尝试将球体的 Y 位置向下移动,然后如果按下空格键,则使球体跳跃,然后在空格键释放时返回。

这段代码的编写方式使我的飞机跳跃,因为当没有按下空格键时,球不断地弹到飞机上,但如果我把那部分拿出来,球就不会掉下来。

示例代码:

public class RollAdvancedScript : MonoBehaviour 
{   
    public Transform camera;
    public float posY;

    void lol()
    {
        posY =  transform.position.y;
    }

    void Update() 
    {
       if (Input.GetKey(KeyCode.D))
        { 
            Vector3 vectorToUse = camera.right;
            vectorToUse.y = 0;
            transform.position += vectorToUse * Time.deltaTime * 5;
        }
        if (Input.GetKey(KeyCode.A))
        { 
            Vector3 vectorToUse = -camera.right;
            vectorToUse.y = 0;
            transform.position += vectorToUse * Time.deltaTime * 5;
        }
        if (Input.GetKey(KeyCode.S))
        { 
            Vector3 vectorToUse = -camera.forward;
            vectorToUse.y = 0;
            transform.position += vectorToUse * Time.deltaTime * 5;
        }
        if (Input.GetKey(KeyCode.W))
        { 
            Vector3 vectorToUse = camera.forward;
            vectorToUse.y = 0;
            transform.position += vectorToUse * Time.deltaTime * 5;
        }
        if (Input.GetKey(KeyCode.Space))
        {
            Vector3 vectorToUse = camera.up;
            transform.position += vectorToUse * Time.deltaTime * 10;    
        }
        else
        {   
            if ( posY >= 0) 
                {Vector3 vectorToUse = camera.up;
                transform.position -= vectorToUse * Time.deltaTime * 10;
                }
                else
            {
                Vector3 vectorToUse = camera.up;
                vectorToUse.y = 0;
                transform.position -= vectorToUse * Time.deltaTime * 10;
            }
        }
    }
}

示例图像:

在此处输入图像描述 请忽略阴影,因为它现在不能正常工作。

TLDR;相对于固定相机位置移动时,使物体在 Keypress 上弹跳和下落的最佳方法是什么?

4

2 回答 2

3

你想在动画或物理学中处理这个问题吗?查看代码,它看起来像纯控制器动画,所以我建议您明确跟踪您的跳转状态,而不是仅使用 y > 0 检查每次更新。如果您知道对象的状态,就更容易看到发生了什么。

您的代码使它看起来像您在点击空格时弹出 (10 * deltaTime) ,然后立即弹出 10 直到您低于零。您是否希望玩家保持空间飞行,喷气背包式?否则,您应该给出一个初始冲动,然后从中减去以平稳下降。

这是一个非常简单的例子。向上向量是世界向上的(不是您的示例中的相机向上),但如果您的相机没有滚动,结果将是相同的。

public class DoJump : MonoBehaviour {

    public float JumpSpeed = .25f;
    public bool Jumping;
    Vector3 jumpVec;

    void Start () {
    Jumping = false;
    }

    void Update () {

        if (Jumping)
        {
            transform.position += jumpVec * Time.deltaTime;
            jumpVec += (Vector3.down * Time.deltaTime);
            //accelerate downward one unit per second per second                           
        }
        else
        {
            if (Input.anyKeyDown)
            {
                Jumping = true;
                jumpVec = Vector3.up * (JumpSpeed * Time.SmoothDeltaTime);
                // impulse up @ jumpSpeed units per second
            }
        }
    }

    void LateUpdate()
    {
        if (transform.position.y < 0)
        {
            transform.position = new Vector3(transform.position.x, 0, transform.position.z);
            Jumping = false;
        }
    }
}

如果您将遇到不平坦的地形,您可能应该使用物理对撞机或光线投射来知道何时停止坠落。

于 2013-06-22T06:04:09.187 回答
1

这是我的代码,希望对你有帮助:

public class Player : MonoBehaviour
{ 
    public float m_gravity=10f;          
    void Jump()
    {
        if (m_ch.isGrounded) //this is the point
        {
            m_Gravity = 10;
            if (Input.GetKeyDown(KeyCode.Space))
            {
                m_Gravity = -8;
            }
        }
        else
        {
            m_Gravity += 10f * Time.deltaTime;
            if (m_Gravity >= 10) { m_Gravity = 10; }
        }
    }
}
于 2016-09-27T11:07:56.050 回答