一、子弹的碰撞检测:
因为子弹的移动速度非常的快,那么如果为子弹添加一个collider,就有可能检测不到了。
因为collider是每一帧在执行,第一帧子弹可能在100米处,那么下一帧就在900米处了,
那么中间的障碍物就不能被检测到了。
所以就需要射线检测:
在每一帧的执行,都向上一帧发射射线,不断地检测射线中是否有穿过的障碍物体
1 void Update () { 2 transform.Translate (Vector3.forward * Speed * Time.deltaTime); 3 //用射线检测,子弹的碰撞,当物体在两点之间产生的射线内时,算作发生碰撞 4 //1.获得射线的起点(原点) 5 //2.获得射线的方向 6 //3.获得射线的距离 7 Vector3 oriPos = transform.position;//1.射线的起点 8 Vector3 direction = transform.position - oriPos;//2.方向 9 float ength = (transform.position - oriPos).magnitude;//3.射线的距离,取向量的大小 10 //光线投射碰撞 11 RaycastHit hitinfo;//存储碰撞信息 12 //光线投射,检测是否发生碰撞 13 bool isCillider = Physics.Raycast (oriPos,direction,out hitinfo,ength); 14 if (isCillider) { 15 //射线检测到物体,执行以下动作
}
二、子弹的生成
首先想到的是在枪口生成子弹,然后使子弹发生移动
如果是这样的话,玩家就不能指哪打哪
所以需要在屏幕的正中央,来生成子弹
依旧运用射线,让子弹延射线方向移动
获得屏幕中央作为射线原点
发射射线
如果射线碰撞到物体,返回该点,确定原点与该点的方向,子弹沿该方向移动
如果没有,则目标点为从原点向前移动一定距离,作为目标点,确定方向,子弹沿该方向移动
1 //开始射击 2 void Shoot(){ 3 //闪光 4 flashcol.Flash (); 5 //生成子弹 6 //GameObject.Instantiate (bulletPrefab, fllow.transform.position, fllow.transform.rotation); 7 GameObject go = GameObject.Instantiate (bulletPrefab,transform.position,Quaternion.identity) as GameObject ; 8 //获得屏幕中心位置,转化为世界坐标 9 Vector3 point = soliderCamera.ScreenToWorldPoint (new Vector3 (Screen.width / 2, Screen.height / 2,0)); 10 //定义射线 11 RaycastHit hitinfo; 12 //发射射线 13 bool isCollider = Physics.Raycast (point, soliderCamera.transform.forward/*相机前朝向*/, out hitinfo); 14 if (isCollider) { 15 //如果射线撞击到了物体 16 go.transform.LookAt (hitinfo.point); 17 } else { 18 //如果射线没有撞击物体 19 //那么朝向1000米外的目标点 20 point += soliderCamera.transform.forward * 1000; 21 go.transform.LookAt(point); 22 } 23 }