我有这个杯子,里面有球。全二维 我正在使用 Rigidbody2d 和 Collider2d。
当统一运行并移动杯子(用箭头键)时,球留在杯子内。我还为 Android 触摸添加了拖动运动来移动杯子。
问题是,当杯子移动得太快(通过拖动)时,球会从杯子碰撞器中掉落(使用 Polygon colider 2d)。
移动代码是:
public float speed = 0.1F;
void Update() {
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved) {
Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;
transform.Translate(-touchDeltaPosition.x * speed, -touchDeltaPosition.y * speed, 0);
}
}
我尝试使用速度参数,但它并没有真正的帮助。如果杯子移动太慢,对我来说就不太有用。 我相信这与球或杯子的速度/力有关,这使得杯子碰撞器错过了......
任何对此的帮助将不胜感激!
因为你是通过改变杯子的位置来移动它的,这意味着当你快速移动它时,它会消失,并重新出现在你拖动它的地方,留下球,然后它们就会掉下来。我也遇到过同样的情况,我的物体会穿过墙壁并离开相机区域。我通过使用 AddForce 解决了这个问题。这会使杯子逐个位置移动到您拖动的位置。这会推动球前进,并将它们留在杯子中。我猜这就是正在发生的事情。如果您使用速度,则可以。
您可以找到指向您想要移动到的位置的向量,而不是进行变换。
var direction = touchDeltaPosition - transform.position;
gameObject.rigidbody2D.velocity.x = direction.x * speed;
gameObject.rigidbody2D.velocity.y = direction.y * speed;
希望这能解决问题
问题是,当您移动杯子太快时,在第 1 帧,球在杯子内部,但在第 2 帧,球在杯子外部。您可以减小“固定时间步长”的值(http://docs.unity3d.com/Manual/class-TimeManager.html)以增加物理计算的频率,或使碰撞器更大。
如果杯子里的球总是留在杯子里,也许你可以在球进入杯子后关闭它的物理特性,或者类似的东西。
通常,translate.Translate() 在处理碰撞体时效率不是很高,相反,您可以尝试其他三种解决方案: 1)rigidbody2D.AddForce(Vector2.Up * Input.GetAxis(“垂直”)); 2)rigidbody2D.velocity = new Vector2(//写你需要的); 3)我认为处理碰撞和拖动的最佳解决方案是:MoveRigidbody2D
嗯,这对我有用:
var newVec = new Vector2 (transform.position.x, transform.position.y);
var touchDeltaPosition = Input.GetTouch(0).deltaPosition*touchSpeed;
var direction = touchDeltaPosition- newVec;
rigidbody2D.AddForce(direction);