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

news2025/1/14 2:13:45

文章目录

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

每篇一句

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

前言

相机的抖动我相信大家都不陌生,网上其实已经有非常非常多的教程了,之前我也写过一篇文章,感兴趣的可以先去看看
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设置为最强烈的震动请求的幅度
    }

    // 请求相机震动,使用默认的持续时间0
    public 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.coloradmin.cn/o/1149388.html

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

相关文章

数字孪生协同仿真:复杂电机篇

​01.简介 电机仿真是现代机电工程研究领域中的重要环节&#xff0c;始于20世纪后半叶&#xff0c;为工程师提供了一种研究、设计和优化各种电机系统的新方式。时至今日&#xff0c;从传统的电动机到现代的电动汽车动力系统&#xff0c;电机仿真技术在电机设计、性能分析和控制…

JVS低代码表单中下拉框是如何配置的?

什么是表单下拉框 表单下拉框是一种用户界面元素&#xff0c;通常用于表单中&#xff0c;允许用户从一组预定义的选项中选择一个选项。表单下拉框由一个下拉箭头和一个选项列表组成&#xff0c;用户可以通过点击下拉箭头来展开选项列表&#xff0c;然后选择其中的一个选项。表…

Ansys Speos|Optimization小工具快速优化设计

概述 优化是一个有助于找到一个光学系统的最佳解决方案的实验过程&#xff0c;它主要是利用参数的变化而试图达到预期的结果。在Speos 2023 R2中提供三种可供选择的方法来执行此类分析。第一个是基于workbench创建的优化&#xff0c;可以参考文章&#xff08;基于Ansys Workben…

数据结构题型21-第八章 排序

文章目录 0 本章的知识点总结1 本章知识框架2 排序的基本概念3 插入排序3.1 直接插入排序 0 本章的知识点总结 1 本章知识框架 2 排序的基本概念 小试牛刀 3 插入排序 参考网站&#xff1a;排序直观网站 3.1 直接插入排序 自己分析A[0] A[1] A[2] A[3] A[4] A[5] A…

RTMP直播在虚拟数字人场景使用

虚拟数字人&#xff08;Virtual Digital Human&#xff09;&#xff0c;指的是一种基于数字技术创建的虚拟人物&#xff0c;他们有自己的外貌、声音&#xff0c;甚至是性格。虚拟数字人通常是通过计算机图形学、人工智能和其他先进技术来实现的。人们可以与这些虚拟数字人进行交…

笔记本电脑的键盘鼠标如何共享控制另外一台电脑

环境&#xff1a; 联想E14 x2 Win10 across 2.0 问题描述&#xff1a; 笔记本电脑的键盘鼠标如何共享控制另外一台电脑 解决方案&#xff1a; 1.下载across软件&#xff0c;2台电脑都按装&#xff0c;一台设为服务端&#xff0c;一台客户端 2.把配对好设备拖到右边左侧…

金属压铸件自动化3D全尺寸测量设备自动外观检测三维检测-CASAIM

铸造作为现代装备制造工业的基础共性技术之一&#xff0c;铸件产品既是工业制造产品&#xff0c;也是大型机械的重要组成部分&#xff0c;被广泛运用在航空航天、工业船舶、机械电子和交通运输等行业。 铸件形状复杂&#xff0c;一般的三坐标或者卡尺圆规等工具难以获取多特征…

10.30二叉树一些性质,找公共祖先(一般与搜索树),操作的复杂度,选择题细节

课上 一些结论&#xff0c;性质 n0,n1,n2指的是子结点的数量&#xff0c;n0没有子节点&#xff0c;叶子结点 n2*n2n11,若n1为奇数&#xff0c;则n为偶数&#xff0c;不然&#xff0c;则为奇数 满二叉树 没有度为1的结点&#xff0c;即每个结点要么没有孩子结点&#xff0c;要么…

2023 年 43 周

2023 年 43 周 普普通通的一周过去了&#xff0c;唯一需要感叹的&#xff0c;大概就是本年度余额只剩下 19%了&#xff1a; 学习进度 其实这周真的没什么特别大的进展&#xff0c;有种 here & there 的感觉&#xff0c;目前来说唯一能做的就是以锻炼为 anchor point 去寻找…

【Linux】NTP服务器配置、时间修改

查看当前系统时间date修改当前系统时间date -s "2018-2-22 19:10:30"查看硬件时间hwclock --show修改硬件时间hwclock --set --date "2018-2-22 19:10:30"同步系统时间和硬件时间hwclock --hctosys保存时钟clock –w1.设置NTP Server服务检查系统是否安装n…

动手学深度学习——第六次

python类和对象 python类和对象参数管理参数访问 卷积 python类和对象 参数管理 生成一个二维张量&#xff0c;然后传入有但隐藏层的多层感知机 参数访问 net[0] nn.Linear(4,8) net[1] nn.ReLU() net[2] nn.Linear(8,1) net[2].state_dict()访问最后一层的参数即权重和偏置 …

科大讯飞勾勒生成式AI输入法“模样”,开启下一代输入法革命

回顾国内第三方输入法赛道近十余年的发展&#xff0c;移动互联网的市场红利催生了科大讯飞、百度、搜狗等颇具规模和实力的头部厂商。与此同时&#xff0c;历经多年、多方角逐&#xff0c;第三方输入法市场进入存量阶段&#xff0c;升级技术、优化用户体验来挖掘存量&#xff0…

MatrixOne Meetup回顾 | 上海站

9月24日&#xff0c;MatrixOne 社区在上海成功举办了里程碑式的第一次 Meetup。活动吸引了数十位外部小伙伴一同交流探讨数据库行业内发展趋势、技术、以及应用的方方面面。通过分享、交流、互动&#xff0c;加深了参与者对MatrixOne的了解。未来&#xff0c;我们将继续在多个城…

半导体产线应用Power Link 转EtherCAT协议网关数字化转型

随着数字化转型的推进&#xff0c;越来越多的企业开始意识到数字化转型的重要性&#xff0c;并将其作为发展战略的关键之一。半导体产线作为一个高度自动化的生产系统&#xff0c;自然也需要数字化转型来提高效率、降低成本和提高质量。Power Link 转EtherCAT协议网关是半导体产…

高斯过程 Gaussian Process

What does GP do? GP是一种回归方法&#xff0c;但也能够用来分类和聚类均值表示数据最有可能出现的位置 多变量高斯分布 X ∼ N ( μ , Σ ) X\sim N(\mu,\Sigma) X∼N(μ,Σ): 包含的信息有每个变量的均值和协方差矩阵均值决定分布中心协方差矩阵确定形状 Marginalizatio…

Selenium自动化测试:如何搭建自动化测试环境?

最近也有很多人私下问我&#xff0c;selenium学习难吗&#xff0c;基础入门的学习内容很多是3以前的版本资料&#xff0c;对于有基础的人来说&#xff0c;3到4的差别虽然有&#xff0c;但是不足以影响自己&#xff0c;但是对于没有学过的人来说&#xff0c;通过资料再到自己写的…

c++-二叉树进阶

文章目录 前言一、二叉搜索树1、二叉搜索树介绍2、二叉搜索树循环实现3、二叉搜索树递归实现4、二叉搜索树的性能分析5、二叉搜索树的应用6、二叉树练习题6.1 根据二叉树创建字符串6.2 二叉树的层序遍历6.3 二叉树的层序遍历 II6.4 二叉树的最近公共祖先6.5 二叉搜索树与双向链…

项目文章 | Plant Physiology 华南农业大学揭示组蛋白修饰调节水稻器官大小的表观遗传机制

发表单位&#xff1a;华南农业大学生命科学学院 发表日期&#xff1a;2023年10月24日 期刊&#xff1a;Plant Physiology 影响因子&#xff1a;7.4 2023年10月24日&#xff0c;华南农业大学生命科学学院郑少燕副教授/刘振兰教授团队在Plant Physiology上发表题为“SET DOMA…

系列三十二、代理(二)静态代理

一、静态代理 1.1、概述 静态代理是由程序员创建或者工具生成代理类的源码&#xff0c;再编译代理类。在程序运行前就已经存在代理类的字节码文件了&#xff0c;即代理类和被代理类的关系在运行前就确定了。 简单理解&#xff1a;在程序运行前&#xff0c;代理类就存在了&…

Linux虚拟机安装centos7配置及常用命令

一.VMWare的安装 详情请看上期&#xff1a;VM虚拟机的安装与配置及操作系统的安装-CSDN博客 二.centos7安装 1.创建新的虚拟机 选择自定义&#xff0c;然后下一步 默认选择就行&#xff0c;直接下一步 选择稍后安装&#xff0c;然后直接下一步 选择Linux&#xff0c;然后向上…