【unity小技巧】FPS游戏实现相机的震动、后坐力和偏移

最终效果

在这里插入图片描述

文章目录

  • 最终效果
  • 前言
  • 相机的震动实现后坐力和偏移
  • 相机震动
    • 相机震动脚本
    • 换弹节点震动
  • 武器射击后退效果
  • 完结

前言

关于后坐力之前其实已经分享了一个:FPS游戏后坐力制作思路

但是实现起来比较复杂,如果你只是想要简单的实现,可以看看这个,其实原理是控制相机的震动实现后坐力和偏移

相机的震动实现后坐力和偏移

新增ProceduralRecoil ,Singleton是一个泛型单例

using UnityEngine;public class ProceduralRecoil : Singleton<ProceduralRecoil>
{private Vector3 currentRotation; // 当前旋转角度private Vector3 targetRotation; // 目标旋转角度private Vector3 targetPosition; // 目标位置private Vector3 currentPosition; // 当前位置private Vector3 initialGunPosition; // 初始枪支位置public Transform cam; // 相机的Transform组件public float recoilX; // 旋转角度的偏移量public float recoilY;public float recoilZ;public float kickBackZ; // 位置的偏移量public float snappiness; // 平滑度,控制旋转和位置的平滑过渡速度public float returnAmount; // 回退程度,控制旋转和位置回到初始状态的速度void Start(){initialGunPosition = transform.localPosition; // 保存初始枪支位置}void Update(){targetRotation = Vector3.Lerp(targetRotation, Vector3.zero, Time.deltaTime * returnAmount); // 将目标旋转角度逐渐回到0currentRotation = Vector3.Slerp(currentRotation, targetRotation, Time.fixedDeltaTime * snappiness); // 平滑过渡当前旋转角度transform.localRotation = Quaternion.Euler(currentRotation); // 更新Transform组件的本地旋转Debug.Log(currentRotation);cam.localRotation = Quaternion.Euler(currentRotation); // 更新相机的本地旋转back(); // 回退效果}public void Recoil(){targetPosition = new Vector3(0, 0, kickBackZ); // 将目标位置设置为一个向后的偏移量targetRotation = new Vector3(recoilX, Random.Range(-recoilY, recoilY), Random.Range(-recoilZ, recoilZ)); // 将目标旋转角度设置为随机的偏移量Debug.Log("RECOIL!");}void back(){targetPosition = Vector3.Lerp(targetPosition, initialGunPosition, Time.deltaTime * returnAmount); // 将目标位置逐渐回到初始枪支位置currentPosition = Vector3.Lerp(currentPosition, targetPosition, Time.fixedDeltaTime * snappiness); // 平滑过渡当前位置transform.localPosition = currentPosition; // 更新Transform组件的本地位置}
}

配置数据,脚本挂载在枪身上
在这里插入图片描述
注意,相机的震动可能会和人物鼠标控制视角冲突,所以最好是给相机新增一个父类,防止二者互相干扰
在这里插入图片描述
调用

ProceduralRecoil.Instance.Recoil();

相机震动

如果你只要实现相机震动,可以选择把震动代码提取出来

相机震动脚本

//控制相机震动
public class ProceduralRecoil : Singleton<ProceduralRecoil>
{private Vector3 currentRotation; // 当前旋转角度private Vector3 targetRotation; // 目标旋转角度public float recoilX; // 旋转角度的偏移量public float recoilY;public float recoilZ;public float snappiness; // 平滑度,控制旋转和位置的平滑过渡速度public float returnAmount; // 回退程度,控制旋转和位置回到初始状态的速度void Update(){targetRotation = Vector3.Lerp(targetRotation, Vector3.zero, Time.deltaTime * returnAmount); // 将目标旋转角度逐渐回到0currentRotation = Vector3.Slerp(currentRotation, targetRotation, Time.fixedDeltaTime * snappiness); // 平滑过渡当前旋转角度transform.localRotation = Quaternion.Euler(currentRotation); // 更新相机的本地旋转}public void Recoil(){targetRotation = new Vector3(Random.Range(-recoilX, recoilX), Random.Range(-recoilY, recoilY), Random.Range(-recoilZ, recoilZ)); // 将目标旋转角度设置为随机的偏移量Debug.Log("RECOIL!");}public void SetRecoil(int i){targetRotation = new Vector3(Random.Range(-i, i), Random.Range(-i, i), Random.Range(-i, i)); // 将目标旋转角度设置为随机的偏移量}
}

换弹节点震动

还可以在武器换弹时的某些节点,调用相机的震动,实现不错的人物操作反馈
在这里插入图片描述

