获取碰撞位置的方法1:使用 Collider.ClosestPoint
Returns a point on the collider that is closest to a given location.
返回碰撞器上最接近给定位置的点。
下方是子弹打到物体上,生成撞击火星的代码:
// 碰撞体的检测
private void OnCollisionEnter(Collision collision)
{
Debug.Log(collision);
Vector3 location = this.transform.position;
Vector3 closestPoint = collision.collider.ClosestPoint(location);
// 生成子弹撞击的火星
GameObject impact_obj = Instantiate(bullet_Impact_EF);
impact_obj.transform.position = closestPoint;
impact_obj.transform.localScale = Vector3.one;
Destroy(this.gameObject);
}
效果如下:
获取碰撞位置的方法2:使用射线,找到碰撞点
具体做法是,在子弹上,挂一个射线检测脚本,伪代码如下:
返回碰撞器上最接近给定位置的点。
// Update is called once per frame
void Update()
{
// 生成一条从起始点o, 以方向d为延展的射线
Ray ray = new Ray(m_trans.position, m_trans.forward);
// hit用于从光线投射中, 获取信息的结构
RaycastHit hit;
// 射线, 抛出的碰撞信息, 射线长度(注意, 碰撞体越小, 速度越快, 越容易帧缺失)
if (Physics.Raycast(ray, out hit, 6, targetMask))
{
// 从起点到碰撞点画一条线
Debug.DrawLine(ray.origin, hit.point, Color.red);
Debug.Log(hit.transform.name);
}
}
以前写过,结果工程找不到了,还得重写,这次干脆记录到博客里吧,希望对别人也有用。