统一。禁用碰撞物理但有碰撞方法调用
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
被调用,目的是将player
和web
与HingeJoint2D
连接起来以模拟钟摆行为。 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
事件(OnTriggerEnter
、OnTriggerExit
、OnTriggerStay
)(参见 http://docs.unity3d.com/ScriptReference/Collider.html)
这里还有unity对Colliders as Triggers的简单介绍:http://unity3d.com/learn/tutorials/topics/physics/colliders-triggers
基本上,我有玩家对象和其他一些对象。目前他们都有 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
被调用,目的是将player
和web
与HingeJoint2D
连接起来以模拟钟摆行为。 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
事件(OnTriggerEnter
、OnTriggerExit
、OnTriggerStay
)(参见 http://docs.unity3d.com/ScriptReference/Collider.html)
这里还有unity对Colliders as Triggers的简单介绍:http://unity3d.com/learn/tutorials/topics/physics/colliders-triggers