文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Unity后处理效果之边角压暗的实现方法

2023-06-09 09:44

关注

本篇内容介绍了“Unity后处理效果之边角压暗的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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

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

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

Unity后处理效果之边角压暗的实现方法

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

Unity后处理效果之边角压暗的实现方法

脚本如下:

using System.Collections;using UnityEngine;using UnityEngine.Rendering;using UnityEngine.Rendering.HighDefinition;   /// <summary>/// 挂载当前脚本的GameObject必须确保有Volume组件/// </summary>[RequireComponent(typeof(Volume))]public class DynamicVignette : MonoBehaviour{ /// <summary> /// 后处理体积容器 /// </summary> private Volume volume; /// <summary> /// 对应要修改的效果————>边角压暗效果 /// </summary> private Vignette vignette; /// <summary> /// 是否成功获取边角压暗属性 /// </summary> public bool IsGetAttribute { get; private set; } /// <summary> /// 动画播放需要的时间 /// </summary> public float animtionTime; /// <summary> /// 强度范围 /// </summary> [Range(0.1f, 1)] public float vignetteIntensity = 0.1f; /// <summary> /// 动画开关 /// </summary> private bool isPlay = false; /// <summary> /// 计时器 /// </summary> private float timer = 0; /// <summary> /// 每帧更新的强度总和(用于对边角压暗强度的赋值,并且每帧更新) /// </summary> private float frameIntensity = 0; /// <summary> /// 帧率 /// </summary> [Range(10, 60)] public float frameRate = 60;    private void Start() { //获取引用 volume = GetComponent<Volume>(); //从配置文件或配置表中获取属性 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); } }  /// <summary> /// 按钮触发 /// </summary> public void ButtonEvent() { isPlay = true; }  /// <summary> /// 边角压暗效果 /// tips:注意intensity不可以直接赋值,intensity的类型不是float /// </summary> 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; } }   /// <summary> /// 边角压暗效果协程 /// </summary> /// <returns></returns> 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); } }}

最后的效果:

Unity后处理效果之边角压暗的实现方法

2020.11.09更新

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

using UnityEngine;using UnityEngine.Rendering;using UnityEngine.Rendering.HighDefinition;   [RequireComponent(typeof(Volume))]public class ControlPP_Vignette : MonoBehaviour{ /// <summary> /// 后期处理容器 /// </summary> private Volume volume; /// <summary> /// 边角压暗效果 /// </summary> private Vignette vignette; /// <summary> /// 是否成功获取边角压暗属性 /// </summary> public bool IsGetAttribute { get; private set; } /// <summary> /// 显示/隐藏边角压暗 /// </summary> private bool IsFadeIn, IsFadeOut; /// <summary> /// 压暗的变化速度 /// </summary> [Header("压暗效果的变化速度"),Range(0.5f,5),SerializeField] private float fadeSpeed = 1f; /// <summary> /// 压暗强度最大值 /// </summary> [Header("压暗强度最大值"), Range(0, 1),SerializeField] private float effectMax = 0.6f; /// <summary> /// 默认初始化颜色 /// </summary> public Color defaultColor;  private void Start() { //获取引用 volume = GetComponent<Volume>(); //默认关闭 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 < effectMax; IsFadeOut = !IsFadeIn; } if (IsFadeOut) { vignette.intensity.value -= fadeSpeed * Time.deltaTime; IsFadeOut = vignette.intensity.value < effectMax; } }  /// <summary> /// 触发边角压暗效果(提供给外部调用) /// </summary> public void TriggerEffect() { //先判断是否获取得到了边角压暗 if (IsGetAttribute) IsFadeIn = true; }   /// <summary> /// 创建边角压暗效果 /// </summary> /// <param name="color">初始颜色</param> private void CreatVignetteEffect(Color color) { //将边角压暗效果添加到配置文件中 ture:将所有属性激活 vignette = volume.profile.Add<Vignette>(true); //初始化颜色 vignette.color.value = color; //初始化强度 vignette.intensity.value = 0; //标记为获取到边角压暗 IsGetAttribute = true; }}

“Unity后处理效果之边角压暗的实现方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