What is Feel?
Feel是一个即用型解决方案,让你的Unity项目提高游戏体验,增强玩家获得的反馈感,例如相机震动,屏幕闪烁,淡入淡出,等等几十种效果。这是一个模块化、用户友好、易于扩展的系统。
本文旨在让你快速入门,从全局快速了解这个插件,以及基本用法.
官方文档:Feel Documentation | Feel Documentation
How to install Feel?
首先将插件导入项目,本文基于Feel 4.3,要求Unity版本高于22.3.23f1.本插件更新着实有点快,目前最新的版本已经达到5.0要求Unity版本高于Unity6000.0.23f1
https://feel.moremountains.com/feel-releases,可查看版本对照表.
要求你的项目添加这几个库(这不是必须的,但是有些部分依赖这些库,且Demo中大多使用了这些部分,所以不引入可能会导致报错):Post Processing,Cinemachine,TextMesh Pro等.显然你不能对这些依赖一点都不了解.
Post Processing:查看这个视频
[Unity 活动]-社区直播 Post Processing 后处理的介绍和使用_哔哩哔哩_bilibili
Cinemachine:可以阅读这篇文章
【游戏开发教程】Unity Cinemachine快速上手,详细案例讲解(虚拟相机系统 | 新发出品 | 良心教程)_cinemachine教程-CSDN博客
这里一键导入全部依赖,需要你等待几分钟,我推荐使用这个操作.
然后打开Demo:MMFPlayerDemo(Feel/MMFeedbacks/Demos/MMFeedbacksDemo),查看效果.
这个场景展示了大部分效果.
URP and HDRP
Feel支持所有渲染管线,但是Demo都是基于内置渲染管线制作的,要注意的是如果是非内置渲染管线项目那么无需导入Post Processing,它们有自己的后处理系统.然后正常导入就行了.
虽然多数Demo都是内置渲染管线,但是官方也为我们制作了URP和HDRP的Demo,位置在:
FaIconHDRP和StrikeURP两个场景.
Contents of the asset
资产包括6部分,下面按顺序使用0-5代称
0: 一个包含许多演示的文件夹,每个演示都包含在自己的文件夹和子文件夹中。这些演示展示了Feel的各种功能。可以在Demos | Feel Documentation了解更多信息
1: 包含特定于高清晰度渲染管道的演示。需要将Feel导入HDRP项目中才能运行它们。
2: 包含特定于通用渲染管道的演示。需要在URP项目中导入Feel来运行它们。
3: 资产的主要部分。它包含反馈系统(Feedbacks system)、全部的反馈组件(feedback)和演示场景。如果你想使用反馈( Feedback),这是唯一必须保留的文件夹。可以安全地删除其中的Demos文件夹。
4: 有各种工具
5: 为iOS或Android游戏添加触觉反馈的最佳方式。您可以在其专用网站Nice Vibrations, the best way to add vibrations to your Unity game, for iOS, Android, gamepad rumble, by More Mountains上了解更多信息。
你也发现了资产中有很多Demo,理论上所有Demo目录都可以删除,但是没什么必要,你非要删除的话查看官方说的这部分:
Demo介绍
官方做的很好:Demos | Feel Documentation
重点介绍FeelGettingStartedTutorial场景,了解了这个场景你就能快速上手基本用法(这确实很简单).
FeelGettingStartedTutorial
搜索该场景并打开,你应该会看到
运行起来只有一个简单的操作:按空格或者鼠标左键点击任一地方,然后你会发现了这Amazing的效果.
你可以简单查看Hero上的GettingStartedTutorialHeroReference脚本,这个脚本其实不是重点.
这才是重点,这个脚本只是在按空格的时候给到一个向上的力,然后调用了这个方法,这个方法被调用那么会触发了所有的FeedBack(反馈).调用这个方法是我们关心的.
MMFPlayer脚本(它是MMFeedbacks的子类)就是一个容器,下面承载了所有的反馈,目前这个JumpFeedback的MMFPlayer脚本只承载了Rotation和Sound两个反馈,你可以在运行模式下点击绿色的Play按钮,这样所有的反馈都会被播放(相当于PlayFeedbacks方法被调用).
让我们展开看看Rotation反馈,简单的说这个反馈就是旋转某个Transform.
先简单对照一下两个反馈,可以看到都有一个Settings和Randomness,可以看出这应该是继承下来的,所有反馈都有的共性.
我们来关注特性,将需要旋转的Transform拖到Target字段,同时下面三个AnimateX,Y,Z是对应三个旋转轴,显然YZ被禁用了,所有只会绕X轴旋转
然后是这个Curve属性,这将设置一个曲线同时关注Remap Curve Zero和Remap Curve One,三者组合起来意味着一秒内从0旋转到90度.
这只是一个最基础的反馈,是一种反馈直接操控某个物体的情况.下面的就要复杂一些了,关注LandingFeedback的Lens Distorion反馈
这就需要一些简单的配置了,这实际上是对后处理Lens Distortion效果的封装
查看PostProcessingVolume物体的后处理组件(显然场景里必须有该物体)
确保已经激活了Lens Distortion,同时关注MMLensDistortionShaker,这个Shaker可以理解为消息监听者,与刚才旋转的反馈直接操控某个物体不同,Lens Distorion反馈实际上只是发出来一个消息,Shaker会接收这个消息并处理.这个Shaker的概念在Feel中使用很广泛.
同时你也看到了,想使用这个反馈必须要有依赖包(后处理包),同时要进行相应的配置.有相当一部分反馈都是如此.
这里又要引出一个Channel(管道)概念
消息是通过管道传输的,管道有两个类型int和MM Channel,这里使用了int,值为0
查看后处理物体的Shaker,也能发现两者是对应的,都是int为0,这样就能接受到消息.
这两种是反馈的两种主要形式.
你可能看到了旋转的球和四个与大Cube同步的小Cube,查看上面的脚本.还有左下角的一个Text UI,这也是,这可以展示帧率和控制帧率.这些功能都属于MMTools模块,这些和反馈没有直接联系,算是作者开发的小玩意,感兴趣可以自行查看.
MMF_PlayerDemo
然后让我们来看下MMF_PlayerDemo场景,搜索并打开后,左侧有很多按钮,这些按钮每个都对应一个MMF_Player,播放上面的反馈实现了很多不错的效果,并且分了类.
都在这里,可以自行查看并实验.
Core concepts
显然我们主要会使用的是MMF_Player 组件,将其作为一个容器承载所有的反馈.
1.Shakers:
刚才提到的接收反馈传递的消息并处理的监听者,反馈只负责发布一个消息,相同管道的Shaker会接收这个消息.
2.Channel:
消息管道,刚才提到了一个int类型,这里再说下另一种类型MMChannel ,实际就是一个scriptable object asset配置,(Create > More Mountains > MMChannel创建).这样专门声明一个配置可以进一步细化和管理管道.
3.Pauses:
暂停,有两种暂停反馈.
Pause
默认所有的反馈都是同时触发的,如何暂停呢?将Pause加入队列后再Play,那么前五个加上Pause将同时触发,后两个将在0.5s后触发,因为Pause被设为0.5s.
Holding Pause
Holding Pause不同于Pause,在这个例子中前五个会同时触发,在五个中最长的完成后(显然是2s),然后再暂停0.25s,然后后面的两个才会触发.
使用脚本暂停
调用PauseFeedbacks()暂停,使用ResumeFeedbacks()恢复暂停.
例子在这里.
4.Loops:
循环反馈
查看这个例子,Play后前三个同时触发,Pause暂停0.5s,然后是后三个,然后是Looper,这个Looper会等待0.25s,然后再同时触发Pause和Looper中间的三个,然后是Looper(再等待0.25s),然后再重复触发一下中间三个.
因为循环次数为2.
另一个例子
先同时触发三个,Pause会等待到3s,然后触发Postion,然后Looper Start会延迟3s,然后中间两个会同时触发,然后Looper延迟3s,然后再同时触发中间两个(LooperStart不会再延迟),然后重复.
例子在
5.Chance:
就是发生的概率,100代表一定发生,0就是永不发生,每个反馈都有该属性.
6.Timing:
每个反馈的与时间相关的属性.
1. TimeScale Mode
-
Scaled 或 Unscaled:这决定了反馈的执行是否基于游戏的时间缩放(Time.timeScale)。
Scaled
会随着时间缩放变化,Unscaled
则无视时间缩放,用真实时间进行播放。这个设置在某些反馈中可能非常重要,尤其是当你需要反馈在暂停或时间缩放时继续运行时。
2. Initial Delay
-
初始延迟:设置反馈在执行之前的延迟时间(单位:秒)。例如,如果你希望某个效果在触发后延迟几秒钟再开始,这个选项很有用。
3. Cooldown Duration
-
冷却时间:设置一个时间间隔,在这个时间内该反馈无法被再次触发。这个选项适用于防止用户重复触发反馈,特别是防止连续播放的情况。
4. ExcludeFromHoldingPauses
-
忽略暂停时的等待:如果启用了此选项,那么即使游戏在“暂停”状态下,反馈依然会启动。适用于一些长时间的反馈(比如动画或特效),当你希望它开始时,但不影响其他暂停期间的操作。
5. ContributeToTotalDuration
-
是否计入总持续时间:决定该反馈是否会计入父级 MMF_Player 的总持续时间。如果选择不计入,则父级的时间计算不会包括这个反馈的持续时间。
6. Number of Repeats
-
重复次数:设置该反馈需要重复的次数(默认值为0,表示只播放一次)。
7. Repeat Forever
-
永远重复:如果启用了此选项,反馈将一直重复播放,直到你明确停止它。
8. Delay Between Repeats
-
重复之间的延迟:设置重复反馈之间的时间间隔。适用于需要重复播放的反馈,并且希望它们之间有一定的间隔。
9. Play Direction
-
播放方向:该选项允许你定义反馈在播放时的方向。一般情况下,反馈按从上到下的顺序播放,但你也可以设置它反向播放(从下到上)。
10. MMFeedbacks Direction Condition
-
方向条件:设置反馈是否仅在 MMF_Player 播放方向为正向或反向时才触发。默认情况下,反馈总是会播放,但如果设置了条件,则只有在特定方向时才会播放。
11. Constant Intensity
-
恒定强度:如果勾选此选项,反馈将忽略全局强度的调整,并保持其固定的强度。这意味着它不受 MMF_Player 中全局强度的影响。
12. Use Intensity Interval
-
使用强度区间:设置反馈的强度范围。只有在强度值处于指定区间内时,反馈才会触发。比如,你可以设置强度在0到50之间时触发某种效果,在50到100之间触发另一个效果。这对于根据角色的状态(如受伤程度)触发不同反馈非常有用。
13. Sequence
-
使用的序列:设置一个 Sequence,用于控制反馈的播放顺序。如果你想要某些反馈按特定顺序或时间安排播放,可以使用 Sequence。
14. Track ID
-
序列轨道ID:定义该反馈在序列中的轨道 ID。用于在一个序列中指定反馈的具体位置或顺序。
15. Quantized
-
量化模式:如果启用量化模式,反馈将在固定的时间点播放。量化模式通常用于音乐、节奏类游戏或需要精确时间控制的场景中,确保反馈在正确的时刻触发。
也可以在运行时使用方法SetInitialDelay, SetDelayBetweenRepeats or SetSequence methods.改变Timing Values.
如何反向播放反馈?注意是在MMF_Player级别的设置下.
也可以代码更改该属性.参考代码如下.
7.Enable / Disable feedbacks:
如何禁用/激活反馈呢?
(1)全局禁用,MMFeedbacks.GlobalMMFeedbacksActive=false/true.
(2)MMF_Player级别,失活该组件或他所在的GameObject都可以.
(3)在反馈级别
player.FeedbacksList[0].Active,或者先找到对应的反馈然后设置Active属性.
7.Preventing a type of feedback from playing
如何阻止某个类型的所有反馈?
MMF_Scale.FeedbackTypeAuthorized = false;
这将阻止所有缩放类型的反馈.
MMFeedbacksAuthorizations组件更方便,其实这就是枚举了所有类型的上述代码.
What is MMF_Player?
MMF_Player作为一个我们最常用的组件.
使用Add new feedback下拉框添加你需要的反馈,右侧的copy all可以复制所有的反馈(这是推荐的方法,不要使用Unity的组件复制).还可以按住某个反馈最左边的图标调整反馈顺序,打开最右边的图标进行复制粘贴移除重置本反馈等.
初始化,播放,停止,跳过,还原,还原,重置,还原:调用该MMF_Player上的相应方法,仅用于测试目的。其中大多数仅在运行时可用。
Keep Playmode Changes:在运行时按此操作,然后在退出播放时间时,对此MMF播放器的更改将不会丢失.
1. Initialization(初始化设置)
-
Initialization Mode: 定义初始化方式。默认情况下,
MMF_Player
会在Awake
或Start
时初始化。你也可以选择手动初始化,通过调用Initialization()
方法并传入一个“所有者”。 -
Auto Play on Start: 如果为 true,则
MMF_Player
会在场景开始时自动播放反馈。 -
Auto Play on Enable: 如果为 true,当该对象启用时,
MMF_Player
会自动播放反馈。 -
Auto Initialization: 如果为 true,系统会在合适的时机自动初始化这个播放器并准备播放。
2. Direction(播放顺序设置)
-
Direction: 定义反馈的播放顺序。默认情况下,反馈按“从上到下”的顺序播放。你可以选择将其反向,即按“从下到上”的顺序播放。
-
Auto Change Direction on End: 如果为 true,当所有反馈播放完成时,
MMF_Player
会自动将播放顺序反向。
3. Intensity(强度设置)
-
Feedbacks Intensity: 控制播放反馈的强度。例如,
1
是正常强度,0.5
是半强度,0
则是无效果。不同的反馈可能会根据这个值调节它们的幅度。 -
Force TimeScale Mode: 强制所有反馈使用缩放(scaled)或非缩放(unscaled)时间模式。
-
Duration Multiplier: 用于调整所有反馈的持续时间(包括初始延迟、总持续时间和重复间隔)。例如,设置为
2
会让所有反馈持续时间加倍。 -
Randomize Duration: 在反馈的持续时间上应用随机化,使其持续时间在某个范围内随机波动。
-
Display Full Duration Details: 如果启用,会显示更多的编辑器信息,帮助你查看每个反馈的详细时间信息。
4. Cooldown & Delay(冷却和延迟)
-
Cooldown Duration: 这是一个冷却时间(秒),在一次播放后,这个
MMF_Player
在冷却期间不会再次被触发。冷却时间对于防止某些反馈被过度触发很有用。 -
Initial Delay: 延迟开始播放的时间,通常在你希望给场景或其他动画留一些缓冲时间时使用。
-
Chance to play: 这个百分比值决定了
MMF_Player
播放的几率。例如,50%
意味着每次触发时有 50% 的概率播放反馈。
5. Range(范围设置)
-
Only Play If Within Range: 如果为 true,这意味着该
MMF_Player
只有在特定范围内时才会播放反馈。 -
RangeCenter: 用于计算范围的参考点,通常是玩家角色或主摄像机。
-
RangeDistance: 距离值(单位为游戏中的单位),表示距离中心点的最大有效范围。
-
UseRangeFalloff: 如果启用,反馈的强度会随着距离的增加而减少。你可以使用曲线来控制反馈强度的衰减。
-
Ignore Range Events: 是否忽略通过
MMSetFeedbackRangeCenterEvent
触发的范围事件。
6. Play Settings(播放设置)
-
CanPlay: 如果为 false,这个
MMF_Player
就无法播放其包含的反馈。 -
CanPlayWhileAlreadyPlaying: 如果为 false,
MMF_Player
不会在其内部任何反馈仍在播放时再次播放。这有助于避免反馈被重复触发,防止叠加播放。 -
Performance Mode: 启用后,会优化
MMF_Player
的编辑器渲染,减少性能消耗,但对游戏的实际性能没有影响。 -
Force Stop Feedbacks On Disable: 如果为 true,当该
MMF_Player
被禁用时,所有反馈会自动停止。
7. Events(事件设置)
-
Trigger MMFeedbacks Events: 是否触发
MMFeedbacksEvents
,这是一种可以监听的事件类型,适合用于通知或管理其他脚本。 -
Trigger Unity Events: 是否触发常规的 Unity 事件(通过 Inspector 中绑定的事件槽进行)。
-
OnPlay: 在每次
MMF_Player
被播放时触发。 -
OnPause: 在每次
MMF_Player
被暂停时触发。 -
OnResume: 在每次
MMF_Player
被恢复时触发。 -
OnRevert: 在每次
MMF_Player
被反转时触发(通常在播放结束后,若启用了AutoChangeDirectionOnEnd
,或者手动调用Revert()
方法)。 -
OnComplete: 在播放所有反馈(最后一个反馈)完成时触发。
-