Unity后處理效果之邊角壓暗
本文實(shí)例為大家分享了Unity后處理效果之邊角壓暗的具體代碼,供大家參考,具體內(nèi)容如下
我使用的版本為2019.4.12(LTS)版本,項(xiàng)目是HDRP項(xiàng)目。
邊角壓暗效果的觸發(fā),可以按鈕觸發(fā),也可以按鍵觸發(fā),按鈕觸發(fā)直接調(diào)用ButtonEvent()方法就好了。兩種方式稍微有點(diǎn)差距,但不大。
首先先在項(xiàng)目里新建后處理的配置文件,方法如下:
然后隨便創(chuàng)建一個(gè)空物體,掛上腳本DynamicVignette
腳本如下:
using System.Collections; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; /* * * Writer:June * * Date: 2020.10.14 * * Function:動(dòng)態(tài)邊角壓暗效果 * * Remarks: * */ /// <summary> /// 掛載當(dāng)前腳本的GameObject必須確保有Volume組件 /// </summary> [RequireComponent(typeof(Volume))] public class DynamicVignette : MonoBehaviour { /// <summary> /// 后處理體積容器 /// </summary> private Volume volume; /// <summary> /// 對(duì)應(yīng)要修改的效果————>邊角壓暗效果 /// </summary> private Vignette vignette; /// <summary> /// 是否成功獲取邊角壓暗屬性 /// </summary> public bool IsGetAttribute { get; private set; } /// <summary> /// 動(dòng)畫播放需要的時(shí)間 /// </summary> public float animtionTime; /// <summary> /// 強(qiáng)度范圍 /// </summary> [Range(0.1f, 1)] public float vignetteIntensity = 0.1f; /// <summary> /// 動(dòng)畫開(kāi)關(guān) /// </summary> private bool isPlay = false; /// <summary> /// 計(jì)時(shí)器 /// </summary> private float timer = 0; /// <summary> /// 每幀更新的強(qiáng)度總和(用于對(duì)邊角壓暗強(qiáng)度的賦值,并且每幀更新) /// </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)) { //使用協(xié)程 StartCoroutine(VignetteEffect()); } } //經(jīng)過(guò)測(cè)試,每秒執(zhí)行51次,Update函數(shù)每秒執(zhí)行次數(shù)不一定 private void FixedUpdate() { //確保獲取到了屬性 if (!IsGetAttribute) return; if (isPlay) { timer += Time.deltaTime; VignetteEffect(timer); } } /// <summary> /// 按鈕觸發(fā) /// </summary> public void ButtonEvent() { isPlay = true; } /// <summary> /// 邊角壓暗效果 /// tips:注意intensity不可以直接賦值,intensity的類型不是float /// </summary> private void VignetteEffect(float currentTime) { //判斷時(shí)間 if (currentTime >= animtionTime / 2f) { //用 總時(shí)間的一半 * 幀率 = 在這段時(shí)間要更新的幀數(shù),再用 規(guī)定的強(qiáng)度 / 總幀數(shù) = 每幀更新的強(qiáng)度 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> /// 邊角壓暗效果協(xié)程 /// </summary> /// <returns></returns> IEnumerator VignetteEffect() { //從0->目標(biāo)強(qiáng)度 for (float i = 0; i <= vignetteIntensity; i+= vignetteIntensity / (frameRate * animtionTime / 2f)) { vignette.intensity.value = i; //每0.02秒更新一幀 yield return new WaitForSeconds(0.02f); } //從目標(biāo)強(qiáng)度->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更新
做了一些處理,不是通過(guò)時(shí)間來(lái)限制,而是用變化速度,以及一些小優(yōu)化,外部只要直接調(diào)用TriggerEffect() ,就有邊角壓暗的漸變效果(可以用來(lái)做被敵人攻擊的后,屏幕效果,不過(guò)有點(diǎn)大材小用了,哈哈,這里我只是做一個(gè)引申?。?/p>
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 { /// <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> /// 壓暗強(qiáng)度最大值 /// </summary> [Header("壓暗強(qiáng)度最大值"), Range(0, 1),SerializeField] private float effectMax = 0.6f; /// <summary> /// 默認(rèn)初始化顏色 /// </summary> public Color defaultColor; private void Start() { //獲取引用 volume = GetComponent<Volume>(); //默認(rèn)關(guān)閉 IsFadeIn = false; //從配置文件或配置表中獲取屬性 TryGet方法返回的是bool類型的 IsGetAttribute = volume.profile.TryGet(out vignette); //如果沒(méi)有獲取到邊角壓暗效果,則創(chuàng)建邊角壓暗效果 if (!IsGetAttribute) CreatVignetteEffect(defaultColor); } private void Update() { if (IsFadeIn) { vignette.intensity.value += fadeSpeed * Time.deltaTime; //判斷是否達(dá)到目標(biāo),到達(dá)后設(shè)置為false IsFadeIn = vignette.intensity.value < effectMax; IsFadeOut = !IsFadeIn; } if (IsFadeOut) { vignette.intensity.value -= fadeSpeed * Time.deltaTime; IsFadeOut = vignette.intensity.value < effectMax; } } /// <summary> /// 觸發(fā)邊角壓暗效果(提供給外部調(diào)用) /// </summary> public void TriggerEffect() { //先判斷是否獲取得到了邊角壓暗 if (IsGetAttribute) IsFadeIn = true; } /// <summary> /// 創(chuàng)建邊角壓暗效果 /// </summary> /// <param name="color">初始顏色</param> private void CreatVignetteEffect(Color color) { //將邊角壓暗效果添加到配置文件中 ture:將所有屬性激活 vignette = volume.profile.Add<Vignette>(true); //初始化顏色 vignette.color.value = color; //初始化強(qiáng)度 vignette.intensity.value = 0; //標(biāo)記為獲取到邊角壓暗 IsGetAttribute = true; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C# Winform實(shí)現(xiàn)捕獲窗體最小化、最大化、關(guān)閉按鈕事件的方法
這篇文章主要介紹了C# Winform實(shí)現(xiàn)捕獲窗體最小化、最大化、關(guān)閉按鈕事件的方法,可通過(guò)重寫WndProc來(lái)實(shí)現(xiàn),需要的朋友可以參考下2014-08-08C#中Datetimepicker出現(xiàn)問(wèn)題的解決方法
這篇文章主要給大家介紹了關(guān)于C#中Datetimepicker出現(xiàn)問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11C#批量刪除Excel重復(fù)項(xiàng)的實(shí)現(xiàn)方法
當(dāng)從不同來(lái)源導(dǎo)入Excel數(shù)據(jù)時(shí),可能存在重復(fù)的記錄,為了確保數(shù)據(jù)的準(zhǔn)確性,通常需要?jiǎng)h除這些重復(fù)的行,本文將提供一個(gè)使用C# 快速查找并刪除Excel重復(fù)項(xiàng)的免費(fèi)解決方案,需要的朋友可以參考下2024-04-04C#使用PPT組件的CreateVideo方法實(shí)現(xiàn)視頻生成
這篇文章主要為大家詳細(xì)介紹了C#如何使用PPT組件的CreateVideo方法實(shí)現(xiàn)視頻生成,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10c# WinForm制作圖片編輯工具(圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖)
這篇文章主要介紹了c# WinForm制作圖片編輯工具(可實(shí)現(xiàn)圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03C#中動(dòng)態(tài)顯示當(dāng)前系統(tǒng)時(shí)間的實(shí)例方法
想在網(wǎng)頁(yè)中動(dòng)態(tài)地顯示當(dāng)前系統(tǒng)的時(shí)間,找了好多,不過(guò)都是一些停在那里不動(dòng)的。。。不過(guò)皇天不負(fù)有心人,終于讓我找到了2013-05-05