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

时间:2016-05-30 08:40:57

标签: c# unity3d collision

基本上,我有玩家对象和其他一堆。目前他们都有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对象发生碰撞并处理它,但我认为这是代价高昂的。

1 个答案:

答案 0 :(得分:1)

将我的评论放到那些找到你的问题的答案中:

如果你想让碰撞器只触发事件并且不与其他碰撞者发生物理碰撞,那么你想要的是触发器。要创建Collider触发器,请检查检查器中碰撞器组件的 Is Trigger 复选框(您也可以通过脚本使用Collider.IsTrigger布尔属性设置它。)< / p>

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

还有一个简短的介绍将碰撞器作为统一触发器:http://unity3d.com/learn/tutorials/topics/physics/colliders-triggers