Fork me on GitHub

【Unity3D】枪战游戏—发射子弹、射线检测

一、子弹的碰撞检测:

    因为子弹的移动速度非常的快,那么如果为子弹添加一个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     }

 

posted @ 2015-05-31 15:30  郑斌blog  阅读(5962)  评论(0编辑  收藏  举报