如何立即扭转重力?

时间:2015-11-14 21:28:06

标签: c# unity3d interpolation

我正在制作2D游戏。我有一个立方体物体从屏幕顶部掉下来,我有管道,立方体应该通过反转重力来通过。

我的物体从屏幕顶部掉下来了。我点击屏幕以反转重力,但它不会立即向上:改变重力方向需要时间。当我点击屏幕时,我的物体继续下降,然后上升。点击屏幕时,我的动作形成了U的形状。当它上升时会发生同样的事情:我点击它向下移动,在这种情况下,我的运动形成的形状。

我想要实现的是,当我点击屏幕时,我的对象的移动即时响应。

此外,我想要某种衰减,阻尼或平滑。

我试过这些例子没有成功:

http://docs.unity3d.com/ScriptReference/Vector2.Lerp.html

http://docs.unity3d.com/Documentation/ScriptReference/Vector3.SmoothDamp.html

这是我的代码:

public class PlayerControls : MonoBehaviour
{
     public GameObject playerObject = null;
Rigidbody2D player;

public float moveSpeed;
public float up;

Vector2 targetVelocity;



void Start()
{
    player = playerObject.GetComponent<Rigidbody2D>();

    // Set the initial target velocity y component to the desired up velocity.
    targetVelocity.y = up;
}

void Update()
{
    for (int i = 0; i < Input.touchCount; i++)
    {
        Touch touch = Input.GetTouch(i);

        if (touch.phase == TouchPhase.Ended && touch.tapCount == 1)
        {
            // Flip the target velocity y component.
            targetVelocity.y = -targetVelocity.y;
        }
    }
}

void FixedUpdate()
{
    // Ensure if moveSpeed changes, the target velocity does too.
    targetVelocity.x = moveSpeed;

    // Change the player's velocity to be closer to the target.
    player.velocity = Vector2.Lerp(player.velocity, targetVelocity, 0.01f);
}

} 此脚本附加到下降的多维数据集。

1 个答案:

答案 0 :(得分:0)

当受到恒定力(在你的代码中,重力)的影响时,一个物体将以抛物线移动。你正在观察抛物线:U形状。为避免抛物线并获得即时响应(V形状),请勿使用力。将gravityScale代码替换为:

Vector2 velocity = player.velocity;
velocity.y = -velocity.y;
player.velocity = velocity;

这会反转速度的y分量,使玩家向上移动。

您还提到过想要解决这个问题。我建议添加另一个变量:目标速度。

要实现此功能,请将Vector2 targetVelocity添加到您的组件。然后,在每个FixedUpdate期间,您可以从当前速度向目标速度进行插值,以逐渐改变速度。在当前代码中替换此行:

player.velocity = new Vector2(moveSpeed, player.velocity.y);

有了这个:

player.velocity = Vector2.Lerp(player.velocity, targetVelocity, 0.01f);

这将慢慢地将速度改变为与目标速度相同,从而平滑运动。 0.01f是旧速度与玩家速度设定的新速度之间的位置。选择较大的数字可以更快地进行插值,选择较小的数字可以更慢地更改方向。

然后,点击屏幕时,不要更改velocity,而是更改targetVelocity。确保x的{​​{1}}组件等于targetVelocity,否则对象根本不会水平移动!

结合这两项更改,moveSpeedStart方法应与此类似:

FixedUpdate

请注意,您不应在void Start() { player = playerObject.GetComponent<Rigidbody2D>(); // Set the initial target velocity y component to the desired up velocity. targetVelocity.y = up; } void Update() { for (int i = 0; i < Input.touchCount; i++) { Touch touch = Input.GetTouch(i); if (touch.phase == TouchPhase.Ended && touch.tapCount == 1) { // Flip the target velocity y component. targetVelocity.y = -targetVelocity.y; } } } void FixedUpdate() { // Ensure if moveSpeed changes, the target velocity does too. targetVelocity.x = moveSpeed; // Change the player's velocity to be closer to the target. player.velocity = Vector2.Lerp(player.velocity, targetVelocity, 0.01f); } 中使用Input,因为每帧都会更新输入,FixedUpdate每帧可能会运行多次。这可能导致输入被读取两次,特别是如果帧速率变慢并且固定更新更可能需要每帧运行多次。