【unity2D】Light2D-学习记录3-代码控制光照颜色的分段连续渐变

目标

Light2D-学习记录2中的颜色渐变存在局限,它不能分段变化。现在着手解决颜色不能分段变化的问题

前言

Light2D-学习记录2中的颜色变化是一段式的,如下图箭头所示
image

而当我们需要颜色分2段连续变化时,它应当这样变化
image

现在来解决“颜色分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 colors = new List();//定义一个泛型集合,存储端点的rgb值
int i = 0;//用于获取泛型集合中的元素

void Start()
{
light2D = GetComponent();

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值相比对
image

结果和预期符合得很好。

最终效果

image

posted @ 2021-04-29 18:37  AshScops  阅读(375)  评论(0)    收藏  举报