Unity3D学习FPS游戏(5)武器瞄准和准星

前言:一个FPS游戏最基本的角色控制,在前面几篇已经基本实现,接下来我们将进入到武器篇。本篇将实现武器武器瞄准和准星。

武器瞄准和准星

  • 武器瞄准
    • 思路
    • 实现
    • 效果
  • 武器准星
    • 思路
    • 实现
    • 效果
  • 补充知识
    • 协程
    • 线性插值

武器瞄准

思路

FPS游戏在准备开枪的时候,点击右键的时候会把武器抬起来对准中间。

带玩家模型动画的可能会通过动画来实现,像我们这种没有玩家模型的,可以通过移动武器或者摄像机来实现。

思路是这样的,这里我们参考Unity官方的是通过移动武器来实现的,武器右键瞄准就把武器的位置移动到最中间。

实现

调整Weapon对象

由于现在我们对武器的操作要变多了,需要对Weapon游戏对象进行更好的层级管理,调整为下图所示。
在这里插入图片描述

新建代码和挂载

新建一个WeaponController的C#代码,挂载到武器Weapon01的上。

代码逻辑

如前面思路所说的,武器瞄准就把武器的位置移动到最中间,平时我们拿着武器是在右手边。

代码思路上,记录武器移动的两个坐标坐标,然后在按下右键的时候移动到中间位置,松开的时候回到原位位置。
但是直接移动位置的话,表现出来的效果会非常生硬。就如我们上一篇文章讲到的跳跃那样,直接到某个位置是非常生硬的,需要一些过渡。

我们可以通过协程和线性插值实现自然的位置过渡,具体如下,关于协程和线性插值的具体的知识会在补充知识中详细解释,这里我们简单提一下。
我们只需要知道协程是一个特殊的函数,它可以主动暂停和唤醒,常用的方法有“yield return null”主动暂停一帧再执行。
线性插值Lerp(当前位置,终点位置,进度百分比)函数,通过协程循环配合,能够创造出枪快速移动,在快靠近中间的越来越缓慢的视觉效果。

代码
根据前面的逻辑编写出如下代码。

public class WeaponController : MonoBehaviour
{[Header("武器数值")]public Vector3 defaultPosition;// 默认位置public Vector3 centerPosition;// 中心位置public float positionLerpRatio = 0.5f;// 线性插值参数void Start(){// 自己在Unity中挪位置试出来的defaultPosition = new Vector3(0.4F, -0.6F, 1.15F);centerPosition = new Vector3(0F, -0.6F, 0.807F);}void Update(){ChangePosition();// 变换武器位置}private void ChangePosition(){// 按下右键if (Input.GetMouseButtonDown(1)){StopCoroutine("ToDefault");// 停掉另一个协程再开启下个一个StartCoroutine("ToCenter");}// 松开右键if (Input.GetMouseButtonUp(1)){StopCoroutine("ToCenter");StartCoroutine("ToDefault");}}IEnumerator ToCenter() {while (transform.localPosition!=centerPosition){transform.localPosition = Vector3.Lerp(transform.localPosition, centerPosition, positionLerpRatio);// 线性插值过渡更自然yield return null;// 等待一帧}}IEnumerator ToDefault(){while (transform.localPosition != defaultPosition){transform.localPosition = Vector3.Lerp(transform.localPosition, defaultPosition, positionLerpRatio);yield return null;// 等待一帧}}
}

效果

在这里插入图片描述

武器准星

FPS游戏中,屏幕中间通常会有个准星。

思路

这个准星实际上是UI界面的一部份,即在界面中间常驻一个准星UI,UI界面在Unity中可以通过Canvas来实现。

实现

新建Canvas和Image

在Scene中右键UI-Canvas新建Canvas,然后在Canvas下面右键UI-Image新建Image。

在这里插入图片描述
拖入准星UI
在这里插入图片描述
根据自己需求调整Width和Height。

切换天空盒

因为天空太白了,不方便看到准星。

菜单-Window-Rendering-Lighting,按照如下拖入素材中的天空盒子。
在这里插入图片描述

效果

在这里插入图片描述

补充知识

协程

协程是什么

在游戏客户端开发的时候,一般是不考虑多线程的,因为游戏逻辑更新和画面更新的时间点要求有确定性,尤其是网络同步的时候。用协程会比较多。

协程是一种可以主动暂停和唤醒的特殊函数,看起来像轻量级线程,但本质还是运行在主线程上,类似于Unpdate方法。

