欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C#教程

當(dāng)前位置:主頁 > 軟件編程 > C#教程 >

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

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C#教程|點(diǎn)擊: 次

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

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

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

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

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

啟用自發(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)

下面有完整的源代碼

此方法實(shí)現(xiàn)的閃爍效果不能發(fā)出光暈,因?yàn)樽园l(fā)光的光暈必須經(jīng)過烘焙才能生效,而烘焙是在運(yùn)行前完成的,所以無法在運(yùn)行時(shí)產(chǎn)生光暈效果;另外閃爍的最高亮度只能為1,不能像烘焙時(shí)那樣將亮度設(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("勾選此項(xiàng)則啟動時(shí)自動開始閃爍")]
  [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>
  /// 校驗(yàn)數(shù)據(jù),并保證運(yùn)行時(shí)的修改能夠得到應(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 ,否則在運(yùn)行時(shí)修改參數(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ā)光強(qiáng)度。
  /// </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í)有所幫助,也希望大家多多支持我們。

上一篇:C#使用HttpWebRequest重定向方法詳解

欄    目:C#教程

下一篇:C#實(shí)現(xiàn)簡單記事本程序

本文標(biāo)題:Unity利用材質(zhì)自發(fā)光實(shí)現(xiàn)物體閃爍

本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4797.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有