【Unity小技巧】可靠的相机抖动及如何同时处理多个震动
文章目录
- 每篇一句
- 前言
- 安装虚拟相机
- 虚拟相机震动测试
- 代码控制震动
- 清除震动
- 控制震动的幅度和时间
- 两个不同的强弱震动同时发生
- 源码
- 完结
每篇一句
围在城里的人想逃出来,站在城外的人想冲进去,婚姻也罢,事业也罢,人生的欲望大都如此。——钱钟书《围城》
前言
相机的抖动我相信大家都不陌生,网上其实已经有非常非常多的教程了,之前我也写过一篇文章,感兴趣的可以先去看看
unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)
但有时我们可能需要两个震动同时发生,例如,如果我们开启了大门并且又收到伤害,我们希望两个震动结合在一起
我在这里的规则是,更强的震动被优先考虑,但我们不要停止弱震动的进展,而是一起工作,
一旦完成了强震动,弱震动就会继续
最终效果

安装虚拟相机
实现相机抖动的最简单方法是使用cinemachine虚拟相机
导入cinemachine插件
搜索Cinemachine,安装并导入

新建虚拟相机

虚拟相机震动测试
这里body和Aim都不需要,就选择Do nothing
选择Noise ,选择 Basic Multi Channel Perlin
Noise Profile 选择自己喜欢的震动模式(可以挨个自己测试),这里我选择6D Wobble

AmplitudeGain:
FrequencyGain:表示震动的频率

代码控制震动
新增代码控制
using System.Collections.Generic;
using System.Linq;
using Cinemachine;
using UnityEngine;public class CameraShaker : MonoBehaviour
{private readonly List<ShakeRequest> _requests = new List<ShakeRequest>(); // 用于存储震动请求的列表private CinemachineBasicMultiChannelPerlin _noise; // CinemachineBasicMultiChannelPerlin组件,用于控制相机震动效果private void Awake(){// 获取CinemachineBasicMultiChannelPerlin组件_noise = GetComponent<CinemachineVirtualCamera>().GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();}private void Update(){if (_requests.Count == 0){_noise.m_AmplitudeGain = 0; // 如果没有震动请求,将AmplitudeGain设置为0,停止震动效果return;}var strongestShake =_requests.Max(shake => shake.ShakeAmount); // 获取最强烈的震动请求_noise.m_AmplitudeGain = strongestShake; // 将AmplitudeGain设置为最强烈的震动请求的幅度}// 请求相机震动,使用默认的持续时间0public void RequestShake(float amount){RequestShake(amount, 0);}// 请求相机震动,指定震动的幅度和持续时间public void RequestShake(float amount, float time){_requests.Add(new ShakeRequest // 向列表中添加一个新的ShakeRequest{ShakeAmount = amount, // 震动的幅度ShakeTime = time // 震动的持续时间});}// 震动请求类,用于存储一个震动请求的幅度和持续时间private class ShakeRequest{public float ShakeAmount { get; set; } // 请求的震动幅度public float ShakeTime { get; set; } // 请求的震动持续时间}
}
挂载点击事件,配置参数,b的振幅比a大

效果,大的震动会替换小的震动效果,而且无限震动

清除震动
都按预期工作现在我们需要以某种方式
基本上清除震动以摆脱
那些不应该再存在的震动,
修改脚本
[SerializeField]
private float _shakeDecreaseAmount = 10f;// 震动幅度减少的速率,每秒减少的幅度private void Update()
{//。。。// 遍历所有的震动请求for (var i = _requests.Count - 1; i >= 0; i--){var request = _requests[i];// 减少震动请求的持续时间request.ShakeTime -= Time.deltaTime;// 如果震动请求的持续时间小于等于0,开始减少震动幅度if (request.ShakeTime <= 0){request.ShakeAmount = Mathf.Max(0, request.ShakeAmount - Time.deltaTime * _shakeDecreaseAmount);}// 如果震动幅度已经减少到0,从列表中移除该震动请求if (request.ShakeAmount == 0) _requests.Remove(request);}
}
效果,震动一会,消失

控制震动的幅度和时间
新增脚本CameraShakeRequester,控制震动的幅度和时间
using UnityEngine;public class CameraShakeRequester : MonoBehaviour
{[SerializeField]private float _shakeAmount; // 请求震动的幅度[SerializeField]private float _shakeTime; // 请求震动的持续时间[SerializeField]private CameraShaker _shaker; // CameraShaker组件,用于控制相机震动效果// 请求相机震动public void RequestShake(){_shaker.RequestShake(_shakeAmount, _shakeTime);}
}
挂载脚本,配置参数,并重新修改配置A、B按钮的点击事件

效果

两个不同的强弱震动同时发生
我们A的震动调成振幅为1持续5秒,
B的震动调成振幅为10持续1秒

运行效果,你会发现,当强弱震动同时产生时,强震动先覆盖弱震动,强震动完成后,再继续执行剩下时间的弱震动,它们能够很好地协同工作

源码
整理好了,我会放上来
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。点赞越多,更新越快哦!当然,如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
好了,我是向宇,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

