两个物体发生碰撞,如果要检测到碰撞信息,那么其中必有一个物体既带有碰撞器,又带有刚体,且检测碰撞信息的脚本必须附着在带有刚体的碰撞器上。
两个GameObject发生碰撞,要想检测到触发信息,最少要有一个刚体碰撞器并且勾选了IsTrigger复选框,另一个最少要有一个碰撞器组件,此时检测碰撞的脚本必须附加在那个带有刚体的触发器上。
这两句结论是别人实验的结果,而在我使用的过程中,并没有这么复杂的操作,我制作了一个capsule和一个cube,双方都添加了碰撞器和刚体,给capsule添加如下代码:
using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { transform.Translate (Vector3.forward * 5f * Time.deltaTime); } public void OnCollisionEnter(Collision collision) { Destroy (collision.gameObject); } } 运行结果是capsule撞到了方块后方块消失,capsule受到力作用前进方向改变。这也就是说既实现了碰撞效果又检测到了碰撞信息,而我之所以会查看碰撞器的问题,是因为我之前写的OnCollisionEnter函数中检测了Collision.Collider.tag=“XXX”,这样写在pc端可以正常运行,发布到安卓就会检测不到碰撞信息,所以走了很多弯路,查询了很多资料。
那么触发信息在我这个例子中就不需要了(OntriggerEnter),我原本以为触发信息就是给碰撞效果添加的响应函数,原先觉得很矛盾,因为如果有触发信息就不会有碰撞效果(添加了istrigger后物体会直接穿过彼此),现在明白这种是为了实现没有物理碰撞效果的碰撞检测,例如自动门,就是不碰撞到门但门会自己打开。所以平常我所需要的都是OnCollisionEnter(),实现既有物理碰撞效果(capsule被撞飞),又有碰撞信息(cube消失)。