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;

}

}

}

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

unity材质球发光_Unity利用材质自发光实现物体闪烁相关推荐

  1. unity材质球发光_unity自发光材质

    [www.520z-2.com - 话题作文] 篇一:<Unity内置Shader着色器效果整理> Unity内置及常用Shader整理 一.Shader脚本结构: Shader &quo ...

  2. unity材质球发光_Unity Lighting - Emissive Materials 自发光材质(九)

    Whilst Area Lights are not supported by Precomputed Realtime GI, similar soft lighting effects are s ...

  3. [unity3d][通过代码]改变材质球颜色,动态改变材质球颜色,动态改变模型颜色

    unity通过代码改变材质球颜色 gitee地址:https://gitee.com/asiworld csdn博客地址:https://blog.csdn.net/JianShengShuaiest ...

  4. Unity 多重材质球替换、多重材质球特定贴图替换、Materials替换

    又被问到多重材质球的特定材质球怎么替换.之前遇到这个问题的时候,天真的以为可以用skinned.materials[0] = xxx替换,结果不能替换,但是材质球特定的贴图是可以替换.想到materi ...

  5. Unity动态创建材质球

    目录 一.获取贴图 1:从Assets文件中获取 2:从本地文件中获取 二.创建材质球 三.替换材质 总结 前言 我们在做一些AR类似与涂涂乐的功能时,经常会用到给模型替换材质球的功能.当我们的用户创 ...

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

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

  7. 小功能⭐️Unity中利用材质自发光实现物体闪烁效果

    文章目录 本文基于VDer的文章<Unity中利用材质自发光实现物体闪烁效果>延伸开发 在实现了具有一个Material的物体闪烁发光之后,延伸开发了具有多个Material的自闪烁效果, ...

  8. unity地面添加材质球_unity自带材质球

    Unity5中重点推出了一套基于物理的着色(Physically Based Shading,PBS)的多功能Shader,叫做标准着色器(Standard Shader).这套Shader的设计初衷 ...

  9. Unity使用材质球使图片发光

    首先,新建一个material,shader属性设置为standard 材质球建好之后 ,将图片拖入Albedo 勾选Emission后出现Color选项 将图片拖进去 此时Color可以更改HDR, ...

最新文章

  1. 【C++】多线程(链式、循环队列)实现生产者消费者模式
  2. YOLOv5在建筑工地中安全帽佩戴检测的应用
  3. java线程-保护性暂停(wait,notify实现)
  4. 通过举例谈谈阻塞赋值与非阻塞赋值的区别
  5. 脑洞大开,如何生成 2018 年度代码报告
  6. solr参数之facet
  7. 程序员内卷?连熬数夜肝出这份2021Java面试题核心知识点总结,近300页!
  8. java工作中mq应用多吗_RabbitMQ消息中间件在工作中的应用场景
  9. 【现代编译器】语法分析——正则表达式,上下文无关文法,递归下降分析,分析树...
  10. 【网络安全】PGP/GPG优质教程汇总
  11. 快手小视频批量下载高清无水印软件 快手短视频批量下载高清无水印软件
  12. 没有U盘纯硬盘安装linux之manjaro
  13. 计算机考研专业课数字,2020北京航空航天大学计算机考研初试专业课经验
  14. 论文阅读笔记——野外和非侵入性遗传方法评估棕熊种群规模
  15. jedis的Read timed out异常解决
  16. Java 实现钉钉企业内部应用免登
  17. 程序员如何通过造轮子走向人生巅峰?
  18. 专访天联世纪总裁朱威廉:暴利网游遭遇拐点
  19. python毕业设计项目源码选题(17)校园二手书籍交易系统毕业设计毕设作品开题报告开题答辩PPT
  20. Flask最强攻略 - 跟DragonFire学Flask - 第十五篇 Flask-Script

热门文章

  1. 外贸人应该灵活运用的“套路”
  2. 二叉树基本知识点图文介绍(全网最简洁)
  3. 《Python编程:从入门到实践》读书笔记:第13章 外星人来了
  4. Servlet+html+css+jsp+mysql实现用户登录
  5. python勾股定理中三个数的关系是、找出三十以内的_从勾股定理到余弦相似度-程序员的数学基础...
  6. AssertionError: WARNING: No labels found in ** Can not train without labels.
  7. MacOS解决sudo权限问题以及授予非管理员用户根目录管理权限
  8. 概率初步(1 Juin, 2019)
  9. TestLink1.6.0安装说明
  10. Android基础——RecycleView