相关文章:
【Unity小技巧】可靠的相机抖动及如何同时处理多个震动
文章目录 每篇一句前言安装虚拟相机虚拟相机震动测试代码控制震动清除震动控制震动的幅度和时间 两个不同的强弱震动同时发生源码完结 每篇一句 围在城里的人想逃出来,站在城外的人想冲进去,婚姻也罢,事业也罢,人生的欲望大都如此…...
Megatron-LM GPT 源码分析(四) Virtual Pipeline Parallel分析
引言 本文接着上一篇【Megatron-LM GPT 源码分析(三) Pipeline Parallel分析】,基于开源代码 GitHub - NVIDIA/Megatron-LM: Ongoing research training transformer models at scale ,通过GPT的模型运行示例,从三个维…...
IOC课程整理-8 Spring Bean作用域
1 Spring Bean作用域 2" singleton " Bean作用域 3" prototype " Bean作用域 • 注意事项 • Spring 容器没有办法管理 prototype Bean 的完整生命周期,也没有办法记录实例的存在。销毁回调方法将不会执行,可以利用 BeanPostProces…...
本地websocket服务端暴露至公网访问【内网穿透】
本地websocket服务端暴露至公网访问【cpolar内网穿透】 文章目录 本地websocket服务端暴露至公网访问【cpolar内网穿透】1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功…...
C/C++跨平台构建工具CMake-----灵活添加库并实现开发和生产环境的分离
目录 1.概述2.创建项目3 配置运行项目3.1 编写开平方根示例代码3.2 编写CMake构建脚本 4.使用子模块实现求平方根的功能4.1 在子模块中实现两种求平方根的方法4.2 构建Mathfunctions子模块4.3 在根目录引用子模块的功能4.3.1 编写构建脚本4.3.2 编写C代码使用MathFunctions库中…...
javascript判断对象中是否存在某个字段
1. in 如果指定的属性在指定的对象或其原型链中,则 in 运算符返回 true。 const car { make: Honda, model: Accord, year: 1998 };console.log(make in car); // truedelete car.make; if (make in car false) {car.make Suzuki; }console.log(car.make); //…...
网络基础-2
IEEE制定了一个名为GARP的协议框架,该框架协议包含了两个具体协议,GMRP和GVRP。GVRP可以大大降低VLAN配置过程中的手工的工作量。 IP本身是一个协议文件的名称,该协议主要定义阐释了IP报文的格式。 类型网络号位数网络号个数主机号位数每个…...
【MySQL索引与优化篇】索引的分类与设计原则
索引的分类与设计原则 文章目录 索引的分类与设计原则1. 索引的分类2. MySQL8.0索引新特性2.1 支持降序索引2.2 隐藏索引 3. 索引的设计原则3.1 适合索引的10个设计原则3.2 限制索引的数目3.3 不适合使用索引的情况 1. 索引的分类 从 功能逻辑 上说,索引主要有 4 种…...
基于Java的民航售票管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...
应用案例|基于三维机器视觉的机器人引导电动汽车充电头自动插拔应用方案
Part.1 项目背景 人类对减少温室气体排放、提高能源效率以及减少对化石燃料的依赖,加速了电动汽车的普及,然而,电动汽车的充电依然面临一些挑战。传统的电动汽车充电通常需要人工干预,插入和拔出充电头,这不仅可能导致…...
基于Java的流浪动物救助管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...
关于错误javax.net.ssl.SSLException: Received close_notify during handshake
今天开发的小伙伴遇到一问题,报错内容是: javax.net.ssl.SSLException: Received close_notify during handshake at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source) at sun.securi…...
JAVA实现校园失物招领管理系统 开源
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 招领管理模块2.2 寻物管理模块2.3 系统公告模块2.4 感谢留言模块 三、界面展示3.1 登录注册3.2 招领模块3.3 寻物模块3.4 公告模块3.5 感谢留言模块3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 基于VueSpri…...
基于Java的体育竞赛成绩管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...
网络设备远程登录和管理-双厂商
✍ 设备开局都要做哪些配置? ✍ 思科华为的配置命令有什么区别? ✍ 实战演示不同操作系统的配置; -- 本地设备调试 - console接口配置 -- 远程设备管理 - telnet 不加密 | ssh 加密的 -- web界面调试 - 补充的作用 -- SD…...
深度学习使用Keras进行多分类
之前的文章介绍了使用Keras解决二分类问题。那么对于多分类问题该怎么解决?本文介绍利用深度学习----Keras进行多分类。 1. 准备数据集 为了演示,本次选用了博文keras系列︱图像多分类训练与利用bottleneck features进行微调(三)中提到的数据集,原始的数据集将所有类别的…...
Node模块化开发
认识模块化开发 JavaScript 的模块化是一种将代码组织成独立、可重用的模块单元的开发方法。模块化开发有助于提高代码的可维护性、可扩展性和可重用性,以及减少命名冲突和全局作用域中的变量污染问题。JavaScript 的模块化开发可以通过多种方式实现,其…...
震惊!原来BUG是这么理解的!什么是BUG?软件错误(BUG)的概念
较为官方的概念: 当且仅当规格说明是存在的并且正确,程序与规格说明之间的 不匹配才是错误。 当需求规格说明书没有提到的功能,判断标准以最终用户为准:当程序没有实现其最终用户合理预期的 功能要求时,就是软…...
JEnv使用初体验
Java多版本控制器初体验 1、前言 由于公司项目使用jdk8版本,而日常学习会使用其他版本例如jdk17等,往常都是修改环境配置目录实现。 2、下载资料 链接:https://pan.baidu.com/s/1UqzHv8K8WBu-75Ysyc_h3A 提取码:ra6a 3、安装 …...
CCF CSP认证历年题目自练 Day39
题目 试题编号: 201312-5 试题名称: I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个R行C列的地图,地图的每一个方格可能是’#’, ‘’, ‘-’, ‘|’, ‘.’, ‘S’, ‘…...
MCP3302/MCP3304 13位差分ADC驱动开发与硬件协同设计指南
1. MCP330X库深度解析:面向嵌入式工程师的13位差分ADC驱动开发指南MCP330X系列Arduino库是专为Microchip MCP3302与MCP3304高精度模数转换器设计的底层驱动框架。该库并非简单封装,而是基于对SPI协议时序、ADC采样原理及嵌入式资源约束的深刻理解所构建的…...
我的STM32F407项目踩坑记:FreeRTOS下实现U盘OTA升级,这些细节你一定要注意
STM32F407实战:FreeRTOS环境下U盘OTA升级的九大陷阱与解决方案 去年接手一个工业控制器项目时,客户突然要求增加U盘固件升级功能。本以为凭借之前的IAP开发经验能轻松搞定,结果在FreeRTOS环境下踩坑无数——从任务调度混乱到USB驱动冲突&…...
N16 LCD
一、LCD简介LCD 液晶显示屏。i.MX6ULL 里驱动它的模块叫:eLCDIF Enhanced LCD Interface(增强型 LCD 接口,芯片内置的硬件控制器)分辨率:1920 * 1080 1280*720色域:帧率/刷新率:LCD 扫…...
三维建模师必看:Blender中坐标变换的数学原理与操作技巧
三维建模师必看:Blender中坐标变换的数学原理与操作技巧 在Blender的世界里,每个顶点、每条边、每个面都在三维空间中占据着精确的位置。当我们移动一个物体、缩放一个模型或旋转一个摄像机时,背后是一套精密的数学机制在运作。对于艺术背景的…...
YOLO26涨点改进| ICCV 2025 | 独家创新首发、特征融合改进篇| 引入I-SCA / V-SCA特征融合模块,含多种创新改进,助力图像融合、小目标检测、图像分割、图像分类高效涨点改进
一、本文介绍 🔥本文给大家介绍使用 I-SCA 和 V-SCA 模块(IVSCAM)改进 YOLO26 网络模型的核心作用,是在特征提取与融合阶段增强不同层级或不同来源特征之间的交互能力,使模型能够以更明确的引导方式突出关键目标区域。其中,I-SCA 更适合强化类似显著区域、热目标或高响…...
K8s混沌工程叛变:随机宕机暴露的职场PUA
在云原生架构席卷软件世界的今天,Kubernetes(K8s)以其强大的编排能力,成为分布式系统稳定运行的基石。随之兴起的混沌工程,则扮演着“压力测试师”的角色,通过主动注入Pod宕机、网络延迟等故障,…...
告别手输!用Shell脚本自动化你的GROMACS伞形采样全流程(附赠配置文件)
告别手输!用Shell脚本自动化你的GROMACS伞形采样全流程(附赠配置文件) 在计算化学领域,GROMACS作为分子动力学模拟的利器,其强大的功能背后往往伴随着繁琐的命令行操作。特别是进行伞形采样(Umbrella Sampl…...
保姆级教程:在GD32F103上用Keil MDK5和FreeRTOS 202411.00创建你的第一个多任务LED闪烁项目
保姆级教程:在GD32F103上用Keil MDK5和FreeRTOS 202411.00创建你的第一个多任务LED闪烁项目 嵌入式开发的世界里,实时操作系统(RTOS)正变得越来越重要。对于刚接触GD32系列芯片或FreeRTOS的开发者来说,如何快速搭建一个…...
项目经理面试必备:5 大核心问题拆解与高通过率回答策略
1. 项目经理面试的核心问题解析 面试官抛出"请描述你负责过的一个典型项目"时,往往不是想听流水账。我当年第一次面试时就犯过这个错误,花了10分钟详细描述项目背景,结果面试官直接打断:"所以你到底做了什么&#…...
不用Root!教你用ADB命令手动安装Google TTS中文语音包
免Root实现Google TTS中文语音引擎的完整部署指南 你是否遇到过在国产定制Android系统上无法使用Google文字转语音功能的困扰?许多厂商预装的语音引擎发音生硬,而Google TTS的中文语音包又常常因为系统限制无法正常安装。本文将带你绕过这些限制…...