协程和线程的区别,协程串行所以同一时间只能执行一个协程,线程并发所以同时有多个线程在运行;协程是运行在线程中的;协程是程序员控制的,线程是操作系统控制的。

协程怎么用

协程挂在MonoBehaviour上的,必须要通过一个MonoBehaviour才能开启协程。即使MonoBehaviour被Disable(隐藏)也会继续执行,只有被销毁才会被销毁。

协程在Unity中形式,是以IEnumerator为返回值的函数。

开始和停止分别是StartCoroutine(协程名)和StopCoroutine(协程名)。

使用方法通常是在协程中写一些功能,并根据自己需求暂停和唤醒,常用的有如下:

IEnumerator CoroutineA(int a)
{Debug.Log("协程A被开启了");yield return null;Debug.Log("协程A暂停了一帧");yield return new WaitForSeconds(1.0f);Debug.Log("协程A暂停了一秒");yield return StartCoroutine(CoroutineB(a));Debug.Log("协程A暂停直到CoroutineB运行结束");Debug.Log("协程A运行结束");
}

协程的应用

如同我们这篇文章实现的枪从快到慢移动到中间的动画效果。

打字机效果,人物对话中的文字很多是一点点显示出来的。

加载资源,游戏开始的时候,IO资源加载很慢会卡顿游戏,可以放到协程中每次加载一点。

定时器操作,每隔一段时间调用一次。

协程和Update

我们会发现协程能做的,其实Update都可以做到,为什么还要用协程呢?用协程可以把多帧的操作封装到一个方法内部,能使得代码逻辑更加清晰。

线性插值

Lerp函数

线性插值Lerp(起始位置a,终点位置b,进度百分比t)函数。

进度百分比t是一个0到1之间的值,返回的是a + (b - a) * t。

Lerp应用

本篇中,线性插值Lerp(当前位置,终点位置,进度百分比)函数,通过协程循环配合,能够创造出枪快速移动,在快靠近中间的越来越缓慢的视觉效果。

还可以做相机尾随,摄像机先迅速的移动,后来越接近玩家越慢,形成了缓动效果,这个用在横板游戏比较常见。

还有一些淡出淡出的动画效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-echarts使用

vue-echarts使用 排名柱状图示例代码 汇总示例代码 平均时效示例代码 全图 排名柱状图 示例 代码 // 排名趋势<!-- 排名数据趋势图 --><div class"rank"><div class"rank_title"><div class"rank_title_left"><spa…

【04】RabbitMQ的集群机制

1、RabbitMQ的性能监控 关于RabbitMQ的性能监控&#xff0c;在管理控制台中提供了非常丰富的展示。例如&#xff1a;首页这个整体监控页面&#xff0c;就展示了非常多详细的信息&#xff1a; 还包括消息的生产消费频率、关键组件的使用情况等等非常多的消息。都可以在这个管理…

Segugio:一款针对恶意软件的进程执行跟踪与安全分析工具

关于Segugio Segugio是一款功能强大的恶意软件安全分析工具&#xff0c;该工具允许我们轻松分析恶意软件执行的关键步骤&#xff0c;并对其进行跟踪分析和安全审计。 Segugio允许执行和跟踪恶意软件感染过程中的关键步骤&#xff0c;其中包括从点击第一阶段到提取恶意软件的最…

YOLO-FaceV2:A Scale and Occlusion Aware Face Detector

摘要 近年来&#xff0c;基于深度学习的人脸检测算法取得了巨大进展。这些算法一般可以分为两类&#xff0c;即像Faster R-CNN这样的两阶段检测器和像YOLO这样的一阶段检测器。由于一阶段检测器在精度和速度之间取得了更好的平衡&#xff0c;因此已被广泛应用于多种场景。在本…

贪心算法与盛雨水问题

啥是盛雨水问题&#xff1f;给个图就熟悉了 欸&#xff1f; 这其中的关键在于&#xff1a; 1. 容量2D化就是长 * 宽 2. 木桶效应&#xff1a;宽取决于短板。 那我们来分析&#xff0c;怎么样能达到最佳的结果呢&#xff1f;穷举一下所有可能性不就好了&#xff1f;每两个板子…

OAK相机的RGB-D彩色相机去畸变做对齐

▌低畸变标准镜头的OAK相机RGB-D对齐的方法 OAK相机内置的RGB-D管道会自动将深度图和RGB图对齐。其思想是将深度图像中的每个像素与彩色图像中对应的相应像素对齐。产生的RGB-D图像可以用于OAK内置的图像识别模型将识别到的2D物体自动映射到三维空间中去&#xff0c;或者产生的…

