Unity - Cinemachine实现相机抖动
普通相机抖动脚本较易实现,但在使用cinemachine相机下,其Transform组件不可被代码修改,那么Cinemachine的相机抖动如何实现呢?本文结合实际项目,对实现相机抖动的三大步骤进行系统讲解:
- 项目地址:Hero - SouthBegonia
配置流程
项目背景:一款2D像素动作游戏,我们操控着Player(必须带有Collider组件),游戏相机为Cinemachine 2DCamera(关于其配置方法此处不做赘述,推荐文章在末尾参考处)
在相机上添加监听脚本
在我们使用的虚拟相机 CM vcam1 上添加组件:AddComponent->CinemachineImpulse Listener
- CinemachineImpulse Listener:监听脚本内震动信号(方法调用),使得抖动在此相机上发生
- Channel Mask:通道遮罩,此处最好默认为EveryThing
- Gain:可获得震动信号的数目,0为屏蔽,1表示某时段仅能进行一个抖动运动
- Use 2D Distance:用于2D游戏,忽略相机Z轴的抖动

在震动信号发生物体上添加脚本
震动信号发生物体(调用震动函数的物体)为Player,因此需要在Player上添加组件:AddComponent->Cinemachine Collision Impulse Source(注:必须挂到含Collider的物体上),然后在Raw Signal右侧齿轮->New Noise Settings 添加震动配置器,默认名CM vcam1 Raw Signal
- Cinemachine Collision Impulse Source:含有抖动函数、震动配置器的关键脚本
- Raw Signal:震动配置器,配置震动参数的关键部件,我们打开刚上面新建的CM vcam1 Raw Signal,可看到震动方式的各类参数。我们以Position Y,即上下抖动为例,添加Components后可设置其Frequency震频及Amplitude震幅,并且勾选右侧方框可将其设置为正弦波
- Attack:抖动开始的变化曲线及时间
- Sustain Time:抖动的持续时间
- Decay:抖动衰退的变化曲线及时间


调用震动方法:
在Player内引用震动核心脚本,并在合适位置调用震动方法
private Cinemachine.CinemachineCollisionImpulseSource MyInpulse;
private void Start()
{
MyInpulse = GetComponent<Cinemachine.CinemachineCollisionImpulseSource>();
}
private void Update()
{
//按下右键产生相机抖动,抖动方式依照上面CM vcam1 Raw Signal内配置信息
if (Input.GetMouseButtonDown(1))
MyInpulse.GenerateImpulse();
}
至此,我们在游戏内操控Player,按下右键即可实现相机抖动。当然除了上面无参的GenerateImpulse()方法,还有两个带参的方法:
//假若使用传递velocity的方法,其震动方式为velocity和CM vcam1 Raw Signal的混合
public void GenerateImpulse(Vector3 velocity);
public void GenerateImpulse(Vector3 position, Vector3 velocity);
此外,还有可能出现bug:还尚未调用震动函数,游戏开始时就自动产生抖动。其产生原因博主尚未在对应脚本内发现,但解决方式为关闭Player上的Cinemachine Collision Impulse Source脚本
总述
Cinemachine中实现相机抖动的基本流程:
- 在虚拟相机上添加监听脚本 CinemachineImpulse Listener
- 在Player上添加震动核心脚本Cinemachine Collision Impulse Source,并添加、设置震动配置器
- Player脚本合适位置调用震动函数
本例仅介绍了单Position方向上的抖动,读者可按需配置抖动的Position、Rotation、发生时间、维持时间、衰退时间等,实现自己想要的效果

参考
Unity - Cinemachine实现相机抖动的更多相关文章
- (转)Unity Cinemachine插件,实现单目标和多目标之间切换
Unity Cinemachine插件学习笔记,实现单目标和多目标之间切换*版本要求Unity2017.1及以上. 参考资料: [官方] Unity 2017.1正式版发布 Cinemachine插件 ...
- Unity2019.3缺少Cinemachine插件/AssetStore搜索不到
Unity2019.1版本都还自带Cinemachine,到2019.3就没有了(原因暂时未知),PackageManager里没有,到资源商店里搜索也找不到 解决方法: Windows>Pac ...
- Cheatsheet: 2018 05.01 ~ 07.31
JAVA Java Tips: Creating a Monitoring-Friendly ExecutorService Other Modeling the Card Game War in C ...
- Unity User Group深圳站——Timeline & Cinemachine分享
报名说明:UUG深圳站,2月分享活动正式启动,1月29日中午12:00前报名可获赠Unity精美纪念礼物一份~ 关于Unity Unity 是一款多平台的综合型游戏开发工具,它的出现对蓬勃发展的全球游 ...
- Unity 利用Cinemachine快速创建灵活的相机系统
在第一或第三人称ACT和FPS游戏中,相机的运动需求是多种多样的,Unity内置的Cinemachine包可以助你快速实现不同相机功能,例如范围追踪,边界设置等. 例如,考虑这样一个功能,这在很多游戏 ...
- Unity 基于Cinemachine计算透视摄像机在地图中的移动范围
Unity中Cinemachine的基础功能介绍可详见之前写的博客: https://www.cnblogs.com/koshio0219/p/11820654.html 本篇的重点是讨论,在给定规则 ...
- cinemachine unity
scrips extending timeline Extending Timeline with your own playables Data Audio ----playable beh ...
- [翻译]:Cinemachine 官方文档(0)
目录 Overview : Installation and Getting Started :安装并开始 User Guide :用户指南 What is Cinemachine? : 什么是Cin ...
- Community Stories: Cinemachine and Timeline——Community Stories: Cinemachine and Timeline
Community Stories: Cinemachine and Timeline 社区故事:Cinemachine 和 Timeline Adam Myhill, 八月 25, 2017 原文: ...
随机推荐
- Windows SDK version 8.1 下载地址
Windows SDK version 8.1 下载地址 https://go.microsoft.com/fwlink/p/?LinkId=323507
- KMP算法复习笔记
KMP 算法 KMP 算法是一种改进的字符串匹配算法,KMP 算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了 ...
- [BZOJ1054] 移动玩具
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2741 Solved: 1537[Submit][Stat ...
- 05jmeter-responses中有多组json数据,提取同一条json数据的两个字段
某接口返回结果如上图,取id和groupNo 1.读取确定的某条json数据:如取第一条,一个JSON Extractor即可实现 2.随机读取某条json数据: 需要两个JSON Extractor ...
- javascript学习总结之Object.assign()方法详解
最近再写ES6的文章时候发现自己对Object.assign()方法不太了解,之前也没有接触过所以就就查阅了相关的资料,为了自己以后肯能会用到以及对知识进行巩固,所以在这里记录下自己学习的点点滴滴,毕 ...
- Spring Cloud zuul网关服务 一
上一篇进行Netflix Zuul 1.0 与 gateway的对比.今天来介绍一下 zuul的搭建及应用 Zuul 工程创建 工程创建 cloud-gateway-zuul.还是基于之前的工程 po ...
- dubbo初学采坑记
写在前面的话 dubbo 现在是apache组织旗下的项目,相信国内也有很多人使用.最近一个同事离职,我就接手了他的项目.远程通讯就是用的dubbo框架来实现的.使用Intelij idea 写了一个 ...
- JVM学习记录3--垃圾收集器
贴个图 Serial收集器 最简单的收集器,单线程,收集器会暂停用户线程,称为"stop the world". ParNew收集器 Serial收集器的多线程版本,其它类似.默认 ...
- Spring Boot WebFlux 2.1.7 中文翻译文档
1. 前言 从一开始学习 Netty 到 rxjava.Rector,再到 java8 的 CompletableFuture,就深深的为响应式编程着迷,这种区别于传统的顺序式编程,没准未来能在编程世 ...
- ansible模块之command、shell、script、file、copy、fetch
前戏 ansible 批量在远程主机上执行命令 openpyxl 操作excel表格 puppet ansible slatstack ansible epel源 第一步: 下载epel源 wget ...