热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

Unity利用材质自发光实现物体闪烁

这篇文章主要为大家详细介绍了Unity利用材质自发光实现物体闪烁,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Unity中利用材质自发光实现物体闪烁效果,供大家参考,具体内容如下

补充:这种方法有一点问题,在测试(Windows平台)的时候发现,要想在Build出来的游戏中实现闪烁效果,就必须在 Project 窗口中将源材质的自发光属性(Emission)启用,否则自发光效果就只能在编辑器模式中生效。

启用源材质的自发光效果后,将其亮度(Brightness)调整为0,物体看起来就和没有启用自发光时一样。

看到别的游戏里有物体高亮闪烁效果,但自己不会写Shader,就只想到用材质自发光来做一下,不知道有没有更好的办法!

原理比较简单,通过代码开启材质的自发光效果,然后不断地调整自发光的亮度即可。
首先要获取到材质对象实例 material,然后通过其进行其他操作:

启用自发光效果的代码是 material.EnableKeyword("_EMISSION")

关闭自发光效果的代码是 material.DisableKeyword("_EMISSION")

设置自发光颜色和亮度的代码是 material.SetColor("_EmissionColor", Color.HSVToRGB(_h, _s, _v))

  • 其中的 _h、_s、_v参数分别代表颜色的色相、饱和度和亮度。
  • 获取颜色的色相、饱和度和亮度的代码为 Color.RGBToHSV(color, out _h, out _s, out _v)

下面有完整的源代码

此方法实现的闪烁效果不能发出光晕,因为自发光的光晕必须经过烘焙才能生效,而烘焙是在运行前完成的,所以无法在运行时产生光晕效果;另外闪烁的最高亮度只能为1,不能像烘焙时那样将亮度设为大于1而产生HDR效果。

源代码

using System.Collections;
using UnityEngine;

public class Glinting : MonoBehaviour
{
 /// 
 /// 闪烁颜色
 /// 
 public Color color = new Color(1, 0, 1, 1);
 /// 
 /// 最低发光亮度,取值范围[0,1],需小于最高发光亮度。
 /// 
 [Range(0.0f, 1.0f)]
 public float minBrightness = 0.0f;
 /// 
 /// 最高发光亮度,取值范围[0,1],需大于最低发光亮度。
 /// 
 [Range(0.0f, 1)]
 public float maxBrightness = 0.5f;
 /// 
 /// 闪烁频率,取值范围[0.2,30.0]。
 /// 
 [Range(0.2f, 30.0f)]
 public float rate = 1;

 [Tooltip("勾选此项则启动时自动开始闪烁")]
 [SerializeField]
 private bool _autoStart = false;

 private float _h, _s, _v;  // 色调,饱和度,亮度
 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();
 _material = _renderer.material;

 if (_autoStart)
 {
  StartGlinting();
 }
 }

 /// 
 /// 校验数据,并保证运行时的修改能够得到应用。
 /// 该方法只在编辑器模式中生效!!!
 /// 
 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);
 }

 /// 
 /// 开始闪烁。
 /// 
 public void StartGlinting()
 {
 _material.EnableKeyword(_keyword);

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

 /// 
 /// 停止闪烁。
 /// 
 public void StopGlinting()
 {
 _material.DisableKeyword(_keyword);

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

 /// 
 /// 控制自发光强度。
 /// 
 /// 
 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;
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 如何更改电脑系统的自动校时服务器地址?
    本文介绍了如何通过注册表编辑器更改电脑系统的自动校时服务器地址。通过修改注册表中的数值数据或新建字符串数值的方式,可以将默认的时钟同步服务器地址更改为自己所需要的域名或IP地址。详细步骤包括双击时间区域,点击internet时间,勾选自动校正域名设置定时等操作。 ... [详细]
  • 使用chrome编辑器实现网页截图功能的方法
    本文介绍了在chrome浏览器中使用编辑器实现网页截图功能的方法。通过在地址栏中输入特定命令,打开控制台并调用命令面板,用户可以方便地进行网页截图操作。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • 本文介绍了在Linux中执行.sh脚本时出现/bin/sh^M: bad interpreter: No such file or directory异常的原因分析,并提供了两种解决方法:在Windows下进行编码格式转换,或在Linux中修改文件格式和执行权限。具体操作步骤也在摘要中给出。 ... [详细]
  • 本文讨论了在PHP中将空格转换为问号的问题,并提供了解决方案。文章指出,空格不是标准的空格,而是特殊的0xC2 0xA0字符。作者尝试使用mb_convert_encoding函数将utf8字符串转换为gbk编码,但未成功。文章建议检查编辑器是否对空格进行了特殊处理,并提供了使用base64_encode函数打印结果的方法。最后,给出了完整的代码示例。 ... [详细]
  • 本文详细介绍了Vim编辑器中的三种模式(命令模式、末行模式和编辑模式)以及它们之间的操作区别和切换方法。Vim编辑器凭借其多种命令快捷键和高效率的操作方式,得到了广大厂商和用户的认可。对于想要高效操作文本的用户来说,了解这些模式的使用方法是必不可少的。 ... [详细]
  • 本文介绍了三种方法来关闭win7电脑开机硬盘自检,分别是使用命令提示符、注册表编辑器和bios设置界面。通过取消硬盘自检可以加快电脑启动速度。详细步骤和操作说明在正文中有详细介绍。 ... [详细]
  • Win7系统如何实现Ctrl+Alt+Del热键组合呼出任务管理器
    本文介绍了在Win7系统中如何通过组策略编辑器设置,实现Ctrl+Alt+Del热键组合呼出任务管理器的方法。通过删除原有的项目并设置呼出任务管理器,用户可以方便地使用Ctrl+Alt+Del热键组合来打开任务管理器。 ... [详细]
  • OC渲染器和阿诺德渲染器的特点及适用范围
    本文介绍了C4D软件自带的渲染器效果较差的问题,并推荐了四款C4D渲染器,其中包括OC渲染器和阿诺德渲染器。OC渲染器渲染速度快,简单易用,特别适合小团队和个人使用,而阿诺德渲染器具有超快的预览功能和真实的渲染效果,适合在体积光处理方面使用。两款渲染器都支持多个C4D版本和不同操作系统。 ... [详细]
  • OCI连接MySQL_PLSQL Developer连接远程数据库OCI客户端安装方法
    本文介绍了使用OCI客户端连接MySQL和PLSQL Developer连接远程数据库的安装方法,避免了在本地安装Oracle数据库或类似的开发套件的麻烦,同时解决了PLSQL Dev连接远程Oracle时的配置问题。 ... [详细]
author-avatar
oyy8610406
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有