获取碰撞位置的方法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 framevoid 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);}}
以前写过,结果工程找不到了,还得重写,这次干脆记录到博客里吧,希望对别人也有用。












