中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Unity后處理效果之邊角壓暗的實現方法

發布時間:2021-03-12 17:15:37 來源:億速云 閱讀:517 作者:TREX 欄目:開發技術

本篇內容介紹了“Unity后處理效果之邊角壓暗的實現方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

我使用的版本為2019.4.12(LTS)版本,項目是HDRP項目。

邊角壓暗效果的觸發,可以按鈕觸發,也可以按鍵觸發,按鈕觸發直接調用ButtonEvent()方法就好了。兩種方式稍微有點差距,但不大。

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

Unity后處理效果之邊角壓暗的實現方法

然后隨便創建一個空物體,掛上腳本DynamicVignette

Unity后處理效果之邊角壓暗的實現方法

腳本如下:

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);
 }
 }
}

最后的效果:

Unity后處理效果之邊角壓暗的實現方法

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后處理效果之邊角壓暗的實現方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

克山县| 湟源县| 南召县| 额济纳旗| 肥乡县| 花莲县| 大足县| 定边县| 额济纳旗| 金阳县| 临澧县| 德钦县| 新营市| 许昌市| 三明市| 池州市| 环江| 呼图壁县| 滦平县| 兰坪| 云梦县| 安塞县| 宝鸡市| 象山县| 和林格尔县| 大悟县| 彰化县| 通州市| 米易县| 青河县| 长岭县| 麦盖提县| 巩义市| 瓮安县| 沙田区| 栾城县| 醴陵市| 左权县| 辉南县| 崇明县| 务川|