当前位置:   article > 正文

Unity后处理效果之边角压暗_unity 暗角

unity 暗角

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

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

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

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

脚本如下:

  1. using System.Collections;
  2. using UnityEngine;
  3. using UnityEngine.Rendering;
  4. using UnityEngine.Rendering.HighDefinition;
  5. /*
  6. *
  7. * Writer:June
  8. *
  9. * Date: 2020.10.14
  10. *
  11. * Function:动态边角压暗效果
  12. *
  13. * Remarks:
  14. *
  15. */
  16. /// <summary>
  17. /// 挂载当前脚本的GameObject必须确保有Volume组件
  18. /// </summary>
  19. [RequireComponent(typeof(Volume))]
  20. public class DynamicVignette : MonoBehaviour
  21. {
  22. /// <summary>
  23. /// 后处理体积容器
  24. /// </summary>
  25. private Volume volume;
  26. /// <summary>
  27. /// 对应要修改的效果————>边角压暗效果
  28. /// </summary>
  29. private Vignette vignette;
  30. /// <summary>
  31. /// 是否成功获取边角压暗属性
  32. /// </summary>
  33. public bool IsGetAttribute { get; private set; }
  34. /// <summary>
  35. /// 动画播放需要的时间
  36. /// </summary>
  37. public float animtionTime;
  38. /// <summary>
  39. /// 强度范围
  40. /// </summary>
  41. [Range(0.1f, 1)]
  42. public float vignetteIntensity = 0.1f;
  43. /// <summary>
  44. /// 动画开关
  45. /// </summary>
  46. private bool isPlay = false;
  47. /// <summary>
  48. /// 计时器
  49. /// </summary>
  50. private float timer = 0;
  51. /// <summary>
  52. /// 每帧更新的强度总和(用于对边角压暗强度的赋值,并且每帧更新)
  53. /// </summary>
  54. private float frameIntensity = 0;
  55. /// <summary>
  56. /// 帧率
  57. /// </summary>
  58. [Range(10, 60)]
  59. public float frameRate = 60;
  60. private void Start()
  61. {
  62. //获取引用
  63. volume = GetComponent<Volume>();
  64. //从配置文件或配置表中获取属性 TryGet方法返回的是bool类型的
  65. IsGetAttribute = volume.profile.TryGet(out vignette);
  66. }
  67. private void Update()
  68. {
  69. if (Input.GetKeyDown(KeyCode.A))
  70. {
  71. //使用协程
  72. StartCoroutine(VignetteEffect());
  73. }
  74. }
  75. //经过测试,每秒执行51次,Update函数每秒执行次数不一定
  76. private void FixedUpdate()
  77. {
  78. //确保获取到了属性
  79. if (!IsGetAttribute) return;
  80. if (isPlay)
  81. {
  82. timer += Time.deltaTime;
  83. VignetteEffect(timer);
  84. }
  85. }
  86. /// <summary>
  87. /// 按钮触发
  88. /// </summary>
  89. public void ButtonEvent()
  90. {
  91. isPlay = true;
  92. }
  93. /// <summary>
  94. /// 边角压暗效果
  95. /// tips:注意intensity不可以直接赋值,intensity的类型不是float
  96. /// </summary>
  97. private void VignetteEffect(float currentTime)
  98. {
  99. //判断时间
  100. if (currentTime >= animtionTime / 2f)
  101. {
  102. //用 总时间的一半 * 帧率 = 在这段时间要更新的帧数,再用 规定的强度 / 总帧数 = 每帧更新的强度
  103. frameIntensity -= vignetteIntensity / (51 * animtionTime / 2f);
  104. vignette.intensity.value = frameIntensity;
  105. }
  106. else
  107. {
  108. frameIntensity += vignetteIntensity / (51 * animtionTime / 2f);
  109. vignette.intensity.value = frameIntensity;
  110. }
  111. //播放完成
  112. if (currentTime >= animtionTime)
  113. {
  114. isPlay = false;
  115. timer = 0;
  116. frameIntensity = 0;
  117. }
  118. }
  119. /// <summary>
  120. /// 边角压暗效果协程
  121. /// </summary>
  122. /// <returns></returns>
  123. IEnumerator VignetteEffect()
  124. {
  125. //从0->目标强度
  126. for (float i = 0; i <= vignetteIntensity; i+= vignetteIntensity / (frameRate * animtionTime / 2f))
  127. {
  128. vignette.intensity.value = i;
  129. //每0.02秒更新一帧
  130. yield return new WaitForSeconds(0.02f);
  131. }
  132. //从目标强度->0
  133. for (float i = vignetteIntensity; i >= 0; i -= vignetteIntensity / (frameRate * animtionTime / 2f))
  134. {
  135. vignette.intensity.value = i;
  136. yield return new WaitForSeconds(0.02f);
  137. }
  138. }
  139. }

