【Unity小技巧】可靠的相机抖动及如何同时处理多个震动(附项目源码)

文章目录

  • 每篇一句
  • 前言
  • 安装虚拟相机
  • 虚拟相机震动测试
  • 代码控制震动
    • 清除震动
    • 控制震动的幅度和时间
  • 两个不同的强弱震动同时发生
  • 源码
  • 完结

每篇一句

围在城里的人想逃出来,站在城外的人想冲进去,婚姻也罢,事业也罢,人生的欲望大都如此。——钱钟书《围城》

前言

相机的抖动我相信大家都不陌生,网上其实已经有非常非常多的教程了,之前我也写过一篇文章,感兴趣的可以先去看看
unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)

但有时我们可能需要两个震动同时发生,例如,如果我们开启了大门并且又收到伤害,我们希望两个震动结合在一起

我在这里的规则是,更强的震动被优先考虑,但我们不要停止弱震动的进展,而是一起工作,
一旦完成了强震动,弱震动就会继续

最终效果
在这里插入图片描述

安装虚拟相机

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

新建虚拟相机
在这里插入图片描述

虚拟相机震动测试

这里body和Aim都不需要,就选择Do nothing

选择Noise ,选择 Basic Multi Channel Perlin
Noise Profile 选择自己喜欢的震动模式(可以挨个自己测试),这里我选择6D Wobble
在这里插入图片描述
AmplitudeGain:表示震动的幅度,设置为0不会震动
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://gitcode.net/unity1/unity-shake
在这里插入图片描述

完结

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

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

一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

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

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

相关文章

三.RocketMQ单机安装及集群搭建

RocketMQ单机安装及集群搭建 一&#xff1a;安装环境1.软硬件要求2.下载RocketMQ 二.安装单机MQ1.上传并解压2.目录介绍3.修改MQ启动时初始JVM内存4.启动NameServer与Broker5.测试RocketMQ 三.RocketMQ集群搭建1.集群概念特点2.集群模式分类3.集群工作流程4.双主双从集群搭建4.…

【C++】C++11常见特性

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

SPSS两独立样本t检验

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

残缺的棋盘-分治法【java】

题目描述&#xff1a; 使用分治法求解棋盘覆盖问题。 棋盘覆盖问题的描述&#xff1a; 残缺位置所在的四种不同情况&#xff1a; /*** 二分法不相似情况&#xff1a;残缺棋盘* by* 小俱的一步步*/ public class CanquedeQP {private int size;private int[][] board;//所使…

宝塔安装mongodb插件失败的解决办法

安装时始终不成功。 进入控制台进行安装 /www/server/php/71# pecl install mongodb WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update pecl/mongodb requires PHP (version > 7.2.0, …

太极培训机构展示服务预约小程序的作用如何

太极是适合男女老幼的&#xff0c;很多地方也有相关的学校或培训机构&#xff0c;由于受众广且不太受地域影响&#xff0c;因此对培训机构来说&#xff0c;除了线下经营外&#xff0c;线上宣传、学员获取和发展也不可少。 接下来让我们看下通过【雨科】平台制作太极教培服务预…

Apriori算法

Apriori算法是关联规则挖掘算法&#xff0c;也是最经典的算法。 Apriori算法是一种用于挖掘数据集中频繁项集的算法&#xff0c;进而用于生成关联规则。这种算法在数据挖掘、机器学习、市场篮子分析等多个领域都有广泛的应用。 Apriori算法是为了发现事物之间的联系的算法&am…

Uni-app智慧工地可视化信息平台源码

智慧工地的核心是数字化&#xff0c;它通过传感器、监控设备、智能终端等技术手段&#xff0c;实现对工地各个环节的实时数据采集和传输&#xff0c;如环境温度、湿度、噪音等数据信息&#xff0c;将数据汇集到云端进行处理和分析&#xff0c;生成各种报表、图表和预警信息&…

可视化 | 数据可视化降维算法梳理

文章目录 &#x1f4da;数据描述&#x1f407;iris&#x1f407;MNIST &#x1f4da;PCA&#x1f407;算法流程&#x1f407;图像描述 &#x1f4da;Kernel-PCA&#x1f407;算法流程&#x1f407;图像描述 &#x1f4da;MDS&#x1f407;算法流程&#x1f407;图像描述 &#…

