C# Unity 3D拖动碰撞

C# Unity 3D拖动碰撞,c#,unity3d,game-physics,C#,Unity3d,Game Physics,我试图做一个游戏,你拖动不同类型的球体,把它们放在一起形成一个图形(没有任何重力)。对于拖动对象,我使用以下脚本: using UnityEngine; using System.Collections; public class Test : MonoBehaviour { void OnMouseDrag() { float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.tra

我试图做一个游戏,你拖动不同类型的球体,把它们放在一起形成一个图形(没有任何重力)。对于拖动对象,我使用以下脚本:

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

    }

}

当我将两个球体相互拖动时,它们会相互穿过。我在对象中添加了一个刚体,尝试了很多不同的东西,但似乎没有任何效果。它们似乎总是相互反弹,或者根本不碰撞。有解决办法吗?想象一下,这就像一个人跑进了一堵墙。人不会从墙上弹下来,他只是停止移动。

之所以会出现一些奇怪的行为(对象相互剪切/忽略),是因为你直接设置了
transform.position
,而不是操纵对象的
刚体
组件。使用
Rigidbody.MovePosition()
在定位对象时也要考虑物理因素

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

综上所述,您的课程可能会如下所示:

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;
    }
}
公共类测试:单一行为{
刚体rb;
void Start()
{
//存储对附着刚体的引用
rb=GetComponent();
}
void OnMouseDrag()
{
浮动距离=Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
//按刚体移动,而不是直接变换
rb.MovePosition(Camera.main.ScreenToWorldPoint)(新矢量3(Input.mousePosition.x,Input.mousePosition.y,屏幕到屏幕的距离));
}
无效碰撞中心(碰撞柱)
{
//碰撞冻结
rb.iskinetic=true;
}
}

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

当以非增量方式直接给出位置变量坐标时,对象将在下一个位置“逐步”存在,从而愚弄碰撞系统

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

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

职位=


position=lerp(旧位置、新位置、时间、deltaTime)

将刚体更改为动力学?@ukaszMotyczka我已经尝试过了,它们都漂浮在空中。非常感谢,我回家后会尝试。拖动对象效果很好,就像以前一样。只有碰撞根本不起作用。编辑:没有什么真正改变。EDIT2:在我碰撞它们的第一秒钟,它就起作用了。在那之后,他们进入了eachother@BelgianWizard您是否打算在初始碰撞后完全冻结对象(即忽略所有物理和任何进一步的鼠标拖动)?或者,即使它停止运行,您仍然希望它可以拖动吗?(如果是后一种情况,那么您的实现可能必须进行重大更改。)我们已经让它开始工作了,但我们仍然有一个小问题。你有时间用Skype这样的第三方软件聊天吗?我可以私下把我的用户名发给你。编辑:我如何进行PM?@BelgianWizard抱歉,我目前无法访问类似的内容。不过,我们可以使用StackOverflow聊天室。(此网站上没有PM功能。)您可以编辑您的帖子。不要在评论部分继续回答。