一、子弹的碰撞检测:

    因为子弹的移动速度非常的快,那么如果为子弹添加一个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 (new Vector3 (Screen.width / , 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);
}
}

【Unity3D】枪战游戏—发射子弹、射线检测的更多相关文章

  1. Unity3D 5.0简单的射线检测实现跳跃功能

    这里是一个简单的跳跃,5.0和其他版本貌似不一样,并且,再起跳功能做的不完全. 不过一个基本的思路在这里. 1.首先,射线检测,这里是利用一个空对象,放到主角对象的下面 2.然后调节射线的位置,在主角 ...

  2. 【Unity3D】枪战游戏—弹孔设置

    以子弹为原点,发射射线,如果射线检测到障碍物,则返回射线与障碍物的碰撞点 在该点处实例化出弹孔贴图 void Update () { transform.Translate (Vector3.forw ...

  3. unity3d 赛车游戏——复位点检测优化、反向检测、圈数检测、赛道长度计算

    接着上一篇文章说 因为代码简短且思路简单 所以我就把这几个功能汇总为一篇文章 因为我之前就是做游戏外挂的 经过验证核实,**飞车的复位点检测.圈数检测就是以下的方法实现的 至于反向检测和赛道长度计算, ...

  4. Unity3D 之射线检测

    这里来记录下射线检测的相关内容: 射线检测故名就是通过射线去检测是否和碰撞器产生了交集,和碰撞器与碰撞器发生交集一样,会返回一个真. 射线的用法很多:比如检测是否跳跃,通过向地面投射射线控制在地面时候 ...

  5. [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)

    一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...

  6. [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第3讲(玩家发射子弹)

    一.公布上一讲中玩家飞机上.下.右移动实现的代码: /*=========================键盘按下事件 keycode为得到键盘相应键对应的数字==================== ...

  7. unity零基础开始学习做游戏(四)biu~biu~biu发射子弹打飞机

    -------小基原创,转载请给我一个面子 主角都能移动了,那不得做点什么伸张正义,守护世界和平的事嘛,拿起家伙biu~biu~biu~ 首先得做一个好人和一个坏人 老规矩,Canvas下创建两个Im ...

  8. 用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)-陈远波

    一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...

  9. 用JS制作《飞机大作战》游戏_第3讲(玩家发射子弹)-陈远波

    一.公布上一讲中玩家飞机上.下.右移动实现的代码: /*=========================键盘按下事件 keycode为得到键盘相应键对应的数字==================== ...

随机推荐

  1. memmove和memcpy 以及strcmp strcpy几个库函数的实现

    memmove和memcpy 1.memmove 函数原型:void *memmove(void *dest, const void *source, size_t count) 返回值说明:返回指向 ...

  2. xml存储图片 二进制存储图片

    一.保存图片到XML文件 /// <summary> /// 保存图片到XML文件 /// </summary> private void UploadImageToXml() ...

  3. 【转载】Eclipse自动编译问题

    今天调试的时候发现问题:调试的时候竟然在我注释的里面走,当时那个郁闷啊,每次都要clean下才可以,晚上感觉不对劲,上网查了查,原来是bulid automatically这个我把勾去掉了,下面是原文 ...

  4. java String 空指针异常

    如下代码中,第8行和第10行均会提示Exception in thread "main" java.lang.NullPointerException. 第12行的写法可行. im ...

  5. 使用CXF暴露您的REST服务

    使用CXF暴露您的REST服务 REST应用服务器SpringBeanServlet  1.  前言 现在互联网Open API流行,将您的Web应用也可以开放Open API给其他第三方使用.达到一 ...

  6. Java多线程2:实现多线程的两种方式

    原文:http://www.cnblogs.com/skywang12345/p/3479063.html 常见的实现多线程的方式有2种,一是继承Thread类,二是实现 Runnable接口,还可以 ...

  7. 控制CPU占用率曲线

    编程之美的第一个问题,我的机器是双核的,用文中的代码,得到的曲线波动比较大额,受其他进程的影响比较大.文中提到10ms接近windows的调度时间片,如果选得太小,会造成线程被频繁唤醒和挂起,造成内核 ...

  8. JS模块化编程

    AMD:异步模块定义,适合客户端环境,不会阻塞运行.客户端受网络影响比较大. CommonJs:适用于服务器端规范,可以同步加载,只受硬盘读写的影响.

  9. BNU OJ 33691 / LA 4817 Calculator JAVA大数

    留着当个模板用,在BNU上AC,在LA上RE……可能是java的提交方式不同??? 数和运算符各开一个栈. 表达式从左到右扫一遍,将数存成大数,遇到数压在 数的栈,运算符压在 运算符的栈,每当遇到右括 ...

  10. vim编程 插入 保存不退出 保存退出 退出不保存 另存为其他文件名 保存覆盖现有文件

    ---恢复内容开始--- 在xshell里写代码,如果需要编辑代码,可以输入  vim+ xxx.py  ,进入vim编辑界面 这里的xxx.py表示  python的存储文件,后缀名是.py. 1. ...