您好,登錄后才能下訂單哦!
本篇內容介紹了“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: * */ /// <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); } } }
最后的效果:
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 { /// <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后處理效果之邊角壓暗的實現方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。