上一节将UI简单的布置了一下,下面来实现UI中当前子弹数和总子弹数和脚本的数据绑定,并且发射子弹要朝着准星的位置发射

1:子弹和显示UI的子弹数的实现思路:在枪攻击的脚本里添加当前子弹数和背包子弹数两个变量,在发射子弹后当前弹夹子弹数减1,并且将当前子弹数显示到UI上

下面看代码

射击后子弹数减1,并且下面直接调用UI显示,这样就形成了数据绑定,使得UI的子弹数和脚本的子弹数保持一致

//弹夹内子弹数[SerializeField]private int currentBullets=30;//剩余子弹数[SerializeField]private int surPlusBullets=120;//射击方法private void Shoot(){if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0)){//判断子弹是否够用 if (currentBullets <= 0) {//更换弹夹swapClip();return;}//设置开枪间隔时间是0.1秒,换弹夹的时候不能开枪if (Time.time - timer > 0.1&& !animator.GetBool("SwapClip")){//开枪音效ShootAudio.Play();//开枪动画animator.SetBool("Shoot", true);timer = Time.time;//火花特效GameObject filego = GameObject.Instantiate(firePointParticle, FirePoint);filego.GetComponent<ParticleSystem>().Play();//发射射线RaycastHit hit;//屏幕发射射线判断是否击中Ray ray = sightBeadCamera.ScreenPointToRay(sightBead.transform.position);if (Physics.Raycast(ray, out hit,200,5)){//子弹弹痕贴图GameObject go = GameObject.Instantiate(bulletTextcute, hit.point + 0.01f * hit.normal, Quaternion.Euler(Vector3.zero));//注视旋转go.transform.LookAt(hit.point + hit.normal);}//子弹减一currentBullets--;           //显示子弹UIshowCurrentBullets();if (currentBullets <= 0) return;}else{animator.SetBool("Shoot", false);}}else{animator.SetBool("Shoot", false);}}//显示当前弹夹子弹数[SerializeField]private Text currentBulletsNumber;public void showCurrentBullets() {currentBulletsNumber.text = this.currentBullets.ToString();}

2:更换弹夹的实现思路:在当前 弹夹子弹数为0的时候,或者玩家按下R键的时候,更换弹夹,并且有播放弹夹动画

//更换弹夹
public void swapClip() {if (surPlusBullets > 0 ){//换弹夹动画,动画播放完毕后换弹animator.SetBool("SwapClip", true);//换弹夹音效if(!SwapClip.isPlaying)SwapClip.Play();}else { //没有子弹了}//在更换弹夹动画播放完毕后调用public void calculationBullets(){if (surPlusBullets >= (30 - currentBullets)){this.surPlusBullets -= (30 - currentBullets);this.currentBullets = 30;}else{this.currentBullets += surPlusBullets;this.surPlusBullets = 0;}//设置动画状态机animator.SetBool("SwapClip",false);//显示UIshowCurrentBullets();showsurPlusBullets();}

需要注意的是上面并没有更换弹夹的子弹数的逻辑,因为更换弹夹需要在更换弹夹动画播放完毕后才算更换完毕,所以我将子弹逻辑写在了弹夹动画的关键帧里面调用了

3: 准星作为射击位置的思路:之前实现子弹是在枪口发射射线,玩家难以瞄准,所以在屏幕中间添加一个准星,所以我们之前在枪口发射射线就不满足了,我们就在准星的位置发射一条屏幕射线来实现子弹功能

//屏幕发射射线判断是否击中Ray ray = sightBeadCamera.ScreenPointToRay(sightBead.transform.position);if (Physics.Raycast(ray, out hit,200,5)){//子弹弹痕贴图GameObject go = GameObject.Instantiate(bulletTextcute, hit.point + 0.01f * hit.normal, Quaternion.Euler(Vector3.zero));//注视旋转go.transform.LookAt(hit.point + hit.normal);}//if (Physics.Raycast(FirePoint.position, -FirePoint.right, out hit, 200))//{//    //子弹弹痕贴图//    GameObject go = GameObject.Instantiate(bulletTextcute, hit.point + 0.01f * hit.normal, Quaternion.Euler(Vector3.zero));//    //注视旋转//    go.transform.LookAt(hit.point + hit.normal);//}

sightBead是准星的游戏对象,屏幕发射射线就会发射到屏幕该点透视到的三维空间,所以不需要你去考虑发射的方向,

在第二行代码中 Physics.Raycast(ray, out hit,200,5),第三个参数是发射最大距离,第四个参数是不接受射线的层,我们需要UI不接受射线,自身玩家不接受射线。UI不接受射线在UI的Inspctor面板中可以设置

自身玩家不接受射线可以用layerMask去设置,直接设置前面的编号即可。

本节结束,代码写的可能比较乱,因为没有自己搭框架,因为是练手项目,主要目的还是熟悉unity面版的操作和明白unity能干什么,不能干什么,那些是需要程序员是实现的是主要目的。

unity3d实现第一人称射击游戏之CS反恐精英(六)(朝准星位置发射子弹,更换弹夹 )相关推荐

  1. unity3d实现第一人称射击游戏之CS反恐精英(二)(人物的移动和场景的碰撞关系)

    上一节我们简单的实现了第一人称的移动,但是只是让枪有了漫游的效果,本章来实现它的物理效果. 1 先给枪添加一个碰撞器组件,为了简单我们添加一个box collider来模拟碰撞 调整下碰撞器大小,将它 ...

  2. unity3d实现第一人称射击游戏之CS反恐精英(一)(第一人称移动)

    学习unity有一段时间了,自己准备做一个cs的项目来巩固并且提升自己. 第一步:搭建场景 因为这个游戏只针对游戏逻辑为重点,所以搭建场景和人物素材我都从unity asset store中的免费资源 ...

  3. unity3d实现第一人称射击游戏之CS反恐精英(四)(子弹模块,音效特效)

    实现思想 由于子弹的速度非常快,直接让子弹像现实中那样移动很容易发生'穿模'现象,所以我们用unity中的射线来实现,当用户点击鼠标左键的时候,播放开枪动画,火花特效,开火音效,枪口发射一条射线,检测 ...

  4. unity3d实现第一人称射击游戏之CS反恐精英(三)(人物旋转限制和跳跃功能(消除连跳,碰撞消除,高度稳定))

    1旋转限制 上文实现的代码,我们的人物可以后空翻和前空翻,这不是我们想要的,所以我们需要对视角进行限定. 先分析一下,人物抬头不能让他超过某个角度,也就是抬头的时候我们人物的z轴和世界的y轴的夹角不能 ...

  5. unity3d实现第一人称射击游戏之CS反恐精英(五)(第一视角UI搭建,血量,金钱,子弹,准心,倒计时)

    这一节内容比较简单,就是构建UI在摄像机屏幕上,让玩家可以看到人物的状态,血量,防弹衣,倒计时,金钱,子弹,准心 下面看一下效果图 最终效果是这样的,所有的布局全是用UGUI的TEXT组件添加的,需要 ...

  6. Unity3D FPS Game:第一人称射击游戏(一)

    耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...

  7. Unity3D FPS Game:第一人称射击游戏(二)

    耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...

  8. Unity3D FPS Game:第一人称射击游戏(三)

    耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...

  9. unity3D第一人称射击游戏(推荐)

    unity3d第一人称射击游戏(推荐) 第一部分:简介   这个教程中,我们详细了解下如何制作一个简单的第一人称射击游戏(FPS).其中将介绍一些基本的3D游戏编程的概念和一些关于怎样如游戏程序员般思 ...

最新文章

  1. HTML DOM全解和案例
  2. RMI、JNDI、LDAP介绍+log4j漏洞分析
  3. es6 数组找最大值_JavaScript 查找数组中最大值与最小值
  4. Android下实现GPS定位服务
  5. 项目:NMEA2000的数据格式解析
  6. 阿里云高校“在家实践”计划,免费提供2.68亿小时算力!
  7. linux java -xms_为什么JVM比指定的-Xms消耗更少的内存?
  8. python字符串描述_Python字符串
  9. 【英语学习】【Level 07】U08 Old Stories L2 A good read
  10. hadoop 生态圈
  11. Date类的getYear(),getMonth过时,现在的获取方法
  12. boost::bind 与 boost::function 的使用方法例子
  13. Flex走出低谷的关键: 打破Flex固有的定义
  14. java程序设计编程题_JAVA编程题全集100题及答案
  15. linux tex文件编译,用latexmk编译XeLaTeX tex文件
  16. OSChina 周四乱弹 ——小小编辑去死远点了
  17. 现成源码抢单软件开发|服务器
  18. python-urllib3
  19. 【SLAM】VINS-MONO解析——回环检测和重定位
  20. 62、backtrader的一些高级技巧---如何基于日线实现尾盘选股第二日卖出(各种订单的综合使用)?

热门文章

  1. 表格式计算机教案模板,教案的表格格式_教案的表格模板
  2. 怎么同时给多个 PDF 文档批量添加自定义的文字和图片水印
  3. 在直播软件开发过程中,常用的几种视频封装格式
  4. freeline集成
  5. 某运营商云平台在线报价及合同管理系统
  6. 03基础自绘-05魔法老鼠-magicmouse
  7. 诺贝尔奖得主背后有哪些故事?美纳里尼基金会推出“超越国界对话”系列片...
  8. Java 解析GPS芯片 的经纬度信息
  9. carthage命令
  10. C8051F340之USB简介