欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity后處理效果之邊角壓暗

 更新時(shí)間:2021年03月12日 08:02:17   作者:小小小小羽丶  
這篇文章主要為大家詳細(xì)介紹了Unity后處理效果之邊角壓暗,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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)閉按鈕事件的方法

    這篇文章主要介紹了C# Winform實(shí)現(xiàn)捕獲窗體最小化、最大化、關(guān)閉按鈕事件的方法,可通過(guò)重寫WndProc來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2014-08-08
  • C#中Datetimepicker出現(xiàn)問(wèn)題的解決方法

    C#中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-11
  • C#批量刪除Excel重復(fù)項(xiàng)的實(shí)現(xiàn)方法

    C#批量刪除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-04
  • C#使用PPT組件的CreateVideo方法實(shí)現(xiàn)視頻生成

    C#使用PPT組件的CreateVideo方法實(shí)現(xiàn)視頻生成

    這篇文章主要為大家詳細(xì)介紹了C#如何使用PPT組件的CreateVideo方法實(shí)現(xiàn)視頻生成,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • c# WinForm制作圖片編輯工具(圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖)

    c# WinForm制作圖片編輯工具(圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖)

    這篇文章主要介紹了c# WinForm制作圖片編輯工具(可實(shí)現(xiàn)圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#中動(dòng)態(tài)顯示當(dāng)前系統(tǒng)時(shí)間的實(shí)例方法

    C#中動(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
  • C# Path類---文件路徑解讀

    C# Path類---文件路徑解讀

    這篇文章主要介紹了C# Path類---文件路徑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 區(qū)分c# 前臺(tái)和后臺(tái)線程

    區(qū)分c# 前臺(tái)和后臺(tái)線程

    這篇文章主要介紹了c# 前臺(tái)線程和后臺(tái)線程的區(qū)別與聯(lián)系,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#實(shí)現(xiàn)將日期格式化為指定格式

    C#實(shí)現(xiàn)將日期格式化為指定格式

    這篇文章主要為大家詳細(xì)介紹了C#如何使用DateTime.Now.ToString方法將日期格式化為指定格式,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下
    2024-01-01
  • C#編程自學(xué)之類和對(duì)象

    C#編程自學(xué)之類和對(duì)象

    C#一種面向?qū)ο蟮木幊陶Z(yǔ)言,是專門為.NET應(yīng)用而開(kāi)發(fā)出的語(yǔ)言。在.NET運(yùn)行庫(kù)的支持下,.NET框架的各種優(yōu)點(diǎn)在C#中表現(xiàn)得淋漓盡致。所以學(xué)習(xí)類和對(duì)象以及如何運(yùn)用它們是非常重要!
    2015-10-10

最新評(píng)論