服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity利用材质自发光实现物体闪烁

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

2022-07-19 10:01Symbolizer C#

这篇文章主要为大家详细介绍了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效果。

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

源代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
using System.Collections;
using UnityEngine;
 
public class Glinting : MonoBehaviour
{
 /// <summary>
 /// 闪烁颜色
 /// </summary>
 public Color color = new Color(1, 0, 1, 1);
 /// <summary>
 /// 最低发光亮度,取值范围[0,1],需小于最高发光亮度。
 /// </summary>
 [Range(0.0f, 1.0f)]
 public float minBrightness = 0.0f;
 /// <summary>
 /// 最高发光亮度,取值范围[0,1],需大于最低发光亮度。
 /// </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;  // 色调,饱和度,亮度
 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>
 /// 校验数据,并保证运行时的修改能够得到应用。
 /// 该方法只在编辑器模式中生效!!!
 /// </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()
 {
 _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>
 /// 控制自发光强度。
 /// </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;
 }
 }
}

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

原文链接:https://blog.csdn.net/qq_21397217/article/details/80967432

延伸 · 阅读

精彩推荐
  • C#UnityShader3实现2D描边效果

    UnityShader3实现2D描边效果

    这篇文章主要为大家详细介绍了UnityShader3实现2D描边效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    lyh9168492022-03-11
  • C#C#如何操作Excel数据透视表

    C#如何操作Excel数据透视表

    这篇文章主要为大家详细介绍了C#如何操作Excel数据透视表, 创建透视表、设置行折叠、展开等操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    E-iceblue11562022-02-22
  • C#C#委托与匿名委托详解

    C#委托与匿名委托详解

    这篇文章主要为大家详细介绍了C#委托与匿名委托的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    DW03910512022-01-20
  • C#WPF利用RPC调用其他进程的方法详解

    WPF利用RPC调用其他进程的方法详解

    这篇文章主要给大家介绍了关于WPF利用RPC调用其他进程的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    lindexi7512022-02-24
  • C#深入浅析Restful接口的两种使用方式

    深入浅析Restful接口的两种使用方式

    restful接口常用的两种方式是get和post.接下来通过本文给大家介绍Restful接口的两种使用方式,本文给大家介绍的非常详细,需要的朋友参考下吧...

    陈晓婵10842022-03-01
  • C#一文说通异步 LINQ

    一文说通异步 LINQ

    早期的 LINQ,主要是同步的,直到 C# 8.0 加入 IAsyncEnumerable,LINQ 才真正转向异步。这本来是个非常好的改变,配合 System.Linq.Async 库提供的扩展,可以在诸如...

    老王Plus6612021-09-15
  • C#C#实现JSON解析器MojoUnityJson功能(简单且高效)

    C#实现JSON解析器MojoUnityJson功能(简单且高效)

    MojoUnityJson 是使用C#实现的JSON解析器 ,算法思路来自于游戏引擎Mojoc的C语言实现 Json.h。这篇文章主要介绍了C#实现JSON解析器MojoUnityJson的方法,需要的朋友...

    scottcgi11722022-02-19
  • C#C#实现简单计算器功能

    C#实现简单计算器功能

    给大家分享用C#写出一个计算机功能的全部代码分享,有兴趣的朋友可以跟着做一下。...

    彬菌8022022-02-22