统一。禁用碰撞物理但有碰撞方法调用

Unity. Disable collision physics but have method for collision called

基本上,我有玩家对象和其他一些对象。目前他们都有 RigitBody2D 和碰撞器,用于创建的代码:

        obj = new GameObject();
        obj.tag = "web";    
        obj.name = "web";
        float randomX = Random.Range (Utilities.getMainCameraBounds ().min.x, Utilities.getMainCameraBounds ().max.x);
        float randomY = Random.Range (Utilities.getMainCameraBounds ().min.y, Utilities.getMainCameraBounds ().max.y);
        obj.transform.position = new Vector3(randomX, randomY);
        obj.transform.localScale = new Vector3 (3.0f, 3.0f, 3.0f);
        collider = obj.AddComponent <BoxCollider2D>();
        body = obj.AddComponent<Rigidbody2D> ();
        body.constraints = RigidbodyConstraints2D.FreezeAll;
        joint = obj.AddComponent<HingeJoint2D> ();

        renderer = obj.AddComponent<SpriteRenderer>();

        renderer.sortingOrder = 1;

        renderer.sprite = Resources.Load("Textures/dot_net", typeof(Sprite)) as Sprite;

这样做的目的是像这样捕捉碰撞:

void OnCollisionEnter2D(Collision2D collision) {
    if (collision.transform.tag == "web") {
        Player.getInstance().joint(collision.rigidbody);
    }
}

玩家与其中一些物体发生碰撞后,方法joint被调用,目的是将playerwebHingeJoint2D连接起来以模拟钟摆行为。 joint代码:

public void joint(Rigidbody2D body) {
    WebCollection.getInstance ().turnOffColliders (body.gameObject);
    HingeJoint2D hingeJoint = webLine.getObject ().AddComponent<HingeJoint2D> ();
    hingeJoint.connectedBody = body;
    hingeJoint.anchor = new Vector2 (0.00120592f, 0.1921938f);
    hingeJoint.connectedAnchor = new Vector2 (0.1939605f, 0.03025406f);
}

钟摆行为工作得很好,但在它的瞬间,或者就在玩家向网络移动时,其他 web 对象正在与其碰撞,产生真正的碰撞行为(比如相互挤压)

我的目标: 我希望 web 对象对碰撞做出反应(上面的调用方法),但在屏幕上玩家只需将它们扔出去。

我已经尝试过的:我想关闭其他物体的物体(WebCollection.getInstance ().turnOffColliders (body.gameObject);)并且在钟摆运动结束后将它们转回去,但它会导致非常奇怪的行为。

还有一个解决方案是手动检查玩家现在是否正在与 web 对象发生碰撞,并进行处理,但我认为这成本太高。

将我的评论作为对发现您问题的人的回答:

如果你想让碰撞器只触发事件而不与其他碰撞器发生物理碰撞,那么你想要的是触发器。要使 Collider 成为触发器,您可以在检查器中选中碰撞器组件的 Is Trigger 复选框(您也可以通过脚本使用 Collider.IsTrigger 布尔值 属性).

要在触发器触发时执行某些操作,请使用 OnTrigger 事件(OnTriggerEnterOnTriggerExitOnTriggerStay)(参见 http://docs.unity3d.com/ScriptReference/Collider.html

这里还有unity对Colliders as Triggers的简单介绍:http://unity3d.com/learn/tutorials/topics/physics/colliders-triggers