我测试过了这个剧本导致了生理上的滞后。在我看来,它不是每0,2秒钟就叫物理,而是更少,因为这个物体下降得更慢。
这里有一个gif来演示发生了什么:紫色的没有脚本,蓝色的有脚本。

那我该怎么解决呢?
public class PlayerMovement : MonoBehaviour
{
Rigidbody2D rb;
Vector2 movement = new Vector2(0, 0);
public float movementSpeed = 10f;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
movement = new Vector2(Input.GetAxisRaw("Horizontal"), 0);
}
void FixedUpdate()
{
rb.MovePosition(rb.position + movement * movementSpeed * Time.fixedDeltaTime);
}
}发布于 2021-05-21 15:22:03
正如所说,MovePosition推翻了运动,=>不使用它,如果你想要基于物理(力)的运动和对碰撞的反应等。
您希望只对水平运动使用输入,而对垂直运动使用物理。MovePosition影响两个方向。
尝试直接设置Rigidbody.velocity
private void Update()
{
// Get the current velocity
var velocity = rb.velocity;
// Only overwrite the x velocity
// since the velocity is only applied in the FixedUpdate anyway
// there is no problem setting this already in Update
// And since it is the velocity which is already frame-rate independent
// there is no need for Time.deltaTime
velocity.x = Input.GetAxisRaw("Horizontal") * movementSpeed;
// Assign back the changed velocity
rb.velocity = velocity;
}发布于 2021-05-21 14:35:45
如果我理解您想要做的事情,那么您的代码的逻辑就有问题了。
您似乎是以垂直的方式移动,但是从水平输入中只具有vector2的x组件。
new Vector2(Input.GetAxisRaw("Horizontal"), 0);如果您所附加的GIF,对象是自由落体,因此这将是一个垂直下降,或y组件的vector2,您正在设置为0。将其想象为(x,y)或(水平移动(左/右),垂直移动(向上/向下))。
我将把上面的一行改为:
movement = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));现在可以使用垂直输入垂直移动。在MovePosition文档中提到的不会引起问题的其他事情是将您的Rigidbody2D标记为Interpolate。它是Rigidbody2D组件中标记为Interpolate的底部字段,将其从None设置为Interpolate。
对象在没有任何输入的情况下缓慢移动的原因是,在Rigidbody上仍然将Rigidbody设置为1而不是0。如果您试图使用此脚本模拟重力,请将垂直组件添加到输入向量中,并将Rigidbody上的Rigidbody字段设置为0。MovePosition正在对抗当前的重力,试图影响它。
https://stackoverflow.com/questions/67638510
复制相似问题