目标
在Light2D-学习记录2中的颜色渐变存在局限,它不能分段变化。现在着手解决颜色不能分段变化的问题。
前言
Light2D-学习记录2中的颜色变化是一段式的,如下图箭头所示
而当我们需要颜色分2段连续变化时,它应当这样变化
现在来解决“颜色分N段连续变化”的问题。
代码相关
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.Rendering.Universal;
public class GlobalLightTest : MonoBehaviour
{
private Light2D light2D;
private float timer = 0f;
private List<Color> colors = new List<Color>();//定义一个泛型集合,存储端点的rgb值
int i = 0;//用于获取泛型集合中的元素
void Start()
{
light2D = GetComponent<Light2D>();
AddPoint();
}
void Update()
{
if(Input.GetKeyDown(KeyCode.L))
{
i = 0;
timer = 0f;
Debug.Log(light2D.color);
}
if(Input.GetKeyUp(KeyCode.L))
{
i = colors.Count - 1;
timer = 0f;
Debug.Log(light2D.color);
}
if(Input.GetKey(KeyCode.L))
ChangeColorStraightly();
else
ChangeColorReversely();
}
private float Timer(float _seconds)
{
float _multiple = 1f / _seconds;
if(timer <= 1f)
{
timer += Time.deltaTime * _multiple;
}
return timer;
}
private void AddPoint()//可应用于N段连续渐变,在集合里加元素即可
{
colors.Add(new Color(1f , 1f , 1f));
colors.Add(new Color(1f , 170f/255 , 70f/255));
colors.Add(new Color(70f/255 , 50f/255 , 20f/255));
}
private void ChangeColorStraightly()//顺着变化
{
if(timer <= 1f && i < colors.Count - 1 )
{
light2D.color = Color.Lerp(colors[i] ,colors[i+1] , Timer(1f));
}
else if(i < colors.Count - 1)//如果还有得变
{
i++;//继续往后变
timer = 0f;//重置计时器
Debug.Log(light2D.color);
}
}
private void ChangeColorReversely()//反着变化
{
if(timer <= 1f && i > 0)
{
light2D.color = Color.Lerp(colors[i] ,colors[i-1] , Timer(1f));
}
else if(i > 0)//如果还有得变
{
i--;//继续往前变
timer = 0f;//重置计时器
Debug.Log(light2D.color);
}
}
}
简单验证变化过程的正确性
1.计算代码中,泛型集合中所设颜色的rgb值(精确到小数点后四位)
r | g | b | |
---|---|---|---|
第一个端点 | 1 | 1 | 1 |
第二个端点 | 1 | 170/255 = 0.6667 | 70/255 = 0.2745 |
第三个端点 | 70/255 = 0.2745 | 50/255 = 0.1960 | 20/255 = 0.0784 |
2.把计算结果与输出的颜色rgb值相比对
结果和预期符合得很好。