【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     }

 

你可能感兴趣的:(unity3d)