• 【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     }
  • 相关阅读:
    Web架构中的前端页面缓存
    Drools 使用Spring中的bean
    大型Java多用户商城系统设计开发的心得和困难
    正则表达式
    No ideal,no future
    关于sql 2005 assembly
    修改aspx输出的action地址 
    关于[META HTTPEQUIV="REFRESH" CONTENT=2]
    最简单的兼容firefox和ie的锚点方法
    【IIS】检索COM类工厂中CLSID为{0002450000000000C000000000000046}的组件时失败,错误: 80070005
  • 原文地址:https://www.cnblogs.com/zhengbin/p/4542031.html
Copyright © 2020-2023  润新知