最后的效果:




2020.11.09更新

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

  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. using UnityEngine.Rendering.HighDefinition;
  4. /*
  5. *
  6. * Writer:June
  7. *
  8. * Date: 2020.11.09
  9. *
  10. * Function:控制后处理效果之边角压暗效果
  11. *
  12. * Remarks:
  13. *
  14. */
  15. [RequireComponent(typeof(Volume))]
  16. public class ControlPP_Vignette : MonoBehaviour
  17. {
  18. /// <summary>
  19. /// 后期处理容器
  20. /// </summary>
  21. private Volume volume;
  22. /// <summary>
  23. /// 边角压暗效果
  24. /// </summary>
  25. private Vignette vignette;
  26. /// <summary>
  27. /// 是否成功获取边角压暗属性
  28. /// </summary>
  29. public bool IsGetAttribute { get; private set; }
  30. /// <summary>
  31. /// 显示/隐藏边角压暗
  32. /// </summary>
  33. private bool IsFadeIn, IsFadeOut;
  34. /// <summary>
  35. /// 压暗的变化速度
  36. /// </summary>
  37. [Header("压暗效果的变化速度"),Range(0.5f,5),SerializeField]
  38. private float fadeSpeed = 1f;
  39. /// <summary>
  40. /// 压暗强度最大值
  41. /// </summary>
  42. [Header("压暗强度最大值"), Range(0, 1),SerializeField]
  43. private float effectMax = 0.6f;
  44. /// <summary>
  45. /// 默认初始化颜色
  46. /// </summary>
  47. public Color defaultColor;
  48. private void Start()
  49. {
  50. //获取引用
  51. volume = GetComponent<Volume>();
  52. //默认关闭
  53. IsFadeIn = false;
  54. //从配置文件或配置表中获取属性 TryGet方法返回的是bool类型的
  55. IsGetAttribute = volume.profile.TryGet(out vignette);
  56. //如果没有获取到边角压暗效果,则创建边角压暗效果
  57. if (!IsGetAttribute) CreatVignetteEffect(defaultColor);
  58. }
  59. private void Update()
  60. {
  61. if (IsFadeIn)
  62. {
  63. vignette.intensity.value += fadeSpeed * Time.deltaTime;
  64. //判断是否达到目标,到达后设置为false
  65. IsFadeIn = vignette.intensity.value < effectMax;
  66. IsFadeOut = !IsFadeIn;
  67. }
  68. if (IsFadeOut)
  69. {
  70. vignette.intensity.value -= fadeSpeed * Time.deltaTime;
  71. IsFadeOut = vignette.intensity.value < effectMax;
  72. }
  73. }
  74. /// <summary>
  75. /// 触发边角压暗效果(提供给外部调用)
  76. /// </summary>
  77. public void TriggerEffect()
  78. {
  79. //先判断是否获取得到了边角压暗
  80. if (IsGetAttribute) IsFadeIn = true;
  81. }
  82. /// <summary>
  83. /// 创建边角压暗效果
  84. /// </summary>
  85. /// <param name="color">初始颜色</param>
  86. private void CreatVignetteEffect(Color color)
  87. {
  88. //将边角压暗效果添加到配置文件中 ture:将所有属性激活
  89. vignette = volume.profile.Add<Vignette>(true);
  90. //初始化颜色
  91. vignette.color.value = color;
  92. //初始化强度
  93. vignette.intensity.value = 0;
  94. //标记为获取到边角压暗
  95. IsGetAttribute = true;
  96. }
  97. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/101672
推荐阅读
相关标签
  

闽ICP备14008679号