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: * */ //////挂载当前脚本的GameObject必须确保有Volume组件 /// [RequireComponent(typeof(Volume))] publicclassDynamicVignette:MonoBehaviour { //////后处理体积容器 /// privateVolumevolume; //////对应要修改的效果————>边角压暗效果 /// privateVignettevignette; //////是否成功获取边角压暗属性 /// publicboolIsGetAttribute{get;privateset;} //////动画播放需要的时间 /// publicfloatanimtionTime; //////强度范围 /// [Range(0.1f,1)] publicfloatvignetteIntensity=0.1f; //////动画开关 /// privateboolisPlay=false; //////计时器 /// privatefloattimer=0; //////每帧更新的强度总和(用于对边角压暗强度的赋值,并且每帧更新) /// privatefloatframeIntensity=0; //////帧率 /// [Range(10,60)] publicfloatframeRate=60; privatevoidStart() { //获取引用 volume=GetComponent(); //从配置文件或配置表中获取属性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); } } /// ///按钮触发 /// publicvoidButtonEvent() { isPlay=true; } //////边角压暗效果 ///tips:注意intensity不可以直接赋值,intensity的类型不是float /// 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; } } //////边角压暗效果协程 /// ///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
{
///
///后期处理容器
///
privateVolumevolume;
///
///边角压暗效果
///
privateVignettevignette;
///
///是否成功获取边角压暗属性
///
publicboolIsGetAttribute{get;privateset;}
///
///显示/隐藏边角压暗
///
privateboolIsFadeIn,IsFadeOut;
///
///压暗的变化速度
///
[Header("压暗效果的变化速度"),Range(0.5f,5),SerializeField]
privatefloatfadeSpeed=1f;
///
///压暗强度最大值
///
[Header("压暗强度最大值"),Range(0,1),SerializeField]
privatefloateffectMax=0.6f;
///
///默认初始化颜色
///
publicColordefaultColor;
privatevoidStart()
{
//获取引用
volume=GetComponent();
//默认关闭
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
///触发边角压暗效果(提供给外部调用)
///
publicvoidTriggerEffect()
{
//先判断是否获取得到了边角压暗
if(IsGetAttribute)IsFadeIn=true;
}
///
///创建边角压暗效果
///
///初始颜色
privatevoidCreatVignetteEffect(Colorcolor)
{
//将边角压暗效果添加到配置文件中ture:将所有属性激活
vignette=volume.profile.Add(true);
//初始化颜色
vignette.color.value=color;
//初始化强度
vignette.intensity.value=0;
//标记为获取到边角压暗
IsGetAttribute=true;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。