2014-06-23 17 views
0

我有這個杯子裏面含有球。全部2D 我正在使用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); 
     } 
    } 

我試圖用速度參數玩,但它不會真正的幫助。如果杯子運動太慢,對我來說不是很有用。 我相信這是相關的球或杯的速度/力,使杯子對撞機錯過...

任何幫助,將不勝感激!

回答

1

這是因爲你通過改變杯子的位置來移動它,這意味着當你快速移動它時,它會消失,並且重新出現在你拖動它的地方,把球留下,然後落下。我有同樣的東西,我的物體會穿過牆壁並進入相機區域。我通過使用AddForce修復了這個問題。這使杯子移動,按位置放置在你拖動的位置。這碰撞了球,他們留在杯子裏。這是我猜想的。如果你使用速度,將工作。

你可以不用transform.Translate,你可以找到你想要移動到的地方。

var direction = touchDeltaPosition - transform.position; 
gameObject.rigidbody2D.velocity.x = direction.x * speed; 
gameObject.rigidbody2D.velocity.y = direction.y * speed; 

希望這能解決它

+0

嗨,謝謝你的答覆。所以我應該使用AddForce或Velocity?你也可以使用 – Dror

+0

,各有其優點。我喜歡速度,因爲我習慣這樣想。但AddForce同樣好,可能更簡單。 – user3183542

+0

gameObject.rigidbody2D.AddForce(direction); – user3183542

0

問題是,當你移動杯子的速度太快時,在第1幀時,球在杯內,但在第2幀時,它在外面。您可以降低「固定時間步長」()的值以增加物理計算的頻率,或增大碰撞器。

如果杯子中的球始終留在杯子中,也許你可以關閉杯子中的物理特性,或者沿着這些線條關閉。

+0

你好,感謝您的答覆。我嘗試將多邊形更改爲3個更寬的盒子對撞機,並且仍然落下球。我試圖減少固定時間步,也許它確實有一點幫助,但球仍然下降..這是越來越沮喪... – Dror

0

通常transform.Translate()在處理碰撞體時效率不高,您可以嘗試其他三種解決方案: 1)rigidbody2D.AddForce(Vector2.Up * Input.GetAxis(「Vertical」)); 2)rigidbody2D.velocity = new Vector2(//寫下你所需要的); 3)我認爲處理對撞機和拖動的最佳解決方案是:MoveRigidbody2D

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);