我的杯子里面装着球。全2D 我正在使用Rigidbody2d和Collider2d。
当统一跑动并移动杯子(带箭头键)时,球会留在杯子内。我还添加了Android touch的拖动动作来移动杯子。
问题是当杯子移动得太快时(通过拖曳),球从杯子对撞机上落下(使用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);
}
}
我尝试使用速度参数,但它并没有真正帮助。如果杯子运动太慢,对我来说不是很有用。 我相信它与球或杯子的速度/力量有关,这使得杯子对撞机错过了......
对此的任何帮助都将非常感激!
答案 0 :(得分:1)
这是因为你通过改变杯子的位置来移动它,这意味着当你快速移动它时,它会消失,并在你拖动它的地方重新出现,将球留在后面,然后它们就会掉落。我有同样的事情,我的物体只能通过墙壁和镜头区域。我通过使用AddForce修复了这个问题。这使得杯子移动,按位置移动到您拖动的位置。这会使球碰撞,并留在杯中。这就是我猜的正在发生的事情。如果你使用适合的速度。
你可以而不是transform.Translate,你可以找到你要移动到的地方的矢量。
var direction = touchDeltaPosition - transform.position;
gameObject.rigidbody2D.velocity.x = direction.x * speed;
gameObject.rigidbody2D.velocity.y = direction.y * speed;
希望这能解决它
答案 1 :(得分:0)
问题在于,当您将杯子移得太快时,在第1帧,球在杯子内,但在第2帧它在外面。你可以减少"固定时间步长" (http://docs.unity3d.com/Manual/class-TimeManager.html)增加物理计算的频率,或使碰撞器更大。
如果杯子里的球总是留在杯子里,也许你可以在球杯中的物理状态或者沿着这些线条的东西时关闭它。
答案 2 :(得分:0)
通常,transform.Translate()在处理碰撞器时效率不高,相反,您可以尝试其他三种解决方案: 1)rigidbody2D.AddForce(Vector2.Up * Input.GetAxis(“Vertical”)); 2)rigidbody2D.velocity = new Vector2(//写下你需要的东西); 3)我认为处理对撞机和拖动的最佳解决方案是:MoveRigidbody2D
答案 3 :(得分:0)
嗯,这对我有用:
var newVec = new Vector2 (transform.position.x, transform.position.y);
var touchDeltaPosition = Input.GetTouch(0).deltaPosition*touchSpeed;
var direction = touchDeltaPosition- newVec;
rigidbody2D.AddForce(direction);