//动画事件
public class PangXieAnimEnvent : MonoBehaviour
{public void PangXieAnim(int i){ProceduralRecoil.Instance.SetRecoil(i);}
}

挂载PangXieAnimEnvent 脚本到对应带Animator的武器身上
在这里插入图片描述

武器射击后退效果

如果你只要实现武器射击后退效果,也可以选择把代码提取出来

public class ProceduralRecoil : Singleton<ProceduralRecoil>
{private Vector3 targetPosition; // 目标位置private Vector3 currentPosition; // 当前位置private Vector3 initialGunPosition; // 初始枪支位置public float kickBackZ; // 位置的偏移量public float snappiness; // 平滑度,控制旋转和位置的平滑过渡速度public float returnAmount; // 回退程度,控制旋转和位置回到初始状态的速度void Start(){initialGunPosition = transform.localPosition; // 保存初始枪支位置}void Update(){back(); // 回退效果}public void Recoil(){targetPosition = new Vector3(0, 0, kickBackZ); // 将目标位置设置为一个向后的偏移量Debug.Log("RECOIL!");}void back(){targetPosition = Vector3.Lerp(targetPosition, initialGunPosition, Time.deltaTime * returnAmount); // 将目标位置逐渐回到初始枪支位置currentPosition = Vector3.Lerp(currentPosition, targetPosition, Time.fixedDeltaTime * snappiness); // 平滑过渡当前位置transform.localPosition = currentPosition; // 更新Transform组件的本地位置}
}

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

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

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

相关文章

Linux ssh 实现远程免密登录

一、背景 我搭建了一个 zookeeper 集群&#xff0c;写了一个 shell 脚本来控制集群的启动和关闭&#xff0c;但是我发现每次我执行 shell 脚本的时候&#xff0c;都需要我输入各个服务器的密码才可以运行&#xff0c;感觉很麻烦。shell 脚本里面连接其他服务器用的就是 ssh 的方…

Linux安装JDK和Maven并配置环境变量

文章目录 一、安装JDK并配置环境变量二、安装maven并配置环境变量 一、安装JDK并配置环境变量 将JDK的安装包上传到Linux系统的usr/local目录 使用xftp上传文件 解压JDK的压缩包 xshell连接到云主机 [roottheo ~]# cd /usr/local[roottheo local]# ls aegis apache-tomcat-…

equals()方法和“==”运算符

equals()equals()方法和“”运算符比较 回到顶部 equals() 超类Object中有这个equals()方法&#xff0c;该方法主要用于比较两个对象是否相等。该方法的源码如下&#xff1a; public boolean equals(Object obj) {return (this obj);} 我们知道所有的对象都拥有标识(内存…

使用LVM分区方式安装Manjaro发行版

使用LVM分区方式安装Manjaro发行版 为什么单独介绍LVM方式呢&#xff1f; 主要是由于使用系统的图形安装工具创建卷组会出问题&#xff0c;会导致图形安装工具直接挂掉&#xff0c;唯一的方法是提前手动创建好卷组。 GPT分区表 分区表有&#xff1a; MBR(主引导记录分区表)…

【华为OD真题 Python】两数之和绝对值最小

文章目录 题目描述输入描述输出描述示例1输入输出说明代码实现题目描述 给定一个从小到大的有序整数序列(存在正整数和负整数)数组 nums ,请你在该数组中找出两个数,其和的绝对值(|nums[x]+nums[y]|)为最小值,并返回这个绝对值。 每种输入只会对应一个答案。但是,数组中…

性能优化-OpenMP概述(一)-宏观全面理解OpenMP

本文旨在从宏观角度来介绍OpenMP的原理、编程模型、以及在各个领域的应用、使用、希望读者能够从本文整体上了解OpenMP。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础…

【算法】链表-20240105

这里写目录标题 一、LCR 023. 相交链表二、142. 环形链表 II 一、LCR 023. 相交链表 给定两个单链表的头节点 headA 和 headB &#xff0c;请找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 提示&#xff1a; listA 中节点数目为 m list…

window 下载安装 Studio 3T

这里 我们先访问官网 https://studio3t.com/ 然后 他会弹出提示 如果您同意使用cookies和类似技术进行市场研究或广告目的&#xff0c;并希望获得额外功能&#xff0c;您可以点击“Accept all”按钮。 如果您不同意使用cookies和类似技术进行上述目的&#xff0c;您可以点击“…

