Unity 3D OnMouseDrag碰撞

时间:2016-03-31 16:21:43

标签: c# unity3d game-physics

我正在尝试制作一个游戏,您可以拖动不同类型的球体并将它们组合在一起形成一个图形(没有任何重力)。为了拖动对象,我使用这个脚本:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

    void OnMouseDrag()
    {
        float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
        transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen ));

    }

}

当我将两个球体相互拖动时,它们会相互交叉。我为这些物品添加了一个装饰物,用它尝试了很多不同的东西,但似乎没有任何效果。他们似乎总是互相反弹,或者根本不碰撞。对此有任何解释?想象一下这就像一个人跑到墙上。这个人没有从墙上弹开,他只是停止了移动。

2 个答案:

答案 0 :(得分:6)

您获得某些奇怪行为(对象剪切/忽略对方)的原因是您直接设置transform.position,而不是操纵Rigidbody组件物体。在定位对象时,使用Rigidbody.MovePosition()也会考虑物理。

现在,看到物体彼此反弹并不是一种异常的物理行为 - 这是因为当物体彼此夹在一起时(就像它们经常用你的代码那样),它们会相互施加排斥力(有点像牛顿第三定律)。如果您想在碰撞后立即冻结它们,请尝试在Rigidbody.isKinematic = true事件中设置OnCollisionEnter()

将所有这些结合在一起,你的课程可能会像:

public class Test : MonoBehaviour {

    Rigidbody rb;

    void Start()
    {
        // Store reference to attached Rigidbody
        rb = GetComponent<Rigidbody>();
    }

    void OnMouseDrag()
    {
        float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;

        // Move by Rigidbody rather than transform directly
        rb.MovePosition(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen )));
    }

    void OnCollisionEnter(Collision col)
    {
        // Freeze on collision
        rb.isKinematic = true;
    }
}

希望这有帮助!如果您有任何问题,请告诉我。

答案 1 :(得分:0)

当以非增量方式直接提供位置变量坐标时,该对象将“移相”到下一个位置,以欺骗碰撞系统。

您必须通过某种其他系统以递增方式移动对象来对其进行编码:

不是像这样直接移动对象:

position =

像这样

position = lerp(oldPosition ,, Time.deltaTime)