【Unity3D】枪战游戏—发射子弹、射线检测
一、子弹的碰撞检测:
因为子弹的移动速度非常的快,那么如果为子弹添加一个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】枪战游戏—发射子弹、射线检测的更多相关文章
- Unity3D 5.0简单的射线检测实现跳跃功能
这里是一个简单的跳跃,5.0和其他版本貌似不一样,并且,再起跳功能做的不完全. 不过一个基本的思路在这里. 1.首先,射线检测,这里是利用一个空对象,放到主角对象的下面 2.然后调节射线的位置,在主角 ...
- 【Unity3D】枪战游戏—弹孔设置
以子弹为原点,发射射线,如果射线检测到障碍物,则返回射线与障碍物的碰撞点 在该点处实例化出弹孔贴图 void Update () { transform.Translate (Vector3.forw ...
- unity3d 赛车游戏——复位点检测优化、反向检测、圈数检测、赛道长度计算
接着上一篇文章说 因为代码简短且思路简单 所以我就把这几个功能汇总为一篇文章 因为我之前就是做游戏外挂的 经过验证核实,**飞车的复位点检测.圈数检测就是以下的方法实现的 至于反向检测和赛道长度计算, ...
- Unity3D 之射线检测
这里来记录下射线检测的相关内容: 射线检测故名就是通过射线去检测是否和碰撞器产生了交集,和碰撞器与碰撞器发生交集一样,会返回一个真. 射线的用法很多:比如检测是否跳跃,通过向地面投射射线控制在地面时候 ...
- [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)
一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...
- [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第3讲(玩家发射子弹)
一.公布上一讲中玩家飞机上.下.右移动实现的代码: /*=========================键盘按下事件 keycode为得到键盘相应键对应的数字==================== ...
- unity零基础开始学习做游戏(四)biu~biu~biu发射子弹打飞机
-------小基原创,转载请给我一个面子 主角都能移动了,那不得做点什么伸张正义,守护世界和平的事嘛,拿起家伙biu~biu~biu~ 首先得做一个好人和一个坏人 老规矩,Canvas下创建两个Im ...
- 用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)-陈远波
一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...
- 用JS制作《飞机大作战》游戏_第3讲(玩家发射子弹)-陈远波
一.公布上一讲中玩家飞机上.下.右移动实现的代码: /*=========================键盘按下事件 keycode为得到键盘相应键对应的数字==================== ...
随机推荐
- 词法分析器flex的使用
词法分析器flex的功能说起来就是一句话,将正则表达式转化为c代码. flex编译成功后会生成一个flex.exe的可执行文件.此时,我们需要一个定义了正则表达式 动作的input文件.例如test. ...
- POJ 3258
River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5961 Accepted: 2579 D ...
- SPOJ LGLOVE 7488 LCM GCD Love (区间更新,预处理出LCM(1,2,...,n))
题目连接:http://www.spoj.com/problems/LGLOVE/ 题意:给出n个初始序列a[1],a[2],...,a[n],b[i]表示LCM(1,2,3,...,a[i]),即1 ...
- hdu 4417 Super Mario 离线线段树
思路:将点按值从小到大排序,询问按h从小到大排序. 在建立线段树,按h的大小更新树并得到该次查询的结果! 代码如下: #include<iostream> #include<stdi ...
- APAC Practice
2016 round A A. Googol String small && large LL a[]; int dfs(LL pos, int id, bool f) { || po ...
- Project Euler 81:Path sum: two ways 路径和:两个方向
Path sum: two ways In the 5 by 5 matrix below, the minimal path sum from the top left to the bottom ...
- hdu 4465 Candy
题解: 由题意得 需要运用: C(m,n)=exp(logC(m,n)) f[]=; ; i<=; i++) f[i]=f[i-]+log(i*1.0); double logC(int m,i ...
- [转]C++四种cast操作符
http://blog.csdn.net/starryheavens/article/details/4617637 C 风格(C-style)强制转型如下: (T) expression 或 T(e ...
- pymongo 例子
import pymongo class dbUtil(object): def __init__(self, tablename='functional_testing'): con = pymon ...
- Java学习笔记之:Java引用数据类型之字符串
一.简介 字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串. 创建字符串最简单的方式如下: String greeting = "H ...