《微聊》JMeter性能测试报告

文章目录 准备工作JMeter准备工作本地配置代理 测试规划测试方向预期方向异常处理 压力测试录制注册功能压力注册功能压力脚本录制录制功能压力测试脚本完善注册功能压力测试结果 登录功能压力录制登录功能压力测试脚本构造压力测试数据完善登录功能性能测试脚本登录功能压力测…

13年测试老鸟,软件测试经验总结分享,这几年你走了多少坑...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试阶段划分 …

NLP之LSTM原理剖析

文章目录 背景simpleRNN的局限性 LSTM手写一下sigmoid例子支持长记忆的神经网络解读3重门 背景 SimpleRNN有一定局限性&#xff0c; 图片上的文字内容: 图片标题提到“SimpleRNN是一种基础模型。它用于解决序列型问题&#xff0c;其中的每一步的输出会影响到下一步的结果。图…

7+共病思路。WGCNA+多机器学习+实验简单验证,易操作

今天给同学们分享一篇共病WGCNA多机器学习实验的生信文章“Shared diagnostic genes and potential mechanism between PCOS and recurrent implantation failure revealed by integrated transcriptomic analysis and machine learning”&#xff0c;这篇文章于2023年5月16日发…

【NI-DAQmx入门】传感器基础知识

1.什么是传感器&#xff1f; 传感器可将真实的现象&#xff08;例如温度或压力&#xff09;转换为可测量的电流和电压&#xff0c;因而对于数据采集应用必不可少。接下来我们将介绍您所需的测量类型及其对应的传感器类型。在开始之前&#xff0c;您还可以先了解一些传感器术语&…

SpringBoot面试题8:运行 Spring Boot 有哪几种方式?Spring Boot 需要独立的容器运行吗?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:运行 Spring Boot 有哪几种方式? 运行Spring Boot应用有多种方式,具体取决于你的需求和环境。以下是几种常见的运行Spring Boot应用的方式: 使…

Linux进程程序替换

一、单进程下的程序替换 使用execl进行程序替换&#xff0c;先执行execl前面的代码&#xff0c;在execl处替换成其它进程的代码和数据继续执行&#xff0c;后面的内容就不执行了&#xff0c;因此只打印before 二、程序替换原理 前面我们fork创建子进程&#xff0c;子进程会继承…

在全新ubuntu上用gpu训练paddleocr模型遇到的坑与解决办法

目录 一. 我的ubuntu版本![在这里插入图片描述](https://img-blog.csdnimg.cn/297945917309494ab03b50764e6fb775.png)二.首先拉取paddleocr源代码三.下载模型四.训练前的准备1.在源代码文件夹里创造一个自己放东西的文件2.准备数据2.1数据标注2.2数据划分 3.改写yml配置文件4.…

PostGreSQL:数据表继承

PostGreSQL手册的简史部分介绍到&#xff1a;被称为PostGreSQL的对象关系型数据库管理系统&#xff0c;由美国加州大学伯克利 分校编写的POSTGRES软件包发展而来。经过十几年的发展&#xff0c;PostGreSQL目前是世界上最先进的开源数据库。 The object-relational database man…

Vue 的双向数据绑定是如何实现的?

目录 1. 响应式数据 2. v-model 指令 3. 实现原理 4. 总结 Vue.js 是一款流行的前端 JavaScript 框架&#xff0c;它以其强大的双向数据绑定能力而闻名。双向数据绑定使得数据在视图和模型之间保持同步&#xff0c;并且任一方的变化都会自动反映到另一方。那么&#xff0c;…

2021-arxiv-GPT Understands, Too

2021-arxiv-GPT Understands, Too Paper&#xff1a; https://arxiv.org/abs/2103.10385 Code&#xff1a; https://github.com/THUDM/P-tuning Prompt 简单理解 举例来讲&#xff0c;今天如果有这样两句评论&#xff1a; 1. 什么苹果啊&#xff0c;都没有苹果味&#xff0c…