【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’, ‘…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...