大模型的实践应用16-一种针对大型预训练模型的微调技巧:Adapter-Tuning方法的实战应用,原理详细介绍

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用16-一种针对大型预训练模型的微调技巧:Adapter-Tuning方法的实战应用,原理详细介绍。Adapter-Tuning 是一种针对大型预训练模型微调的技术,它可以在保持模型参数数量较小的情况下增加模型的表现。该技术将适配器插入…

ffmpeg 改变帧率,分辨率,时长等命令

ffmpeg -i elva.mp4 -ss 00:00:20 -t 00:00:30 -c:v copy -c:a copy output1.mp4 视频截取&#xff0c;开始时间和时长,-ss 00:00:20 -t 00:00:30 ffmpeg -i output1.mp4 -c:v libx265 output265.mp4 -c:v libx265,264转265 ffmpeg -i output1.mp4 -c:v libx264 output264.mp4 …

Java面试项目推荐,异构数据源数据流转服务DatalinkX

前言 作为一个年迈的夹娃练习生&#xff0c;每次到了春招秋招面试实习生时都能看到一批简历&#xff0c;十个简历里得有七八个是写商城或者外卖项目。 不由得想到了我大四那会&#xff0c;由于没有啥项目经验&#xff0c;又想借一个质量高点的项目通过简历初筛&#xff0c;就…

CTFhub-Web-Web前置技能-“302跳转“

题目信息 HTTP临时重定向&#xff0c;题目截图如下所示&#xff1a; 分析过程 看到跳转路径为&#xff1a;http://challenge-d1a96d97eaecf029.sandbox.ctfhub.com:10800/index.html 分析可能存在重定向问题&#xff0c;如果要想获得flag&#xff0c;则可能存在http://chal…

nodejs中ffcreator启动

ffcreator安装 安装环境及依赖 node.js环境FFmpegnode-canvasheadless-gl 安装FFCreator npm i ffcreator --save启动项目 有显示设备的电脑&#xff1a;npm start无显示设置的服务器&#xff1a;xvfb-run -s "-ac -screen 0 1280x1024x24" npm start next.js中…

Linux平台下gcc安装升级

文章目录 一、下载gcc源码二、配置三、编译四、安装 一、下载gcc源码 到gcc官网下载所要安装的版本&#xff0c;例如&#xff1a;gcc-5.5.0。 二、配置 首先确保系统已经安装了必要的依赖项。在命令行中运行以下命令来更新包管理器并安装所需的构建工具&#xff1a; sudo a…

element中Tree 树形控件实现多选、展开折叠、全选全不选、父子联动、默认展开、默认选中、默认禁用、自定义节点内容、可拖拽节点、手风琴模式

目录 1.代码实现2. 效果图3. 使用到的部分属性说明4. 更多属性配置查看element官网 1.代码实现 <template><div class"TreePage"><el-checkboxv-model"menuExpand"change"handleCheckedTreeExpand($event, menu)">展开/折叠&l…

java 使用 jtransforms 傅里叶库通过时域转频域实现wav 音频的加速与变慢效果

引入 maven 依赖&#xff1a;<dependency><groupId>net.sourceforge.jtransforms</groupId><artifactId>jtransforms</artifactId><version>2.4.0</version></dependency> FourierTransformTest.java&#xff1a; import edu.…

一、Vue3基础[常用的循环]

一、循环 1. filter 解释&#xff1a;filter 方法会创建一个新的数组&#xff0c;其中包含满足指定条件的所有元素。这个方法非常适合循环遍历数组并根据特定条件过滤元素的情况。例如&#xff0c;可以使用 filter 方法来找出数组中所有大于特定值的元素&#xff0c;或者找出…

华为bgp之多级RR及团体属性、正则表达式多种应用案例

1、实现总部和分部的oa、财务网段互通 2、分部之间oa也能互通 3、分部之间不能互通财务 主要用到bgp自定义团体属性、一级二级RR配置、bgp正则表达式匹配规则 R1 router id 1.1.1.1 //配全局地址池&#xff0c;又可以给ospf用也可以给bgp用 interface GigabitEthernet0/0/0 …

延迟加载:提升性能的隐形利器

引言 想象一下&#xff0c;你正在玩一款大型电子游戏。如果游戏在启动的时候就加载了所有的关卡、角色和道具&#xff0c;那玩家可能需要等待很长时间才能开始游戏&#xff0c;而且大部分内容可能在游戏的初期都不会被用到。显然&#xff0c;这样的做法既低效又耗时。 而延迟加…

位移贴图还原电影3D角色

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 位移贴图&#xff08;Displacement Map&#xff09;在电影制作中是一…