文章目录


本文基于VDer的文章《Unity中利用材质自发光实现物体闪烁效果》延伸开发

在实现了具有一个Material的物体闪烁发光之后,延伸开发了具有多个Material的自闪烁效果,感谢VDer的技术分享!

使用方法:直接将该脚本挂到物体上,AutoStart为自动闪烁。具体功能看脚本。

2019.12.21更新:

若物体不闪烁,参照ViveFocus博客:链接

2019.05.21更新:

该脚本所挂物体Start时现在可以处于关闭状态啦(原先初始化时必须激活,否则不闪烁)

2018.11.28更新:

增加当前是否发光状态监测:isGlinting

Code:

using System.Collections;
using UnityEngine;public class Skode_Glinting : MonoBehaviour
{/// <summary>/// 闪烁颜色/// </summary>public Color color = new Color(61 / 255f, 226 / 255f, 131 / 255, 1);/// <summary>/// 最低发光亮度,取值范围[0,1],需小于最高发光亮度。/// </summary>[Tooltip("最低发光亮度,取值范围[0,1],需小于最高发光亮度。")][Range(0.0f, 1.0f)]public float minBrightness = 0.0f;/// <summary>/// 最高发光亮度,取值范围[0,1],需大于最低发光亮度。/// </summary>[Tooltip("最高发光亮度,取值范围[0,1],需大于最低发光亮度。")][Range(0.0f, 1)]public float maxBrightness = 0.5f;/// <summary>/// 闪烁频率,取值范围[0.2,30.0]。/// </summary>[Tooltip("闪烁频率,取值范围[0.2,30.0]。")][Range(0.2f, 30.0f)]public float rate = 1;//是否闪烁[HideInInspector]public bool isGlinting = false;[Tooltip("勾选此项则启动时自动开始闪烁")][SerializeField]private bool _autoStart = false;private float _h, _s, _v;           // 色调,饱和度,亮度private float _deltaBrightness;     // 最低最高亮度差private Renderer _renderer;//private Material _material;private Material[] _materials;private readonly string _keyword = "_EMISSION";private readonly string _colorName = "_EmissionColor";private Coroutine _glinting;private void OnEnable(){_renderer = gameObject.GetComponent<Renderer>();//_material = _renderer.material;_materials = _renderer.materials;if (_autoStart){StartGlinting();}}/// <summary>/// 校验数据,并保证运行时的修改能够得到应用。/// 该方法只在编辑器模式中生效!!!/// </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 ,否则在运行时修改参数会导致亮度突变float tempV = 0;Color.RGBToHSV(color, out _h, out _s, out tempV);}/// <summary>/// 开始闪烁。/// </summary>public void StartGlinting(){isGlinting = true;if (_materials != null){if (_materials.Length > 0){//_material.EnableKeyword(_keyword);for (int i = 0; i < _materials.Length; i++){_materials[i].EnableKeyword(_keyword);}if (_glinting != null){StopCoroutine(_glinting);}_glinting = StartCoroutine(IEGlinting());}}}/// <summary>/// 停止闪烁。/// </summary>public void StopGlinting(){isGlinting = false;//_material.DisableKeyword(_keyword);for (int i = 0; i < _materials.Length; i++){_materials[i].DisableKeyword(_keyword);}if (_glinting != null){StopCoroutine(_glinting);}}/// <summary>/// 控制自发光强度。/// </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));for (int i = 0; i < _materials.Length; i++){_materials[i].SetColor(_colorName, Color.HSVToRGB(_h, _s, _v));}//_renderer.UpdateGIMaterials();yield return null;}}
}

大家还有什么问题,欢迎在下方留言!


如果你有 技术的问题 或 项目开发

都可以加下方联系方式

和我聊一聊你的故事