Information Theoretical Estimators (ITE) Toolbox的使用(MATLAB)

Information Theoretical Estimators (ITE) Toolbox是什么 官方文档&#xff1a; ITE is can estimate several entropy, mutual information, divergence, association measures, cross quantities and kernels on distributions. Thanks to its highly modular design, ITE …

STM32G474硬件CRC16和软件CRC16校验

1、硬件CRC校验和软件CRC校验的多项式&#xff0c;以及初始值 #define CRC_Hardware_POLYNOMIAL_16B 0x8005 //硬件CRC多项式为0x8005 //CRC16x^16 x^15 x^2 1&#xff0c;因为bit151,bit21,bit01&#xff0c;所以正向校验的多项式的值为0x8005 //CRC校验分为正向校验和反…

UWA Gears:Frame Capture模式 - 着色器查看器

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 在上周的文章中&#xff0c;我们详细介绍了网格查看器的功能&#xff0c;介绍如何通过网格数据优化…

微服务电商平台课程三:基础环境搭建

后端基础环境 工具版本号功能说明下载JDK1.8java编译运行的基本环境Java Downloads | Oracledocker27.0.3容器化部署Windows | Docker Docsgit2.46.2代码版本管理&#xff0c;多人协作代码开发Git for Windowsmaven3.9.9服务的依赖管理Maven – Download Apache MavenMySQL5.7…

第十四章 章节练习echarts饼图渲染

目录 一、引言 二、完整代码 三、总结 一、引言 通过前面几个章节的学习&#xff0c;再结合日常项目中经常会使用到的echarts图&#xff0c;来完整以下功能需求&#xff0c;增强对知识点的巩固&#xff1a; 1. 基本渲染 2. 添加功能 3. 删除功能 4. 饼图渲染 运行效果图…

厨艺爱好者的在线互动平台:Spring Boot实现

摘 要 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在厨艺交流信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的厨艺交流平台功能…

WUP-MY-POS-PRINTER 旻佑热敏打印机票据打印uniapp插件使用说明

插件地址&#xff1a;WUP-MY-POS-PRINTER 旻佑热敏打印机票据打印安卓库 简介 本插件主要用于旻佑热敏打印机打印票据&#xff0c;不支持标签打印。适用于旻佑的各型支持票据打印的热敏打印机。本插件开发时使用的打印机型号为MY-805嵌入式面板打印机&#xff0c;其他型号请先…

2006-2023年各地级市债务余额数据

2006-2023年各地级市债务余额数据 1、时间&#xff1a;2006-2023年 2、来源&#xff1a;整理自wind 3、指标&#xff1a;地区、地方政府债-债券数量(只)、地方政府债-债券余额(亿)、地方政府债-债券余额占比(%)、城投债-债券数量(只)、城投债-债券余额(亿)、城投债-债券余额…

CentOS7安装Docker-2024

CentOS7安装Docker-2024 安装 更新yum仓库&#xff1a; yum -y update安装yum-utils并配置阿里云的docker仓库和相关插件&#xff1a; sudo yum install -y yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum i…

121.WEB渗透测试-信息收集-ARL(12)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;120.WEB渗透测试-信息收集-ARL&#xff08;11&#xff09; 点击管理控制台 连接成功&…

Java | Leetcode Java题解之第513题找树左下角的值

题目&#xff1a; 题解&#xff1a; class Solution {public int findBottomLeftValue(TreeNode root) {int ret 0;Queue<TreeNode> queue new ArrayDeque<TreeNode>();queue.offer(root);while (!queue.isEmpty()) {TreeNode p queue.poll();if (p.right ! nu…

w005基于Springboot学生心理咨询评估系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

SpringCloud接入nacos配置中心

这里写自定义目录标题 版本选择项目搭建pom.xml本地的 application.ymlchenfu-miniapp-dev.yml 中的配置项接收配置的实体类 版本选择 spring-cloud-Alibaba版本依赖关系 本文章&#xff0c;采用的 springboot 版本是 2.6.13&#xff0c;spring-cloud-alibaba 版本是 2021.0.5…

(二十二)、k8s 中的关键概念

文章目录 1、总体概览2、第一层&#xff1a;物理机、集群、Node、Pod 之间的关系2、第二层&#xff1a;命名空间 Namespace3、定义4、控制平面&#xff08;Control Plane&#xff09;5、特别的概念 Service6、Deployment 经过 之前几篇文章对 k8s 的实践&#xff0c;结合实践&…