繁体   English   中英

统一运动

[英]Smooth movement in unity

我开始学习团结,面临一个无法解决的问题,那就是:但是无论FPS有多高或有多少不同,我都试图使动作平滑而不像通常的视频游戏那样我尝试实现逻辑的方法。

我尝试使用固定的更新和固定的增量时间,但似乎没有什么不同。

void Update()
{

    movement = Input.GetAxis("Horizontal");
    if ((movement > 0 && lookingLeft) || (movement < 0 && !lookingLeft))
    {
        lookingLeft = !lookingLeft;
        transform.localScale = new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
    }
    if (noOfJumps > 0 || jumping)
        jumpInput = Input.GetAxis("Jump");
    if (jumpInput > 0 && !jumping)
    {
        pressTime = 0;
        jumping = true;
        noOfJumps--;

    }
    else if (jumpInput == 0)
        jumping = false;
    else
        pressTime += Time.deltaTime;

    if (pressTime > 0.15f)
        jumpInput = 0;

}

private void FixedUpdate()
{
    rd.velocity = Vector2.Lerp(rd.velocity, new Vector2(movement != 0 ? speed *
    movement * Time.fixedDeltaTime : rd.velocity.x * 0.95f, (jumpInput != 0) ? jumpInput * jumpSpeed * Time.fixedDeltaTime : -1), 0.9f);
}

直接分配速度可以覆盖每帧某些计算。 最好使用AddForce以避免由于重力和摩擦而造成的重大变化。

Input.GetAxis放入movement的平滑为您做平滑。 只需将该值乘以速度即可获得新的水平速度。

另外,您正在更改速度,因此不需要将速度字段乘以Time.fixedDeltaTime

private void FixedUpdate()
{
    float newVerticalVelocity = rd.velocity.y + jumpInput * jumpSpeed;
    Vector2 velocityChange =   newVerticalVelocity * Vector2.up 
                             + movement * speed * Vector2.right 
                             - rd.velocity;
    rd.AddForce(velocityChange, ForceMode.VelocityChange);
}

我认为问题在于您从用户那里获得输入的方式。

如果您使用Input.GetAxis(“ Horizo​​ntal”),它将为您提供一个介于-1和1之间的值,并且该值与玩家按下按钮的强度或持续时间成比例。

尝试使用.GetAxisRaw()而不是.GetAxis() ,这样您将仅获得值-1或1,具体取决于播放器的移动方向,这将导致更快速的移动

 movement = Input.GetAxisRaw("Horizontal");

观看有关主题的此视频

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM