闲杂:

想玩游戏的时候就来写博客,其实我个人的感觉写博客就跟写书是一样的吗,写书是将内心的故事呈现给读者,而写博客就是将技术呈现给读者,一方面我们可以将自己的技术分享出来供大家学习,第二个是希望大家可以给我的技术做一些指点,互相学习互相交流,希望能在评论区多多留言,我也可以解决疑难杂症。

故事开始:

在FPS的游戏开发当中设计到枪械的方面,手雷的方面,近战武器,以及一些特殊的道具,所以这些模块值得去深挖和细品,古人云:彩虹风雨后,成功细节中(我也不知道是哪个古人说的)

我的思路,搭建场景,然后给box添加上Rigibody组件(不要给地面也添加该组件,会出现很奇怪的情况,如果想试一试的小伙伴,可以玩一下)

接下来就是Granade,吐槽一下,我的第一版手雷和上面的箱子一样大,由于太过搞笑所以我就弄了手雷2.0,看起来就舒服多了

接下来就是脚本方面了,我的思路是这样的,首先是Granade.cs的脚本

  • 手雷延时爆炸delay
  • 手雷的爆炸半径
  • 手雷的爆炸力度

这三方面考虑好后就可以开始写脚本了,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Granade : MonoBehaviour
{public float delay = 3f;public float radius = 5f;public float force = 700f;public GameObject ExplosionEffect;public GameObject ExplosionAudio;float countDown;bool hasExploaded = false;void Start(){countDown = delay;}void Update(){countDown -= Time.deltaTime;if (countDown <=  0f && !hasExploaded){Explode();hasExploaded = true;}}void Explode(){Instantiate(ExplosionEffect, transform.position, transform.rotation);Instantiate(ExplosionAudio, transform.position, transform.rotation);//add force to move//该半径内的所有碰撞器,返回一个数组Collider[] collidersToMove = Physics.OverlapSphere(transform.position,radius);//遍历球体内的所有Colliderforeach (Collider nearbyObject in collidersToMove){//获取球体半径范围内的rigibodyRigidbody rb = nearbyObject.GetComponent<Rigidbody>();if (rb != null){//向模拟爆炸效果的刚体施加力rb.AddExplosionForce(force,transform.position, radius);}}Destroy(gameObject);}//Granade Demage
}

代码分析:
我在此脚本中用了一个特殊的方法,我们知道,当物体被销毁的时候,身上的脚本以及组件都被销毁了,所以不能够将声音和爆炸的特效挂载到手雷上面,而是应该单独做成两个预制体,接下来在手雷爆炸的时候将这两个预制体加载出来,这样就解决了这个办法。
Instantiate(ExplosionEffect, transform.position, transform.rotation);
Instantiate(ExplosionAudio, transform.position, transform.rotation);

然后给Granade添加爆炸力和爆炸范围
Collider[] collidersToMove = Physics.OverlapSphere(transform.position,radius);

在官方文档中,讲到了参数和使用方法。我解释一下返回Collider数组的作用,这里是将球形范围内的所有包含Collder组件的物体都存起来,接下来遍历球体内物体上的Rigibody组件,然后可以给含有该组件的物体添加爆炸力度,爆炸力是手雷来提供的,这样就实现了手雷爆炸击飞箱子。
rb.AddExplosionForce(force,transform.position, radius);
Granade的部分就完成了,接下来就是手雷爆炸特效和手雷音效销毁,回收的阶段,我遇到的问题是特效如果不销毁就会一直常驻内存,而且特效也会重复播放,所以,我就另外写了一个脚本来专门管理它,DestroyGameObject(名字起的不是很恰当,后期优化)

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class DestroyGameObject : MonoBehaviour
{public float effectTime = 6f;public GameObject BigExplosionEffect;public GameObject GranadeAudio;float currentDown;bool hasPerfab = true;void Start(){currentDown = effectTime;}void Update(){currentDown -= Time.deltaTime;if (currentDown <= 0 && hasPerfab){if (BigExplosionEffect != null && GranadeAudio != null){currentDown = effectTime;DestoryExplosinEffect();DestoryExlosinAudio();hasPerfab = true;}else{hasPerfab = false;}}}void DestoryExplosinEffect(){GameObject obj = GameObject.Find("BigExplosionEffect(Clone)");if (obj != null){Destroy(obj);}}void DestoryExlosinAudio(){GameObject obj = GameObject.Find("GranadeAudio(Clone)");if (obj != null){Destroy(obj);}  }
}

代码解释:

我先定义了一个计时器,由于我的特效和声音大概是3秒,加上之前的手雷延时爆炸3秒,所以是6秒之后销毁,这样写是比较简单的,分开控制,方法也是分开写的,方便后期的管理。
添加了一个控制条件hasPerfab ,控制它只销毁一次,之前想一次扔好几个手雷,但是出现了一些小问题(其实问题蛮大的),我下来解决一下,在下回书中我们在讲解。然后将其挂载到场景CheckDestory上,如图

最后是控制手雷的扔出,ThrowerGranade,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GranadeThrower : MonoBehaviour
{public float throwerForce = 15f;public GameObject GranadePrefab;private AudioSource audioSource;bool isFirst = true;void Start(){audioSource = GetComponent<AudioSource>();}void Update(){if (Input.GetMouseButtonDown(0)){//播放手雷扔出的音效audioSource.Play();if (isFirst){ThrowGranade();isFirst = false;}}}void ThrowGranade(){GameObject granade = Instantiate(GranadePrefab,transform.position, transform.rotation);Rigidbody rb = granade.GetComponent<Rigidbody>();rb.AddForce(transform.forward * throwerForce,ForceMode.VelocityChange);}
}

代码解释:
挂载到相机上,按下鼠标左键时,添加一个向前的力,这样手雷就扔出去了,我后期想加上抛物线,后面在改进,这样就可以实现真正的手雷模拟器(无情)

完整的演示图:

本回合完,预知后事如何,且看下回分解(有赞的观众老爷能不能点一下赞,手写了三篇)

FPS游戏开发(3)相关推荐

  1. FPS游戏开发--后坐力分析

    说到FPS游戏,后坐力是每个FPS游戏不可或缺的元素,后坐力决定了玩这个游戏时瞄准的难度,也决定了每个玩家的上限,那么今天小编来分析一下在FPS开发过程中对后坐力的分析. 首先什么是后坐力,说到后坐力 ...

  2. unity FPS游戏开发#1实现人物移动

    代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine;public class Mov ...

  3. Unity三维游戏开发C#编程大师班 Masterclass In C# Programing Unity 3D Game Development FPS

    本课程采用现代游戏开发(Unity 2021)的最新内容和最新技术 学习任何东西的最好方法是以一种真正有趣的方式去做,这就是这门课程的来源.如果你想了解你看到的这些不可思议的游戏是如何制作的,没有比这 ...

  4. 【游戏开发实战】Unity手游第一人称视角,双摇杆控制,FPS射击游戏Demo(教程 | 含Demo工程源码)

    文章目录 一.前言 二.实现方案 1.无主之地,第一人称视角 2.我之前做的摇杆控制 3.第一人称视角 + 摇杆控制 三.开始实战 1.资源获取:Unity AssetStore 2.Low Poly ...

  5. FPS游戏初开发--逻辑分析总结

    (图片来自网络,侵权可删) FPS游戏,即First-person Shooting Game,第一人称射击游戏,说到FPS游戏,相信大家第一个想到都是经典的CS,近几年优秀的FPS游戏也是不少,比如 ...

  6. 项目实训(十一)——FPS游戏(第一人称射击游戏)初步开发

    一.前言 我与另外两个组员合作进行了FPS游戏(第一人称射击游戏)的开发,这个游戏对应于我们在项目开始设想的PVP玩家对战游戏.玩家之间的之间对战会让游戏变得更加紧张刺激,还能够增强玩家之间的感情. ...

  7. JAVA 游戏开发之——FPS(帧频刷新率)精准控制

            JAVA游戏开发之FPS精准控制 2013年7月18日 目录 JAVA游戏开发之FPS精准控制... 1 1       概述... 2 1.1        编写目的... 3 2  ...

  8. libGDX游戏开发之修改游戏帧数FPS(十三)

    libGDX游戏开发之修改游戏帧数FPS(十三) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网 ...

  9. 多人网络游戏服务器开发基础学习笔记 II: 帧同步 | 游戏客户端预测原理分析 | FPS 游戏状态同步

    这篇是对书本 网络多人游戏架构与编程 的学习第二篇(第一篇:多人网络游戏服务器开发基础学习笔记 I:基本知识 | 游戏设计模式 | 网游服务器层次结构 | 游戏对象序列化 | 游戏 RPC 框架 | ...

最新文章

  1. Zookeeper-Zookeeper的配置
  2. 自定义PopView
  3. Convolutional neural networks for artistic style transfer
  4. VSCODE修改文字编码格式为GB2312和TAB键为2个空格(MDK5和VSCODE联合开发STM32程序)
  5. 【CodeForces - 1082B】Vova and Trophies (贪心模拟,暴力)
  6. Ubuntu下安装中文输入法
  7. mysql连接池设计_数据库连接池(基于MySQL数据库)
  8. javabean和java类_java对象 POJO和JavaBean的区别
  9. Ubuntu 16.04 LTS深度美化!
  10. Linux学习初识redhat7(一)
  11. 关于conime.exe
  12. 动态二级下拉菜单html,jquery实现漂亮的二级下拉菜单代码
  13. linux卸载软件wine,Ubuntu 卸载wine
  14. 今年的WWDC,真的很难说
  15. Deep Learning Chapter02:Python基础语法回顾
  16. python 捕捉键盘操作
  17. 使用人人开源搭建后台管理系统
  18. win10与xp/win7 局域网不通的修改方法
  19. Python文本分析案例:近体诗格律分析
  20. nginx日志格式配置

热门文章

  1. xgboost的调优
  2. XPC Client error: Connection interrupted问题解决方案
  3. 创新创意springboot计算机毕业设计题目300例,总有你需要用到的!
  4. allegro cadence bubble 灰色不可用
  5. css渐变描边视频,CSS制作渐变描边等文字特效
  6. 【源代码】Python制作的赛车小游戏,逆行飙车
  7. 自制J-LINK遇到的问题
  8. CAS票据之ST与TGT过期策略详细说明
  9. Lightroom导入JPG格式的图像
  10. Bzoj4766 文艺计算姬