通过拖动(移动)移动对象使球从杯子落下

时间:2014-06-23 18:46:06

标签: unity3d unityscript

我的杯子里面装着球。全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);
        }
    }

我尝试使用速度参数,但它并没有真正帮助。如果杯子运动太慢,对我来说不是很有用。 我相信它与球或杯子的速度/力量有关,这使得杯子对撞机错过了......

对此的任何帮助都将非常感激!

4 个答案:

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