在 unity 里面要想实现碰撞,需要满足两个条件。
- 两个物体都具有碰撞组件。
- 运动的组件拥有刚体。
对于第一条:碰撞组件有很多, 针对不同的形状有不同的Collider 。其中 Box Collider 是六个面针对的是立方体等,如果不算2d 的 Collider,Box Collider 的面数是最少的,下面还有Capsule Collider 胶囊体,Sphere Collider 球体的。其中针对不规则的物体可以使用 Mesh Collider,比如说坦克,石头等。
如何在程序里检测到碰撞,Unity 已经给了相应的方法。
当两个碰撞的物体,其中一个勾选上 Is Trigger 时,会触发:OnTriggerEnter、OnTriggerStay、OnTriggerExit
当不勾选Is Trigger 时,会触发:OnCollisionEnter、OnCollisionStay、OnCollisionExit。
看上面的英语,字面意思就是, Enter碰撞开始,Stay 碰撞保持,Exit 碰撞结束。
每个方法都有一个参数Collider other,这个代表与它发生碰撞的另外一个物体。
private void OnTriggerEnter(Collider other)
{
Debug.Log("OnTriggerEnter:::"+other.transform.name);
}
下面写了个例子:,可以把这个方法拖拽到其中一个物体上可以查看效果。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TrigerAndColler : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
private void OnTriggerEnter(Collider other)
{
Debug.Log("OnTriggerEnter:::"+other.transform.name);
// Destroy(other.gameObject);
}
private void OnTriggerStay(Collider other)
{
Debug.Log("OnTriggerStay");
}
private void OnTriggerExit(Collider other)
{
Debug.Log("OnTriggerExit");
}
private void OnCollisionEnter(Collision other)
{
// Destroy(other.gameObject);
other.transform.GetComponent<MeshRenderer>().material.color = new Color(Random.value,Random.value,Random.value);
Debug.Log("OnCollisionEnter");
}
private void OnCollisionStay(Collision other)
{
Debug.Log("OnCollisionStay");
}
private void OnCollisionExit(Collision other)
{
Debug.Log("OnCollisionExit");
}
// Update is called once per frame
void Update()
{
}
}