在开发《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); } }
暂无关于此文章的评论。