最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity利用材質(zhì)自發(fā)光實現(xiàn)物體閃爍

 更新時間:2020年04月15日 14:30:35   作者:Symbolizer  
這篇文章主要為大家詳細(xì)介紹了Unity利用材質(zhì)自發(fā)光實現(xiàn)物體閃爍,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

Unity中利用材質(zhì)自發(fā)光實現(xiàn)物體閃爍效果,供大家參考,具體內(nèi)容如下

補充:這種方法有一點問題,在測試(Windows平臺)的時候發(fā)現(xiàn),要想在Build出來的游戲中實現(xiàn)閃爍效果,就必須在 Project 窗口中將源材質(zhì)的自發(fā)光屬性(Emission)啟用,否則自發(fā)光效果就只能在編輯器模式中生效。

啟用源材質(zhì)的自發(fā)光效果后,將其亮度(Brightness)調(diào)整為0,物體看起來就和沒有啟用自發(fā)光時一樣。

看到別的游戲里有物體高亮閃爍效果,但自己不會寫Shader,就只想到用材質(zhì)自發(fā)光來做一下,不知道有沒有更好的辦法!

原理比較簡單,通過代碼開啟材質(zhì)的自發(fā)光效果,然后不斷地調(diào)整自發(fā)光的亮度即可。
首先要獲取到材質(zhì)對象實例 material,然后通過其進行其他操作:

啟用自發(fā)光效果的代碼是 material.EnableKeyword("_EMISSION")

關(guān)閉自發(fā)光效果的代碼是 material.DisableKeyword("_EMISSION")

設(shè)置自發(fā)光顏色和亮度的代碼是 material.SetColor("_EmissionColor", Color.HSVToRGB(_h, _s, _v))

  • 其中的 _h、_s、_v參數(shù)分別代表顏色的色相、飽和度和亮度。
  • 獲取顏色的色相、飽和度和亮度的代碼為 Color.RGBToHSV(color, out _h, out _s, out _v)

下面有完整的源代碼

此方法實現(xiàn)的閃爍效果不能發(fā)出光暈,因為自發(fā)光的光暈必須經(jīng)過烘焙才能生效,而烘焙是在運行前完成的,所以無法在運行時產(chǎn)生光暈效果;另外閃爍的最高亮度只能為1,不能像烘焙時那樣將亮度設(shè)為大于1而產(chǎn)生HDR效果。

源代碼

using System.Collections;
using UnityEngine;

public class Glinting : MonoBehaviour
{
 /// <summary>
 /// 閃爍顏色
 /// </summary>
 public Color color = new Color(1, 0, 1, 1);
 /// <summary>
 /// 最低發(fā)光亮度,取值范圍[0,1],需小于最高發(fā)光亮度。
 /// </summary>
 [Range(0.0f, 1.0f)]
 public float minBrightness = 0.0f;
 /// <summary>
 /// 最高發(fā)光亮度,取值范圍[0,1],需大于最低發(fā)光亮度。
 /// </summary>
 [Range(0.0f, 1)]
 public float maxBrightness = 0.5f;
 /// <summary>
 /// 閃爍頻率,取值范圍[0.2,30.0]。
 /// </summary>
 [Range(0.2f, 30.0f)]
 public float rate = 1;

 [Tooltip("勾選此項則啟動時自動開始閃爍")]
 [SerializeField]
 private bool _autoStart = false;

 private float _h, _s, _v;  // 色調(diào),飽和度,亮度
 private float _deltaBrightness; // 最低最高亮度差
 private Renderer _renderer;
 private Material _material;
 private readonly string _keyword = "_EMISSION";
 private readonly string _colorName = "_EmissionColor";

 private Coroutine _glinting;

 private void Start()
 {
 _renderer = gameObject.GetComponent<Renderer>();
 _material = _renderer.material;

 if (_autoStart)
 {
  StartGlinting();
 }
 }

 /// <summary>
 /// 校驗數(shù)據(jù),并保證運行時的修改能夠得到應(yīng)用。
 /// 該方法只在編輯器模式中生效?。?!
 /// </summary>
 private void OnValidate()
 {
 // 限制亮度范圍
 if (minBrightness < 0 || minBrightness > 1)
 {
  minBrightness = 0.0f;
  Debug.LogError("最低亮度超出取值范圍[0, 1],已重置為0。");
 }
 if (maxBrightness < 0 || maxBrightness > 1)
 {
  maxBrightness = 1.0f;
  Debug.LogError("最高亮度超出取值范圍[0, 1],已重置為1。");
 }
 if (minBrightness >= maxBrightness)
 {
  minBrightness = 0.0f;
  maxBrightness = 1.0f;
  Debug.LogError("最低亮度[MinBrightness]必須低于最高亮度[MaxBrightness],已分別重置為0/1!");
 }

 // 限制閃爍頻率
 if (rate < 0.2f || rate > 30.0f)
 {
  rate = 1;
  Debug.LogError("閃爍頻率超出取值范圍[0.2, 30.0],已重置為1.0。");
 }

 // 更新亮度差
 _deltaBrightness = maxBrightness - minBrightness;

 // 更新顏色
 // 注意不能使用 _v ,否則在運行時修改參數(shù)會導(dǎo)致亮度突變
 float tempV = 0;
 Color.RGBToHSV(color, out _h, out _s, out tempV);
 }

