Unity后处理效果之边角压暗的实现方法
本篇内容介绍了“Unity后处理效果之边角压暗的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
我使用的版本为2019.4.12(LTS)版本,项目是HDRP项目。
边角压暗效果的触发,可以按钮触发,也可以按键触发,按钮触发直接调用ButtonEvent()方法就好了。两种方式稍微有点差距,但不大。
首先先在项目里新建后处理的配置文件,方法如下:
然后随便创建一个空物体,挂上脚本DynamicVignette
脚本如下:
usingSystem.Collections; usingUnityEngine; usingUnityEngine.Rendering; usingUnityEngine.Rendering.HighDefinition; /* * *Writer:June * *Date:2020.10.14 * *Function:动态边角压暗效果 * *Remarks: * */ ///<summary> ///挂载当前脚本的GameObject必须确保有Volume组件 ///</summary> [RequireComponent(typeof(Volume))] publicclassDynamicVignette:MonoBehaviour { ///<summary> ///后处理体积容器 ///</summary> privateVolumevolume; ///<summary> ///对应要修改的效果————>边角压暗效果 ///</summary> privateVignettevignette; ///<summary> ///是否成功获取边角压暗属性 ///</summary> publicboolIsGetAttribute{get;privateset;} ///<summary> ///动画播放需要的时间 ///</summary> publicfloatanimtionTime; ///<summary> ///强度范围 ///</summary> [Range(0.1f,1)] publicfloatvignetteIntensity=0.1f; ///<summary> ///动画开关 ///</summary> privateboolisPlay=false; ///<summary> ///计时器 ///</summary> privatefloattimer=0; ///<summary> ///每帧更新的强度总和(用于对边角压暗强度的赋值,并且每帧更新) ///</summary> privatefloatframeIntensity=0; ///<summary> ///帧率 ///</summary> [Range(10,60)] publicfloatframeRate=60; privatevoidStart() { //获取引用 volume=GetComponent<Volume>(); //从配置文件或配置表中获取属性TryGet方法返回的是bool类型的 IsGetAttribute=volume.profile.TryGet(outvignette); } privatevoidUpdate() { if(Input.GetKeyDown(KeyCode.A)) { //使用协程 StartCoroutine(VignetteEffect()); } } //经过测试,每秒执行51次,Update函数每秒执行次数不一定 privatevoidFixedUpdate() { //确保获取到了属性 if(!IsGetAttribute)return; if(isPlay) { timer+=Time.deltaTime; VignetteEffect(timer); } } ///<summary> ///按钮触发 ///</summary> publicvoidButtonEvent() { isPlay=true; } ///<summary> ///边角压暗效果 ///tips:注意intensity不可以直接赋值,intensity的类型不是float ///</summary> privatevoidVignetteEffect(floatcurrentTime) { //判断时间 if(currentTime>=animtionTime/2f) { //用总时间的一半*帧率=在这段时间要更新的帧数,再用规定的强度/总帧数=每帧更新的强度 frameIntensity-=vignetteIntensity/(51*animtionTime/2f); vignette.intensity.value=frameIntensity; } else { frameIntensity+=vignetteIntensity/(51*animtionTime/2f); vignette.intensity.value=frameIntensity; } //播放完成 if(currentTime>=animtionTime) { isPlay=false; timer=0; frameIntensity=0; } } ///<summary> ///边角压暗效果协程 ///</summary> ///<returns></returns> IEnumeratorVignetteEffect() { //从0->目标强度 for(floati=0;i<=vignetteIntensity;i+=vignetteIntensity/(frameRate*animtionTime/2f)) { vignette.intensity.value=i; //每0.02秒更新一帧 yieldreturnnewWaitForSeconds(0.02f); } //从目标强度->0 for(floati=vignetteIntensity;i>=0;i-=vignetteIntensity/(frameRate*animtionTime/2f)) { vignette.intensity.value=i; yieldreturnnewWaitForSeconds(0.02f); } } }
最后的效果:
2020.11.09更新
做了一些处理,不是通过时间来限制,而是用变化速度,以及一些小优化,外部只要直接调用TriggerEffect() ,就有边角压暗的渐变效果(可以用来做被敌人攻击的后,屏幕效果,不过有点大材小用了,哈哈,这里我只是做一个引申!)
usingUnityEngine; usingUnityEngine.Rendering; usingUnityEngine.Rendering.HighDefinition; /* * *Writer:June * *Date:2020.11.09 * *Function:控制后处理效果之边角压暗效果 * *Remarks: * */ [RequireComponent(typeof(Volume))] publicclassControlPP_Vignette:MonoBehaviour { ///<summary> ///后期处理容器 ///</summary> privateVolumevolume; ///<summary> ///边角压暗效果 ///</summary> privateVignettevignette; ///<summary> ///是否成功获取边角压暗属性 ///</summary> publicboolIsGetAttribute{get;privateset;} ///<summary> ///显示/隐藏边角压暗 ///</summary> privateboolIsFadeIn,IsFadeOut; ///<summary> ///压暗的变化速度 ///</summary> [Header("压暗效果的变化速度"),Range(0.5f,5),SerializeField] privatefloatfadeSpeed=1f; ///<summary> ///压暗强度最大值 ///</summary> [Header("压暗强度最大值"),Range(0,1),SerializeField] privatefloateffectMax=0.6f; ///<summary> ///默认初始化颜色 ///</summary> publicColordefaultColor; privatevoidStart() { //获取引用 volume=GetComponent<Volume>(); //默认关闭 IsFadeIn=false; //从配置文件或配置表中获取属性TryGet方法返回的是bool类型的 IsGetAttribute=volume.profile.TryGet(outvignette); //如果没有获取到边角压暗效果,则创建边角压暗效果 if(!IsGetAttribute)CreatVignetteEffect(defaultColor); } privatevoidUpdate() { if(IsFadeIn) { vignette.intensity.value+=fadeSpeed*Time.deltaTime; //判断是否达到目标,到达后设置为false IsFadeIn=vignette.intensity.value<effectMax; IsFadeOut=!IsFadeIn; } if(IsFadeOut) { vignette.intensity.value-=fadeSpeed*Time.deltaTime; IsFadeOut=vignette.intensity.value<effectMax; } } ///<summary> ///触发边角压暗效果(提供给外部调用) ///</summary> publicvoidTriggerEffect() { //先判断是否获取得到了边角压暗 if(IsGetAttribute)IsFadeIn=true; } ///<summary> ///创建边角压暗效果 ///</summary> ///<paramname="color">初始颜色</param> privatevoidCreatVignetteEffect(Colorcolor) { //将边角压暗效果添加到配置文件中ture:将所有属性激活 vignette=volume.profile.Add<Vignette>(true); //初始化颜色 vignette.color.value=color; //初始化强度 vignette.intensity.value=0; //标记为获取到边角压暗 IsGetAttribute=true; } }
“Unity后处理效果之边角压暗的实现方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注恰卡编程网网站,小编将为大家输出更多高质量的实用文章!
推荐阅读
-
VS Code里如何使用Debugger for Unity插件调试
-
Unity如何实现射击小游戏
-
Unity如何实现炸弹人游戏
-
Unity中怎么通过LitJson对JSON数据创建与使用
Unity中怎么通过LitJson对JSON数据创建与使用这篇文章...
-
Unity实现动物识别的代码怎么写
-
怎么用Unity命令行打包WebGL
怎么用Unity命令行打包WebGL本文小编为大家详细介绍“怎么用...
-
如何教训unity与3dmax美工部分的总结
如何教训unity与3dmax美工部分的总结今天给大家介绍一下如何...
-
Unity图形学中的ShaderLab怎么入门
-
Unity怎么实现植物识别
-
Unity渲染管线流程是怎样的