Unity之做一个最简单的FPS游戏demo
目录
😋FPS游戏Demo
💤1.新建FPS模板项目
⚒️2.装备枪
💣3.设置射击功能
📺4.制造一个子弹预制体
🎮5.发射子弹
说起来小编学Unity差不多一个月了,都是利用上班摸鱼时间学的(doge.jpg)。今天终于迎来了一直想做的FPS游戏demo。
【10分钟制作第一人称射击游戏 - Unity游戏开发】 小编是根据小破站这个教程学的,好的教程分享给大家,然后在此基础上小编还加了子弹拖尾和开火特效。
下面小编以博客的形式教大家做这个游戏demo,角色控制器是项目模板自带的,我们只需要加上枪编辑好发射子弹功能就可以了,非常简单。

😋FPS游戏Demo
💤1.新建FPS模板项目
首先我用的Unity HUB版本是3.3,我们可以直接新建一个FPS模板项目:取好项目名创建项目。

创建好进入项目后场景模板都给我们建好了,运行项目就能发现我们通过WASD和空格键控制胶囊玩家行走和跳跃。
⚒️2.装备枪
射击类游戏怎么能没有枪呢???我们去资源商店找一把

选了这一把枪在Unity中打开把它导进项目中来

资源导进来后查看枪的预制件,选择一把你喜欢的颜色:

如果发现枪的预制件是紫色的我们通过下面方式来解决:

解决好材质问题后选择喜欢的枪装到玩家的摄像机(PlayerCameraRoot)上,这样控制玩家视角旋转枪也会跟着旋转。装备好枪后我们还要调整枪到合适的位置。

保存后运行就可以看到玩家拿着枪移动了。
💣3.设置射击功能
有了枪之后我们还要用它射击,先设置一下操作按键(鼠标左键):设置好后保存。

下面我们来验证射击按键有没有触发操作, 双击打开脚本文件(StarterAssetsInputs)
我们使用bool类型来判断是否按下,
using UnityEngine;
#if ENABLE_INPUT_SYSTEM && STARTER_ASSETS_PACKAGES_CHECKED
using UnityEngine.InputSystem;
#endifnamespace StarterAssets
{public class StarterAssetsInputs : MonoBehaviour{[Header("Character Input Values")]public Vector2 move;public Vector2 look;public bool jump;public bool sprint;//射击public bool shoot;[Header("Movement Settings")]public bool analogMovement;[Header("Mouse Cursor Settings")]public bool cursorLocked = true;public bool cursorInputForLook = true;#if ENABLE_INPUT_SYSTEM && STARTER_ASSETS_PACKAGES_CHECKEDpublic void OnMove(InputValue value){MoveInput(value.Get<Vector2>());}public void OnLook(InputValue value){if(cursorInputForLook){LookInput(value.Get<Vector2>());}}public void OnJump(InputValue value){JumpInput(value.isPressed);}public void OnSprint(InputValue value){SprintInput(value.isPressed);}//射击public void OnShoot(InputValue value){shoot = value.isPressed;}
#endifpublic void MoveInput(Vector2 newMoveDirection){move = newMoveDirection;} public void LookInput(Vector2 newLookDirection){look = newLookDirection;}public void JumpInput(bool newJumpState){jump = newJumpState;}public void SprintInput(bool newSprintState){sprint = newSprintState;}private void OnApplicationFocus(bool hasFocus){SetCursorState(cursorLocked);}private void SetCursorState(bool newState){Cursor.lockState = newState ? CursorLockMode.Locked : CursorLockMode.None;}}}
我们来创建自己枪的脚本(Gun)并挂载到枪上,我们用来测试射击键是否生效:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using StarterAssets;public class Gun : MonoBehaviour
{private StarterAssetsInputs _input;void Start(){_input = transform.root.GetComponent<StarterAssetsInputs>();}void Update(){//判断是否按下射击键if (_input.shoot){//打印shoot!Shoot();_input.shoot = false;}}void Shoot(){Debug.Log("shoot!");}
}
运行项目点击鼠标左键查看是否生效
📺4.制造一个子弹预制体
新建一个球体取名为Bullet,把它缩放成子弹的形状,小编新建了一个橙黄色的材质给子弹上色,并给子弹加了刚体Rigidbody和拖尾组件TrailRenderer。

注意调整拖尾的宽度、时间和颜色,有条件的也可以加上拖尾材质😋

Unity之预制体与变体 通过这个我们知道层级里的物体往项目栏下面拖就会生成预制体,我们来生成子弹预制体。

我们还要创建一个空对象(BulletPoint),把它放到枪口位置,这个空对象用来标记子弹的生成点。

🎮5.发射子弹
这里小编放上脚本(Gun)的全部代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using StarterAssets;public class Gun : MonoBehaviour
{private StarterAssetsInputs _input;//子弹预设体序列化[SerializeField]private GameObject bulletPrefab;//游戏对象子弹发射点[SerializeField]private GameObject bulletPoint;//子弹速度[SerializeField] private float bulletSpeed = 999;//特效public GameObject muzzleFlash;// Start is called before the first frame updatevoid Start(){_input = transform.root.GetComponent<StarterAssetsInputs>();}// Update is called once per framevoid Update(){//如果按下射击键执行Shoot方法if (_input.shoot){Shoot();_input.shoot = false;}}void Shoot(){Debug.Log("shoot!");//生成一个子弹实例,每点击射击一次则生成一枚子弹GameObject bullet = Instantiate(bulletPrefab, bulletPoint.transform.position, transform.rotation);//给子弹一个向前的力bullet.GetComponent<Rigidbody>().AddForce(transform.forward * bulletSpeed);//一秒后销毁子弹Destroy(bullet,1);//发射子弹的同时并播放开火特效PlayerFireEffect();}/// <summary>/// 播放开火特效/// </summary>public void PlayerFireEffect(){//启动特效muzzleFlash.SetActive(true);//0.2秒关闭Invoke("UnEffect", 0.1f);}/// <summary>/// 取消特效/// </summary>private void UnEffect(){muzzleFlash.SetActive(false);}
}
(插个眼)小编已经把开火特效预制体上传到资源了,审核通过后在这里更新链接。
链接来了:https://download.csdn.net/download/qq_48512649/88797719
我们把开火特效(MuzzleFlash)也放到枪下边,和子弹发射点(BulletPoint)处在同一级,并把开火特效放到合适的位置。

放好后我们要取消开火特效(MuzzleFlash),因为只有我们点击开火的时候才会触发。

然后我们给脚本(Gun)装填子弹(Bullet)、子弹发射点(BulletPoint)、子弹速度(BulletSpeed)和开火特效(MuzzleFlash)。

小编再给加一个准星,不过这个准星可能因为子弹发射点位置的原因不是很准(doge.jpg)

新进一个图像,然后根据下图的数据设置好,还可以选择自己喜欢的颜色,这样准星就设置好了。

点击运行项目就是本篇开头演示的效果了,当然了这只是个demo,真正的游戏还要有敌人血条等元素😃小编还要持续学习。本篇先到这里,完结撒花✿✿ヽ(°▽°)ノ✿,拜拜┏(^0^)┛
相关文章:
Unity之做一个最简单的FPS游戏demo
目录 😋FPS游戏Demo 💤1.新建FPS模板项目 ⚒️2.装备枪 💣3.设置射击功能 📺4.制造一个子弹预制体 🎮5.发射子弹 说起来小编学Unity差不多一个月了,都是利用上班摸鱼时间学的(doge.jpg&…...
【Springboot】单元测试Junit5应用
JUnit 5是一个功能强大的测试框架,常用于编写和执行这些单元测试。以下是一些JUnit 5中的常用注解、断言、前置条件、嵌套测试和参数化测试的例子: 1.环境启动 SpringBootTest 注解: classes SmartApplication.class:这个属性…...
【INTEL(ALTERA)】内部错误:子系统:PTI,文件:/quartus/tsm/pti/pti_delay_annotator.cpp
说明 由于英特尔 Quartus Prime Pro Edition 软件 23.2 及更早版本存在问题,因此在编译设计的 Retime 期间可能会出现此错误。 解决方法 此问题已在英特尔 Quartus Prime Pro Edition 软件 v23.3 中修复。 要在版本 23.2 中解决此问题,请通过以下相应链…...
大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置
上一篇: 大数据 - Spark系列《一》- 从Hadoop到Spark:大数据计算引擎的演进-CSDN博客 目录 1. 🥙Idea中配置Live Templates来快速生成代码片段 2. 🥙Idea中配置文件模板自定义初始代码 3.🥙设置spark-submit提交程…...
android 设置未知来源等 AppOpsManager 权限的设置接口
开始客户让我们执行下面的CMD 代码 adb shell appops set com.android.chrome REQUEST_INSTALL_PACKAGES allow 后来 GTP 告诉我有 Setmode的方法,后面在设置里面找到了 OP_REQUEST_INSTALL_PACKAGES 这个,里面有个方法mAppOpsManager.setMode(AppOp…...
使用GPT实现一个简单的网站
背景 In this exciting tutorial video, you’ll discover how to use 文心一言, a powerful language model developed by 百度, to generate ReactJS code for a simple blog website. With 文心一言’s help, you can quickly create a blog website that’s easy to custom…...
回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制)
回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制) 目录 回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注…...
11:Servlet中初始化参数的获取与应用-Java Web
目录 11.1 Servlet初始化参数简介11.2 如何在Servlet中获取初始化参数11.3 基于注解的初始化参数(Servlet 3.0)11.4 区别总结11.5 应用场景总结 在构建Java Web应用程序时,Servlet是核心组件之一,它负责处理HTTP请求并生成响应。而…...
STM32的ADC采集传感器的模拟量数据
1、 由于项目上使用传感器采集数据,传感器可以输出模拟电压信号,但是模拟电压信号的输出范围是1-5V,而STM32的ADC采集电压范围是0-3.3V,此时可以用一个简单的分压电路将1-5V的电压将至0.5V到2.5V的范围。 2、电阻分压电路可以使用…...
opencvb 十七 使用cmake配置opencv c++项目
1、cmake简介 1.1 cmake是什么 CMake是一个开源、跨平台的编译(Build)工具,是用来构建、测试和打包软件的。它能够用简单的语句来描述所有平台的编译过程。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C特…...
Java8 中文指南(一)
Java8 中文指南(一) 文章目录 Java8 中文指南(一)《Java8 指南》中文翻译接口的默认方法(Default Methods for Interfaces)Lambda 表达式(Lambda expressions)函数式接口(Functional Interfaces)方法和构造函数引用(Method and Co…...
引流技术-通过文件中增加联系方式并传播
文章目录 前言文档增加联系方式扩散网盘扩散自建网站借力 注意 前言 很多人在找资料的时候可能都遇到过下图情况: 1、文档最后面留一个自己的联系方式; 2、找的一堆文件中都有相同的情况; 3、一段时间全网搜到的很多相同文件也有这个联系方式…...
分布式搜索引擎_学习笔记_2
分布式搜索引擎_学习笔记_2 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用…...
【学习笔记】树上差分总结(点差分/边差分)
一.树上差分的基本概念 1.树上差分的定义 树上差分,顾名思义,意思就是在树上做差分。 至于什么是差分呢?如果不会的同学,可以先看看我的这篇博客:一维,二维差分の详解(简单易懂)_一维差分-CSDN博客 2.树…...
Vue.js设计与实现(霍春阳)
Vue.js设计与实现 (霍春阳) 电子版获取链接:Vue.js设计与实现(霍春阳) 编辑推荐 适读人群 :1.对Vue.js 2/3具有上手经验,且希望进一步理解Vue.js框架设计原理的开发人员; 2.没有使用过Vue.js,但对Vue.js框架设计感兴趣…...
go消息队列RabbitMQ - 订阅模式-fanout
1、发布订阅 订阅模式,消息被路由投递给多个队列,一个消息被多个消费者获取。 1) 可以有多个消费者 2) 每个消费者有自己的queue(队列) 3) 每个队列都要绑定到Exchange(交换机&…...
科普类——5G远程实时操控技术在国内港口应用简介(十三)
在中国,5G远程实时操控技术已经在多个港口得到应用,并且应用规模不断扩大,展现出良好的发展前景。以下是一些具体的应用案例: 上港集团洋山港:上港集团与华为合作,在全球港口首次将F5G技术应用于超远程控制…...
整理:汉诺塔简析
大体上,要解决一个汉诺塔问题,就需要解决两个更简单的汉诺塔问题 以盘子数量 3 的汉诺塔问题为例 要将 3 个盘子从 A 移动到 C,就要: 将两个盘子从 A 移动到 B(子问题 1) 为了解决子问题 1,就…...
Android 8.1 设置--声音中增加通话音量
Android 8.1 设置--声音中增加通话音量 近来收到项目需求,想要在设置--声音中增加一项通话音量调节,具体修改参照如下: /vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml <!-- Sound: Title for the opt…...
C#中使用OpenCvSharp4绘制直线、矩形、圆、文本
C#中使用OpenCvSharp4绘制直线、矩形、圆、文本 继之前的Python中使用Opencv-python库绘制直线、矩形、圆、文本和VC中使用OpenCV绘制直线、矩形、圆和文字,将之前的Python和C示例代码翻译成C#语言,很简单,还是借用OpenCvSharp4库中的Line、…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
