一、子弹的碰撞检测:

    因为子弹的移动速度非常的快,那么如果为子弹添加一个collider,就有可能检测不到了。

    因为collider是每一帧在执行,第一帧子弹可能在100米处,那么下一帧就在900米处了,

    那么中间的障碍物就不能被检测到了。

  所以就需要射线检测:

    在每一帧的执行,都向上一帧发射射线,不断地检测射线中是否有穿过的障碍物体  

     void Update () {
         transform.Translate (Vector3.forward * Speed * Time.deltaTime);
         //用射线检测,子弹的碰撞,当物体在两点之间产生的射线内时,算作发生碰撞
         //1.获得射线的起点(原点)
         //2.获得射线的方向
         //3.获得射线的距离
         Vector3 oriPos = transform.position;//1.射线的起点
         Vector3 direction = transform.position - oriPos;//2.方向
         float ength = (transform.position - oriPos).magnitude;//3.射线的距离,取向量的大小
         //光线投射碰撞
         RaycastHit hitinfo;//存储碰撞信息
         //光线投射,检测是否发生碰撞
         bool isCillider = Physics.Raycast (oriPos,direction,out hitinfo,ength);
         if (isCillider) {
             //射线检测到物体,执行以下动作          }

二、子弹的生成

  首先想到的是在枪口生成子弹,然后使子弹发生移动

  如果是这样的话,玩家就不能指哪打哪

  所以需要在屏幕的正中央,来生成子弹

  依旧运用射线,让子弹延射线方向移动

    获得屏幕中央作为射线原点

    发射射线

    如果射线碰撞到物体,返回该点,确定原点与该点的方向,子弹沿该方向移动

    如果没有,则目标点为从原点向前移动一定距离,作为目标点,确定方向,子弹沿该方向移动

 //开始射击
     void Shoot(){
         //闪光
         flashcol.Flash ();
         //生成子弹
         //GameObject.Instantiate (bulletPrefab, fllow.transform.position, fllow.transform.rotation);
         GameObject go = GameObject.Instantiate (bulletPrefab,transform.position,Quaternion.identity) as GameObject ;
         //获得屏幕中心位置,转化为世界坐标
         Vector3 point = soliderCamera.ScreenToWorldPoint (, Screen.height / ,));
         //定义射线
         RaycastHit hitinfo;
         //发射射线
         bool isCollider = Physics.Raycast (point, soliderCamera.transform.forward/*相机前朝向*/, out hitinfo);
         if (isCollider) {
             //如果射线撞击到了物体
             go.transform.LookAt (hitinfo.point);
         } else {
             //如果射线没有撞击物体
             //那么朝向1000米外的目标点
             point += soliderCamera.transform.forward * ;
             go.transform.LookAt(point);
         }
     }