Unity3d射线穿透攻击
和之前的普通攻击模式不同,普通攻击是利用射线与制定层物体进行碰撞,返回单点的碰撞信息。在进行射线穿透攻击时,首先要做好各个字段以及相关变量、方法的准备工作。
修改特殊攻击相关方法的重要核心是
specialAttackHitInfo = Physics.RaycastAll(testRay, 100, attactHitMask)
与该语句相关的参量定义如下
private RaycastHit[] specialAttackHitInfo;laser.gameObject.SetActive(true);laser.SetPosition(0, gunBarrelEnd.position);//枪口的粒子效果开始播放fireParticle.Play();//枪口灯光激活fireLight.enabled = true;//以枪口位置为起点,枪口正前方为方向,产生一条3D射线Ray testRay = new Ray(gunBarrelEnd.position, gunBarrelEnd.forward);//发射射线,记录碰撞信息和碰撞结果specialAttackHitInfo = Physics.RaycastAll(testRay, 100, attactHitMask);
以下是specialattack的方法
private void PlayerSpecialAttack(){//如果按下鼠标左键if (Input.GetAxis("Fire1") > 0){//激光线激活laser.gameObject.SetActive(true);//枪口的粒子效果开始播放fireParticle.Play();//枪口灯光激活fireLight.enabled = true;//设置线渲染器的起点和终点laser.SetPosition(0, gunBarrelEnd.position);laser.SetPosition(1, gunBarrelEnd.position + gunBarrelEnd.forward * 100);//以枪口位置为起点,枪口正前方为方向,产生一条3D射线Ray testRay = new Ray(gunBarrelEnd.position, gunBarrelEnd.forward);//发射射线,记录碰撞信息和碰撞结果specialAttackHitInfo = Physics.RaycastAll(testRay, 100, attactHitMask);//bool值,指示是否有敌人受到伤害bool specialDamageValidState = false;//遍历碰撞信息数组for(int i = 0; i < specialAttackHitInfo.Length; i++){//如果第i个物体时敌人if (specialAttackHitInfo[i].transform.gameObject.layer == LayerMask.NameToLayer("Enemy")){//特殊攻击处于未冷却状态if (specialAttackColdState == false){//第i个敌人受到伤害specialAttackHitInfo[i].transform.GetComponent<Enemy>().TakeDamage(specialAttackDamage);//有至少一个敌人受到伤害specialDamageValidState = true;}}}//如果只要有一个敌人受到伤害if (specialDamageValidState){//特殊攻击进入冷却specialAttackColdState = true;}}//否则else{StopSpecialAttack();}}
对比普通攻击normalattack方法
private void PlayerNormalAttack(){//如果按下鼠标左键if (Input.GetAxis("Fire1") > 0){//激光线激活laser.gameObject.SetActive(true);laser.SetPosition(0, gunBarrelEnd.position);//枪口的粒子效果开始播放fireParticle.Play();//枪口灯光激活fireLight.enabled = true;//以枪口位置为起点,枪口正前方为方向,产生一条3D射线Ray testRay = new Ray(gunBarrelEnd.position, gunBarrelEnd.forward);//发射射线,记录碰撞信息和碰撞结果bool hitResult = Physics.Raycast(testRay, out normalAttackHitInfo, 100, attactHitMask);//如果射线和制定层的物体发生碰撞if (hitResult){//设置激光渲染器的终点laser.SetPosition(1, normalAttackHitInfo.point);//在渲染器的终点处生成一个粒子效果if (hitParticle == null){ hitParticle = Instantiate(Resources.Load<GameObject>("Prefabs/BulletFatExplosionFire"), normalAttackHitInfo.point, Quaternion.identity) as GameObject;}else{//若之前已经生成射击点,则更新该粒子的位置hitParticle.transform.position = normalAttackHitInfo.point;}}//否则else{//设置激光渲染器的终点laser.SetPosition(1, gunBarrelEnd.position + 100 * gunBarrelEnd.forward);}//如果射线碰到的物体是敌人if (normalAttackHitInfo.transform.gameObject.layer == LayerMask.NameToLayer("Enemy")) {//如果普通攻未冷却if(normalAttackColdState == false){//敌人受到伤害normalAttackHitInfo.transform.GetComponent<Enemy>().TakeDamage(normalAttackDamage);normalAttackColdState = true;}}}//否则else{StopNormalAttack();}}
Unity3d射线穿透攻击相关推荐
- Unity之射线穿透
小白欢迎评论,共同探讨,共同进步 一般的射线射中物体后就被阻挡了,假如碰到物体后,就会被拦截.如果我们想实现穿透某些物体,或者使射线不穿透UI的话.这时候就需要穿透的知识了. 下面写一个简单的射线. ...
- 基于FRP反向代理工具实现内网穿透攻击
文章目录 前言 FRP反向代理 内网环境搭建 服务端的配置 客户端的配置 FRP内网穿透 FRP进阶使用 fscan内网神器 总结 前言 当我们拿下目标单位的一台外网服务器后,需要借助外网服务器作为跳 ...
- Unity3D 雷电激光攻击LineRender和光线投射
最近在学习Unity3D游戏开发,练习制作飞机大战的2D游戏,但激光的效果不知道如何实现,经过网上查询和调试,做了一个激光的摸拟效果. 1.首先,组件准备,如图 Player: 飞机 fire: 子弹 ...
- Unity3d 射线检测
射线碰撞单个物体: 方式1:从摄像机向世界发射一条射线,通常用于检测鼠标指针有没有选择物体 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosi ...
- Unity3D射线检测墙面前停止移动
功能: 计算角色/怪物走到目标,如果有墙就再墙前停止,防止一直怼墙走现象. 思路: 1. θ角 = 入射线(self - target) 与 法线(raycastHit.normal) 的夹角度(V3 ...
- unity3d点击屏幕判断是否击中场景中物体
问题: 现在要做点击屏幕,然后判断是否击中了3d场景中的一个物体.(就像子弹发射出去,打击目标一样) 思路: 一开始我想的是,我点击屏幕,那么拥有点击处的坐标,然后从点击处创建一个gameobject ...
- 在python中如何判断数组中的数据为空值_缓存穿透问题,开发中真实解决方案
前几天我们讲到了缓存的读写策略(缓存读写策略,我们开发人员都是这么用的)以及如何搭建高可用缓存系统(分布式缓存的高可用方案,我们都是这么做的),都是为了能在基础架构上让我们的缓存命中率能更高,防止大量 ...
- CT与DR双能X射线物质识别算法实现与应用(工业选煤、稀土分拣、毒爆检测、垃圾分类等)
CT与DR双能X射线物质识别算法实现与应用(工业选煤.稀土分拣.毒爆检测.垃圾分类等) 算法涉及到的理论和模型,来自CNKI相关技术论文(不包括本人改进部分),如涉及版权问题,请联系本人 ...
- X射线、CT、MRI、PET总结
X光片.CT.核磁共振在临床上是医学影像检查的几种常用的方法,成像原理各不相,有的以为越贵越好,要求做CT来替代普通X光片检查或者要求用磁共振代替CT检查,认为磁共振比CT清楚,CT比X光检清楚,这从 ...
最新文章
- 【NLP】听李宏毅点评GPT-3:来自猎人暗黑大陆的模型
- makefile 基本总结
- DijKstra算法普通+堆优化链式向前星
- 深入解读 MySQL 架构设计原理,剖析存储架构选型核心
- [leetcode]Longest Consecutive Sequence
- 该设备或资源(Web 代理)未设置为接受端口1080上的连接
- iOS常用第三方类库 Xcode插件
- java alert 乱码_在servlet中输出JS中文乱码,servlet中alert对话框出现中文乱码的解决方法...
- python中__future__包
- transformer学习之残差网络
- 2021,要这样学大数据开发
- 9年技术面试官讲解:计算机专业应届生怎样写简历
- Snmp拓扑结构php,基于SNMP的网络拓扑结构生成
- 确定不看看我的扫雷吗(C语言)
- 画象棋棋盘c语言程序设计,绘制中国象棋棋盘(c语言).docx
- 02. Compose 可组合组件之 属性 modifier
- 二十八条改善 ASP 性能和外观的技巧
- MapReduce中文版论文
- 安卓如何查找应用的安装包目录?
- IDEA如何修改背景图片
热门文章
- 4.有两个知阵a和b,均为2行3列。求两个矩阵之和。重载运算符“+”,使之能用于知阵相加。如:c=a+b。
- Flink WaterMark 详解
- 已知abc+cba=1333,其中a,b,c均为一位数,编程求出满足条件的a,b,c所有组合。
- 职场上个人的核心技术_如何打造个人职场核心竞争力
- OpenJudge NOI 1.9.14 铺地毯
- Creo(proe)快捷键设置
- 中国大学MOOC新媒体营销试题(含答案)
- 你不努力,有什么资格谈未来
- 基于以太坊区块链的物联网/IoT设备管理【论文及源码】
- 金额大写与阿拉伯数字转换