c#Unity Jump问题

时间:2013-06-21 23:08:41

标签: c# unity3d bounce

我是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;
            }
        }
    }
}

示例图片:

enter image description here  请忽略阴影,因为它现在无法正常工作。

TLDR;当相对于固定的摄像机位置移动时,使Keypress上的物体跳跃和下降的最佳方法是什么?

2 个答案:

答案 0 :(得分: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;
        }
    }
}

如果你的地形不平整,你应该使用物理碰撞器或光线投射来知道什么时候停止下降。

答案 1 :(得分: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; }
        }
    }
}