实现效果
精灵遮罩
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BlakeColourRender : MonoBehaviour
{
public RenderData[] renderDatas;
private bool startChangeAlphaAndScaleValues;
void Start()
{
renderDatas = new RenderData[3];
for (int i = 0; i < renderDatas.Length; i++)
{
renderDatas[i] = new RenderData();
}
//获取背景底色信息,放入0号位
GetDatas(transform.GetChild(0), 0);
//获取晕开颜色信息
GetDatas(transform.GetChild(1), 1);
//获取其他颜色信息
GetDatas(transform.GetChild(2), 2);
}
void Update()
{
ChangeAlphaAndScaleValues();
}
// 启动修改下层颜色透明度与缩放值的开关(外部调用)
public void StartChangeAlphaAndScaleValues()
{
startChangeAlphaAndScaleValues = true;
}
// 修改下方颜色透明度以及缩放功能
private void ChangeAlphaAndScaleValues()
{
if (startChangeAlphaAndScaleValues)
{
for (int i = 0; i < renderDatas[2].srs.Length; i++)
{
ChangeAlphaValue(renderDatas[2].srs[i], renderDatas[2].aValues[i]);
ChangeScaleValue(renderDatas[2].trans[i], renderDatas[2].scales[i]);
}
}
}
/// <summary>
/// 改变某一个带有精灵渲染器的游戏物体的缩放值
/// </summary>
/// <param name="t"></param>
/// <param name="targetValue"></param>
private void ChangeScaleValue(Transform t, Vector3 targetValue)
{
if (t.localScale.x <= targetValue.x)
{
t.localScale += Vector3.one * 1 * Time.deltaTime;
}
}
/// <summary>
/// 向目标值进行改变某一个精灵渲染器中透明度值
/// </summary>
/// <param name="sr"></param>
/// <param name="targetValue">目标值</param>
private void ChangeAlphaValue(SpriteRenderer sr, float targetValue)
{
if (sr.color.a <= targetValue)
{
sr.color += new Color(0, 0, 0, 1) * Time.deltaTime;
}
}
/// <summary>
/// 渐变改变某一个精灵遮罩透明度裁剪值
/// </summary>
/// <param name="sm"></param>
private void ChangeAlphaCutoffValue(SpriteMask sm)
{
if (sm.alphaCutoff >= 0.2f)
{
sm.alphaCutoff -= 0.1f * Time.deltaTime;
}
}
/// <summary>
/// 获取原始状态数据并设置默认值
/// </summary>
/// <param name="targetTrans">想要记录所有子对象信息的根游戏物体的Transform组件</param>
/// <param name="index">想存贮到的数组索引位置中</param>
private void GetDatas(Transform targetTrans, int index)
{
//获取精灵渲染器组件,存贮alpha值并在后续把alpha值设置回精灵渲染器组件里
renderDatas[index].srs = targetTrans.GetComponentsInChildren<SpriteRenderer>();
//不new报空
int renderDataslength = renderDatas[index].srs.Length;
renderDatas[index].trans = new Transform[renderDataslength];
renderDatas[index].scales = new Vector3[renderDataslength];
renderDatas[index].aValues = new float[renderDataslength];
for (int i = 0; i < renderDataslength; i++)
{
//存储数据
//获取有精灵渲染器组件的transform,后续可以把缩放值设置回对应的游戏物体上
renderDatas[index].trans[i] = renderDatas[index].srs[i].transform;
//获取有精灵渲染器组件的transform中的缩放值
renderDatas[index].scales[i] = renderDatas[index].trans[i].localScale;
//获取有精灵渲染器组件的alpha值
renderDatas[index].aValues[i] = renderDatas[index].srs[i].color.a;
//设置默认状态(值)
renderDatas[index].trans[i].localScale = Vector3.zero;
//设置RBGA值
renderDatas[index].srs[i].color = new Color(renderDatas[index].srs[i].color.r, renderDatas[index].srs[i].color.b, renderDatas[index].srs[i].color.g, 0);
}
//获取含mask的物体
renderDatas[index].sms = targetTrans.GetComponentsInChildren<SpriteMask>();
for (int i = 0; i < renderDatas[index].sms.Length; i++)
{
renderDatas[index].sms[i].alphaCutoff = 1;
}
}
}
[System.Serializable]
public class RenderData
{
public SpriteMask[] sms;
public SpriteRenderer[] srs;
public Vector3[] scales;
public float[] aValues;
public Transform[] trans;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ColourOnOff : MonoBehaviour
{
private BlakeColourRender rc;
void Update()
{
rc = GameObject.Find("RenderColors").GetComponent<BlakeColourRender>();
if (Input.GetMouseButtonDown(0))
{
rc.StartChangeAlphaAndScaleValues();
}
}
}