 /// <summary>
 /// 開始閃爍。
 /// </summary>
 public void StartGlinting()
 {
 _material.EnableKeyword(_keyword);

 if (_glinting != null)
 {
  StopCoroutine(_glinting);
 }
 _glinting = StartCoroutine(IEGlinting());
 }

 /// <summary>
 /// 停止閃爍。
 /// </summary>
 public void StopGlinting()
 {
 _material.DisableKeyword(_keyword);

 if (_glinting != null)
 {
  StopCoroutine(_glinting);
 }
 }

 /// <summary>
 /// 控制自發(fā)光強度。
 /// </summary>
 /// <returns></returns>
 private IEnumerator IEGlinting()
 {
 Color.RGBToHSV(color, out _h, out _s, out _v);
 _v = minBrightness;
 _deltaBrightness = maxBrightness - minBrightness;

 bool increase = true;
 while (true)
 {
  if (increase)
  {
  _v += _deltaBrightness * Time.deltaTime * rate;
  increase = _v <= maxBrightness;
  }
  else
  {
  _v -= _deltaBrightness * Time.deltaTime * rate;
  increase = _v <= minBrightness;
  }
  _material.SetColor(_colorName, Color.HSVToRGB(_h, _s, _v));
  //_renderer.UpdateGIMaterials();
  yield return null;
 }
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#導(dǎo)出GridView數(shù)據(jù)到Excel文件類實例

    C#導(dǎo)出GridView數(shù)據(jù)到Excel文件類實例

    這篇文章主要介紹了C#導(dǎo)出GridView數(shù)據(jù)到Excel文件類,實例分析了C#使用GridView及Excel的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • c#求兩個數(shù)中最大值的方法

    c#求兩個數(shù)中最大值的方法

    這篇文章主要介紹了c#求兩個數(shù)中最大值的方法,需要的朋友可以參考下
    2014-02-02
  • c#訪問this關(guān)鍵字和base關(guān)鍵字示例

    c#訪問this關(guān)鍵字和base關(guān)鍵字示例

    this關(guān)鍵字引用類的當(dāng)前實例。靜態(tài)成員方法中不能使用this關(guān)鍵字,this關(guān)鍵字只能在實例構(gòu)造函數(shù)、實例方法或?qū)嵗L問器中使用。base關(guān)鍵字用于從派生類中訪問基類的成員。下面學(xué)習(xí)一下這二個關(guān)鍵字的使用方法
    2014-01-01
  • 如何使用C#中的Lazy的使用方法

    如何使用C#中的Lazy的使用方法

    這篇文章主要介紹了如何使用C#中的Lazy的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 詳解C#如何加密解密RAR文件

    詳解C#如何加密解密RAR文件

    這篇文章主要為大家詳細(xì)介紹了C#如何實現(xiàn)加密解密RAR文件的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#中常量和只讀變量的區(qū)別小結(jié)

    C#中常量和只讀變量的區(qū)別小結(jié)

    本篇文章主要是對C#中常量和只讀變量的區(qū)別進行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • 自定義WPF窗體形狀的實戰(zhàn)記錄

    自定義WPF窗體形狀的實戰(zhàn)記錄

    WPF是制作界面的一大利器,下面這篇文章主要給大家介紹了關(guān)于自定義WPF窗體形狀的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們一起來看看吧
    2018-09-09
  • C#在Windows上調(diào)用7-zip實現(xiàn)壓縮文件

    C#在Windows上調(diào)用7-zip實現(xiàn)壓縮文件

    這篇文章主要為大家詳細(xì)介紹了C#如何在Windows上調(diào)用7-zip實現(xiàn)壓縮文件,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以學(xué)習(xí)一下
    2023-10-10
  • C#比較數(shù)組是否相同的3種方式小結(jié)

    C#比較數(shù)組是否相同的3種方式小結(jié)

    本文主要介紹了C#比較數(shù)組是否相同的3種方式小結(jié),主要包括SequenceEqual()方法,循環(huán)的方式比較,StructuralComparisons.StructuralEqualityComparer方式,感興趣的可以了解一下
    2024-01-01
  • C#加密算法匯總(推薦)

    C#加密算法匯總(推薦)

    以下是對C#中的加密算法進行了匯總介紹,需要的朋友可以過來參考下
    2013-09-09

最新評論

迁西县| 嘉峪关市| 丽江市| 自治县| 长丰县| 连州市| 陆河县| 芒康县| 安多县| 澄迈县| 汨罗市| 凤阳县| 清流县| 扬中市| 嘉定区| 平乡县| 九寨沟县| 正阳县| 温州市| 昆山市| 元谋县| 白山市| 天等县| 缙云县| 荃湾区| 阳山县| 佛学| 扬中市| 会东县| 陵川县| 临桂县| 麦盖提县| 泸西县| 广丰县| 沽源县| 辉县市| 阿合奇县| 宣城市| 都兰县| 章丘市| 炎陵县|