基本上,我有玩家对象和其他一堆。目前他们都有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
对象发生碰撞并处理它,但我认为这是代价高昂的。
答案 0 :(得分:1)
将我的评论放到那些找到你的问题的答案中:
如果你想让碰撞器只触发事件并且不与其他碰撞者发生物理碰撞,那么你想要的是触发器。要创建Collider
触发器,请检查检查器中碰撞器组件的 Is Trigger 复选框(您也可以通过脚本使用Collider.IsTrigger
布尔属性设置它。)< / p>
要在触发器触发时执行某些操作,请使用OnTrigger
事件(OnTriggerEnter
,OnTriggerExit
,OnTriggerStay
)(请参阅http://docs.unity3d.com/ScriptReference/Collider.html)
还有一个简短的介绍将碰撞器作为统一触发器:http://unity3d.com/learn/tutorials/topics/physics/colliders-triggers