Unity 3D OnMouseDrag碰撞

Bel*_*ard 0 c# unity-game-engine 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 ));

    }

}
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*ite 6

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

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

把这一切结合在一起,你的课可能看起来像:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!如果您有任何疑问,请告诉我.