小功能⭐️Unity中利用材质自发光实现物体闪烁效果相关推荐

  1. Unity中利用材质自发光实现物体闪烁效果

    Unity中利用材质自发光实现物体闪烁效果 补充:这种方法有一点问题,在测试(Windows平台)的时候发现,要想在Build出来的游戏中实现闪烁效果,就必须在 Project 窗口中将源材质的自发光 ...

  2. unity材质球发光_Unity利用材质自发光实现物体闪烁

    Unity中利用材质自发光实现物体闪烁效果,供大家参考,具体内容如下 补充:这种方法有一点问题,在测试(Windows平台)的时候发现,要想在Build出来的游戏中实现闪烁效果,就必须在 Projec ...

  3. Unity中利用NOPI读取Excel

    Unity中利用NOPI读取Excel ---0v0--- 前言 ---0_0--- NPOI的相关.dll网盘下载链接 一.解析Excel的类 二.测试代码 -0v0- 前言 最近工作遇到解析.xl ...

  4. VB.net小技巧——VB中利用TreeView控件和Box控件做知识备忘

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 VB.net小技巧--VB中利用TreeView控件和Box控件做知识备忘 这里不涉及代码的展示,主要是为了阐述一种做笔记的思想. 为 ...

  5. Unity中 利用Line Renderer || Trail Renderer制作飘烟拖尾

    在Unity中粒子特效就可以制作飘烟拖尾,但是如果运动过快难免会有不自然的断开.虽然粒子中加入了Trail,但是我让拖尾转角圆滑比较困难(这方面还得请教特效同学).当然如果对转角没有要求,粒子还是最简 ...

  6. Unity中利用C#开发泡泡龙游戏

    泡泡龙是一款非常经典的游戏,版本有很多,如百度的<彩色泡泡>等.游戏开始时,泡泡应该出现m行:如果连续n次发射泡泡没有出现同色泡泡相消的情况,在屏幕上方自动加上一行泡泡:如果屏幕中泡泡全部 ...

  7. 【Unity Shader】Unity中利用GrabPass实现玻璃效果

    <入门精要>中模拟玻璃是用了Unity里的一个特殊的Pass来实现的,这个Pass就是GrabPass,比起上一篇博客实现镜子的方法,这个方法我认为相对复杂,因此在实现之前需要对GrabP ...

  8. unity editor android 黑屏_如何在Unity中利用nReal制作AR应用

    来源:新浪VR nReal眼镜是今年最有趣的增强现实小工具之一.它们已经在CES上展示过了,几个月前笔者在北京亲自试用过,在我的评测中,我强调了它们不仅非常轻.时尚,而且还能提供非常明亮的全息视图. ...

  9. Unity中利用动画机(Animation) 制作物体的爆炸拆解

    主要介绍的是利用动画机系统来制作简单的爆炸拆解动画,并能够通过相应的键盘上的按钮来控制物体的拆分和聚合. 首先,选中你所需要拆解的物体,如果是分散的,你可以先创建一个空物体(Create Empty) ...

最新文章

  1. 联想重启乐檬?5G时代手机双品牌战略带来变局
  2. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )
  3. Hadoop随笔(一)
  4. 腾讯云连续四年排名中国音视频解决市场第一,头部厂商中RTC增速第一
  5. JEECG智能开发平台-项目选型最爱
  6. 偏置面命令_UG10.0同步建模之移动面、删除面、替换面详解
  7. mysql jdbc linux,linux mysql jdbc 权限问题_MySQL
  8. AudioBufferSourceNode
  9. hbase1.1.1 连接集群_hbase1.2.3集群搭建
  10. 夏令营提高班上午上机测试 Day 1 解题报告
  11. android 在app内打开淘宝链接
  12. zabbix + nexmo = 电话告警
  13. 最小生成树Prim算法
  14. post-processing effects HDR
  15. 微信号名称乱码什么情况_微信号改成什么比较好,2020最火微信号!
  16. 【渝粤题库】陕西师范大学163209 旅游企业战略管理
  17. 选购地磁传感器应避免哪些坑
  18. 深度ghostxp_sp3至尊纯净版 v2013.08
  19. 用秦九昭公式计算多项式
  20. Flutter现支持Web和桌面,一跃成为前沿大一统框架,【面试必备】

热门文章

  1. php中fwrite函数的用法,PHP函数fwrite的用法
  2. BADI 构建方法(NEW BADI 实施)
  3. 计算机产业能否迅速发展,工业计算机得到了迅速的发展和全面的普及
  4. 秋季出生的宝宝这样起名,全班同学都羡慕。
  5. 安卓9.0 调用系统相册,拍照,图片裁剪的权限
  6. HDCP @HMAC-SHA256[基于mbedtls]
  7. 上海大学生计算机一级考试时间,2019上海各大学期末考试时间安排 什么时候期末考试...
  8. java第一个程序编译失败,零基础java第一个程序HelloWorld,编译,环境变量,运行,注释...
  9. 区块链为什么热衷开源?超级账本最有说服力!
  10. 水粉中的这两种绘画方法?你经常用哪种?