我正在制作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);
}
} 此脚本附加到下降的多维数据集。
答案 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
,否则对象根本不会水平移动!
结合这两项更改,moveSpeed
和Start
方法应与此类似:
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
每帧可能会运行多次。这可能导致输入被读取两次,特别是如果帧速率变慢并且固定更新更可能需要每帧运行多次。