在开发《Anchor》的时候发现 Unity 暂时不支持在代码中直接替换 gradient,且无法 expose 在 inspector 中,因此想出个笨办法来解决。另在 shader 中做了大于 2 色的 gradient。
Overview
- Sprite Unlit Master
- 用 Shader 创建 Material 并应用在 sprite 上
- shader 一共三个部分:
Original Gradient、Target Gradient、Lerp Control

Gradient
Original和Target一样- 按
gradient的colorkey个数可以自行添加更多Lerp Node

Lerp Control
LerpStatus可以看作是 A 到 B 的百分比进度,被限制在0到1之间,可以按需修改成Time Node等

属性总览


代码
- 随便放在谁身上,inspector 中调好想要的 gradients
- 测试用,写的粗糙了点
public SpriteRenderer spriteRenderer;
//Inspector 中自己设置的 Gradients
public Gradient gradientOriginal;
public Gradient gradientTarget;
//储存 colorkeys 的 list
List<Color> originalColors = new List<Color>();
List<Color> targetColors = new List<Color>();
//括号内红字是 Property 的名字,按上图
private static readonly int OriginalTop = Shader.PropertyToID("Color_EED7677C");
private static readonly int OriginalMid = Shader.PropertyToID("Color_73BE25BF");
private static readonly int OriginalBottom = Shader.PropertyToID("Color_D936B97");
private static readonly int TargetTop = Shader.PropertyToID("Color_A1B04C9A");
private static readonly int TargetMid = Shader.PropertyToID("Color_D4C6EBC5");
private static readonly int TargetBottom = Shader.PropertyToID("Color_5127E8E4");
private void Start()
{
foreach (var gradientColorKey in gradientOriginal.colorKeys)
{
originalColors.Add(gradientColorKey.color);
}
foreach (var gradientColorKey in gradientTarget.colorKeys)
{
targetColors.Add(gradientColorKey.color);
}
//设置 shader 中的 gradient 颜色
spriteRenderer.material.SetColor(OriginalTop, originalColors[2]);
spriteRenderer.material.SetColor(OriginalMid, originalColors[1]);
spriteRenderer.material.SetColor(OriginalBottom, originalColors[0]);
spriteRenderer.material.SetColor(TargetTop, targetColors[2]);
spriteRenderer.material.SetColor(TargetMid, targetColors[1]);
spriteRenderer.material.SetColor(TargetBottom, targetColors[0]);
}
//测试用
//控制 Lerp 的进度
private void Update()
{
if (Input.GetKey(KeyCode.UpArrow))
{
spriteRenderer.material.SetFloat(LerpControl,
spriteRenderer.material.GetFloat(LerpControl) + .01f);
}
if (Input.GetKey(KeyCode.DownArrow))
{
spriteRenderer.material.SetFloat(LerpControl,
spriteRenderer.material.GetFloat(LerpControl) - .01f);
}
}最终效果



暂无关于此文章的评论。