【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.rhkb.cn/news/231889.html

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

相关文章

tolist()读取Excel列数据,(Excel列数据去重后,重新保存到新的Excel里)

从Excel列数据去重后&#xff0c;重新保存到新的Excel里 import pandas as pd# 读取Excel文件 file r"D:\\pythonXangmu\\quchong\\quchong.xlsx" # 使用原始字符串以避免转义字符 df pd.read_excel(file, sheet_namenameSheet)# 删除重复值 df2 df.drop_duplica…

大一,如何成为一名fpga工程师?

​ 1、数电&#xff08;必须掌握的基础&#xff09;&#xff0c;然后进阶学模电&#xff08;选学&#xff09;&#xff0c; 2、掌握HDL&#xff08;HDLverilogVHDL&#xff09;可以选择verilog或者VHDL&#xff0c;建议verilog就行。 3、掌握FPGA设计流程/原理&#xff08;推…

多平台多账号一站式短视频管理矩阵营销系统

矩阵营销系统多平台多账号一站式管理&#xff0c;一键发布作品。智能标题&#xff0c;关键词优化&#xff0c;排名查询&#xff0c; 混剪生成原创视频&#xff0c;账号分组&#xff0c;意向客户自动采集&#xff0c;智能回复&#xff0c;多账号评论聚合回复&#xff0c; 免切…

windows 在指定目录下打开 cmd,不用层层进入

一、进入需要打开的目录下 二、在选中的状态下&#xff0c;输入 cmd&#xff0c;然后回车即可

MATLAB习题操作实战

2.1创建一个有7个元素的一维数组&#xff0c;并做如下处理:直接寻访一维数组的第6个元素;寻访一维数组的第1、3、5个元素;寻访一维数组中第4个至最后1个元素;寻访一维数组中大于70的元素。 % 创建一维数组 array [50, 60, 70, 80, 90, 100, 110];% 直接寻访一维数组的第6个元…

如何充值GPT会员账号?

详情点击链接&#xff1a;如何充值GPT会员账号&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己的…

书生·浦语大模型全链路开源体系(陈恺|上海人工智能实验室 青年科学家)-听课笔记

大模型重要性 大模型确实已成为发展通用人工智能&#xff08;AGI&#xff09;的重要途径。它们通过整合和处理大量数据&#xff0c;学习语言、图像、声音等多种模式的表示&#xff0c;以此来模拟人类的学习和思维方式。通过不断地学习和优化&#xff0c;这些模型能够在各种任…

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成 --【本人】

一、插件安装 1.1 搜索插件 mybatis 安装 1.2 接受安装 1.3 再次进入&#xff0c;说明安装好了 1.4 与鱼皮不同点 1&#xff09;mybatis 版本不一致 鱼皮&#xff1a; 本人&#xff1a; 2&#xff09;鱼皮需重启安装 本人不需要 1.5 【需完成 三、步骤&#xff0c;再来看】 …

系列七、Ribbon

一、Ribbon 1.1、概述 Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具&#xff0c;是Netflix发布的一款开源项目&#xff0c;其主要功能是提供客户端的软件负载均衡算法和服务调用&#xff0c;Ribbon客户端组件提供一系列完善的配置项&#xff0c;例如&#xff1a…

linux用户态与内核态通过字符设备交互

linux用户态与内核态通过字符设备交互 简述 Linux设备分为三类&#xff0c;字符设备、块设备、网络接口设备。字符设备只能一个字节一个字节读取&#xff0c;常见外设基本都是字符设备。块设备一般用于存储设备&#xff0c;一块一块的读取。网络设备&#xff0c;Linux将对网络…

异常控制流ECF

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com&#xff0c;github地址为https://github.com/jintongxu。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 一、异常控制流&#xff08;ECF) 现代…

【年终总结系列 2023】新起点,同时追寻更高的起点

什么是攀登者&#xff0c;用一个场景来概括就是&#xff1a;经常弯腰低头手脚并用向上攀爬&#xff0c;待到山的顶峰后终于可以舒展一下身体&#xff0c;但若舒展的时间过长便会觉得无聊&#xff0c;此时向远处眺望&#xff0c;发现了更高的山峰&#xff0c;便又充满了激情。对…

web前端——clear可以清除浮动产生的影响

clear可以解决高度塌陷的问题&#xff0c;产生的副作用要小 未使用clear之前 <!DOCTYPE html> <head><meta charset"UTF-8"><title>高度塌陷相关学习</title><style>div{font-size:50px;}.box1{width:200px;height:200px;backg…

排序算法——关于快速排序的详解

目录 1.基本思想 2.基本原理 2.1划分思想 2.2排序过程 &#xff08;1&#xff09;选择基准值 &#xff08;2&#xff09;分割过程&#xff08;Partition&#xff09; &#xff08;3&#xff09;递归排序 &#xff08;4&#xff09;合并过程 2.3具体实例 2.4实现代码 2.5关键要…

软件工程:用例图相关知识和多实例分析

目录 一、用例图相关知识 1. 基本介绍 2. 常用符号 二、用例图实例分析 1. 新闻管理系统 2. 医院病房监护系统 3. 实验上机安排系统 4. 远程网络教学系统 一、用例图相关知识 1. 基本介绍 用例图&#xff08;use case diagram&#xff09;是用户与系统交互的最简表示…

HarmonyOS 组件通用属性之位置设置

本文 我们来说 通用属性中的位置设置 主要是针对组件的对齐方式 布局方向 显示位置 做过WEB开发的 对流式布局应该都不陌生 就是 一行放内容 不够放就换行 我们可以先这样写 Entry Component struct Index {build() {Row() {Column() {Stack(){Text("你好")Text(&…

Springboot整合MQ学习记录

Mq介绍 RabbitMQ是由erlang语言开发&#xff0c;基于AMQP&#xff08;Advanced Message Queue 高级消息队列协议&#xff09;协议实现的消息队列&#xff0c;它是一种应用程序之间的通信方法&#xff0c;消息队列在分布式系统开发中应用非常广泛。支持Windows、Linux/Unix、MA…

<HarmonyOS主题课>1~3课后习题汇总

&#xff1c;HarmonyOS第一课&#xff1e;1~10课后习题汇总 1使用DevEco Studio高效开发 单选题 用哪一种装饰器修饰的组件可作为页面入口组件&#xff1f;&#xff08;B&#xff09; A. ComponentB. EntryC. PreviewD. Builder ArkTS Stage模型支持API Version 9&#xf…

智能座舱的下一个价值“爆点”——让“光”更智能

汽车智能化快速升级&#xff0c;智能座舱作为人机交互的主要窗口&#xff0c;交互模态、用户体验也呈现多维度升级。 例如&#xff0c;今年下半年上市的多款高端智能车型纷纷基于高性能座舱硬件平台&#xff0c;集成了AR-HUD、DMS/OMS等高阶功能&#xff0c;同时结合超大屏/多…

简单介绍Java 的内存泄漏

java最明显的一个优势就是它的内存管理机制。你只需简单创建对象&#xff0c;java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单&#xff0c;因为在Java应用中经常发生内存泄漏。 本教程演示了什么是内存泄漏&#xff0c;为什么会发生内存泄漏以及如何预防…