Unity利用材質(zhì)自發(fā)光實現(xiàn)物體閃爍
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")
設置自發(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,不能像烘焙時那樣將亮度設為大于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ù),并保證運行時的修改能夠得到應用。 /// 該方法只在編輯器模式中生效!??! /// </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ù)會導致亮度突變 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)容,希望對大家的學習有所幫助,也希望大家多多支持我們。
欄 目:C#教程
本文標題:Unity利用材質(zhì)自發(fā)光實現(xiàn)物體閃爍
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4797.html
您可能感興趣的文章
- 01-10C#利用反射技術(shù)實現(xiàn)去掉按鈕選中時的邊框效果
- 01-10C#圖片處理3種高級應用
- 01-10Unity3d獲取系統(tǒng)時間
- 01-10Unity3D獲取當前鍵盤按鍵及Unity3D鼠標、鍵盤的基本操作
- 01-10C#異步下載文件
- 01-10C# Console利用mspaint打開圖像并保存的方法
- 01-10C#利用delegate實現(xiàn)Javascript的each方法
- 01-10C#利用GDI繪制常見圖形和文字
- 01-10利用C#實現(xiàn)網(wǎng)絡爬蟲
- 01-10C# 利用ICSharpCode.SharpZipLib實現(xiàn)在線壓縮和解壓縮


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery