Unity后处理效果之边角压暗

这篇文章主要为大家详细介绍了Unity后处理效果之边角压暗,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Unity后处理效果之边角压暗的具体代码,供大家参考,具体内容如下

我使用的版本为2019.4.12(LTS)版本,项目是HDRP项目。

边角压暗效果的触发,可以按钮触发,也可以按键触发,按钮触发直接调用ButtonEvent()方法就好了。两种方式稍微有点差距,但不大。

首先先在项目里新建后处理的配置文件,方法如下:

然后随便创建一个空物体,挂上脚本DynamicVignette

脚本如下:

 using System.Collections; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; /* * * Writer:June * * Date: 2020.10.14 * * Function:动态边角压暗效果 * * Remarks: * */ ///  /// 挂载当前脚本的GameObject必须确保有Volume组件 ///  [RequireComponent(typeof(Volume))] public class DynamicVignette : MonoBehaviour { ///  /// 后处理体积容器 ///  private Volume volume; ///  /// 对应要修改的效果――――>边角压暗效果 ///  private Vignette vignette; ///  /// 是否成功获取边角压暗属性 ///  public bool IsGetAttribute { get; private set; } ///  /// 动画播放需要的时间 ///  public float animtionTime; ///  /// 强度范围 ///  [Range(0.1f, 1)] public float vignetteIntensity = 0.1f; ///  /// 动画开关 ///  private bool isPlay = false; ///  /// 计时器 ///  private float timer = 0; ///  /// 每帧更新的强度总和(用于对边角压暗强度的赋值,并且每帧更新) ///  private float frameIntensity = 0; ///  /// 帧率 ///  [Range(10, 60)] public float frameRate = 60; private void Start() { //获取引用 volume = GetComponent(); //从配置文件或配置表中获取属性 TryGet方法返回的是bool类型的 IsGetAttribute = volume.profile.TryGet(out vignette); } private void Update() { if (Input.GetKeyDown(KeyCode.A)) { //使用协程 StartCoroutine(VignetteEffect()); } } //经过测试,每秒执行51次,Update函数每秒执行次数不一定 private void FixedUpdate() { //确保获取到了属性 if (!IsGetAttribute) return; if (isPlay) { timer += Time.deltaTime; VignetteEffect(timer); } } ///  /// 按钮触发 ///  public void ButtonEvent() { isPlay = true; } ///  /// 边角压暗效果 /// tips:注意intensity不可以直接赋值,intensity的类型不是float ///  private void VignetteEffect(float currentTime) { //判断时间 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; } } ///  /// 边角压暗效果协程 ///  ///  IEnumerator VignetteEffect() { //从0->目标强度 for (float i = 0; i <= vignetteIntensity; i+= vignetteIntensity / (frameRate * animtionTime / 2f)) { vignette.intensity.value = i; //每0.02秒更新一帧 yield return new WaitForSeconds(0.02f); } //从目标强度->0 for (float i = vignetteIntensity; i >= 0; i -= vignetteIntensity / (frameRate * animtionTime / 2f)) { vignette.intensity.value = i; yield return new WaitForSeconds(0.02f); } } }

最后的效果:

2020.11.09更新

做了一些处理,不是通过时间来限制,而是用变化速度,以及一些小优化,外部只要直接调用TriggerEffect() ,就有边角压暗的渐变效果(可以用来做被敌人攻击的后,屏幕效果,不过有点大材小用了,哈哈,这里我只是做一个引申!)

 using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; /* * * Writer:June * * Date: 2020.11.09 * * Function:控制后处理效果之边角压暗效果 * * Remarks: * */ [RequireComponent(typeof(Volume))] public class ControlPP_Vignette : MonoBehaviour { ///  /// 后期处理容器 ///  private Volume volume; ///  /// 边角压暗效果 ///  private Vignette vignette; ///  /// 是否成功获取边角压暗属性 ///  public bool IsGetAttribute { get; private set; } ///  /// 显示/隐藏边角压暗 ///  private bool IsFadeIn, IsFadeOut; ///  /// 压暗的变化速度 ///  [Header("压暗效果的变化速度"),Range(0.5f,5),SerializeField] private float fadeSpeed = 1f; ///  /// 压暗强度最大值 ///  [Header("压暗强度最大值"), Range(0, 1),SerializeField] private float effectMax = 0.6f; ///  /// 默认初始化颜色 ///  public Color defaultColor; private void Start() { //获取引用 volume = GetComponent(); //默认关闭 IsFadeIn = false; //从配置文件或配置表中获取属性 TryGet方法返回的是bool类型的 IsGetAttribute = volume.profile.TryGet(out vignette); //如果没有获取到边角压暗效果,则创建边角压暗效果 if (!IsGetAttribute) CreatVignetteEffect(defaultColor); } private void Update() { if (IsFadeIn) { vignette.intensity.value += fadeSpeed * Time.deltaTime; //判断是否达到目标,到达后设置为false IsFadeIn = vignette.intensity.value  /// 触发边角压暗效果(提供给外部调用) ///  public void TriggerEffect() { //先判断是否获取得到了边角压暗 if (IsGetAttribute) IsFadeIn = true; } ///  /// 创建边角压暗效果 ///  /// 初始颜色 private void CreatVignetteEffect(Color color) { //将边角压暗效果添加到配置文件中 ture:将所有属性激活 vignette = volume.profile.Add(true); //初始化颜色 vignette.color.value = color; //初始化强度 vignette.intensity.value = 0; //标记为获取到边角压暗 IsGetAttribute = true; } }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持html中文网。

以上就是Unity后处理效果之边角压暗的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 其他教程