栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity实现Image透明度渐变(Graphic)

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity实现Image透明度渐变(Graphic)

文章目录
      • 实现原理
      • 代码实现
      • 使用效果
      • 赞赏与支持

实现原理

通过Graphic中OnPopulateMesh函数修改UI传入的顶点数据(color属性中的Alpha值)

UI传入的四个顶点如下:

OnPopulateMesh函数

当一个UI元素生成顶点数据时会调用OnPopulateMesh(VertexHelper vh)函数,我们可以在这个函数中修改顶点的数据或者获取顶点的数据。

代码实现

FadeImage :

using UnityEngine;
using UnityEngine.UI;

public enum FadeMode
{
	LeftTORight,
	UpToDown,
	LeftUpTORightDown,
	LeftDownTORightUp,
}

public class FadeImage : Image
{
	public FadeMode FadeMode;
	public byte FadeStartAlpha = 0;
	public byte FadeEndAlpha = 255;

	protected override void OnPopulateMesh(VertexHelper toFill)
	{
		base.OnPopulateMesh(toFill);
		UIVertex vertex = new UIVertex();
		for (int i = 0; i < toFill.currentVertCount; i++)
		{
			toFill.PopulateUIVertex(ref vertex, i);

			if (FadeMode == FadeMode.UpToDown)
			{
				if (i == 0 || i == 3)
				{
					vertex.color = new Color32(vertex.color.r, vertex.color.g, vertex.color.b, FadeStartAlpha);
					toFill.SetUIVertex(vertex, i);
				}
				else
				{
					vertex.color = new Color32(vertex.color.r, vertex.color.g, vertex.color.b, FadeEndAlpha);
					toFill.SetUIVertex(vertex, i);
				}
			}
			else if (FadeMode == FadeMode.LeftTORight)
			{
				if (i == 0 || i == 1)
				{
					vertex.color = new Color32(vertex.color.r, vertex.color.g, vertex.color.b, FadeStartAlpha);
					toFill.SetUIVertex(vertex, i);
				}
				else
				{
					vertex.color = new Color32(vertex.color.r, vertex.color.g, vertex.color.b, FadeEndAlpha);
					toFill.SetUIVertex(vertex, i);
				}
			}
			else if (FadeMode == FadeMode.LeftDownTORightUp)
			{
				if (i == 0)
				{
					vertex.color = new Color32(vertex.color.r, vertex.color.g, vertex.color.b, FadeStartAlpha);
					toFill.SetUIVertex(vertex, i);
				}
				else if (i == 1 || i == 3)
				{
					vertex.color = new Color32(vertex.color.r, vertex.color.g, vertex.color.b, (byte)((FadeEndAlpha + FadeStartAlpha) / 2));
					toFill.SetUIVertex(vertex, i);
				}
				else
				{
					vertex.color = new Color32(vertex.color.r, vertex.color.g, vertex.color.b, FadeEndAlpha);
					toFill.SetUIVertex(vertex, i);
				}
			}
			else if (FadeMode == FadeMode.LeftUpTORightDown)
			{
				if (i == 1)
				{
					vertex.color = new Color32(vertex.color.r, vertex.color.g, vertex.color.b, FadeStartAlpha);
					toFill.SetUIVertex(vertex, i);
				}
				else if (i == 0 || i == 2)
				{
					vertex.color = new Color32(vertex.color.r, vertex.color.g, vertex.color.b, (byte)((FadeEndAlpha + FadeStartAlpha) / 2));
					toFill.SetUIVertex(vertex, i);
				}
				else
				{
					vertex.color = new Color32(vertex.color.r, vertex.color.g, vertex.color.b, FadeEndAlpha);
					toFill.SetUIVertex(vertex, i);
				}
			}
		}
	}
}

FadeImageEditor:

using UnityEditor;
using UnityEditor.UI;

[CustomEditor(typeof(FadeImage))]
public class FadeImageEditor : ImageEditor
{
    protected SerializedProperty FadeMode;
    protected SerializedProperty FadeStartAlpha;
    protected SerializedProperty FadeEndAlpha;

    protected override void OnEnable()
    {
        base.OnEnable();
        FadeMode = serializedObject.FindProperty("FadeMode");
        FadeStartAlpha = serializedObject.FindProperty("FadeStartAlpha");
        FadeEndAlpha = serializedObject.FindProperty("FadeEndAlpha");
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        serializedObject.Update();
        EditorGUILayout.PropertyField(FadeMode);
        EditorGUILayout.PropertyField(FadeStartAlpha);
        EditorGUILayout.PropertyField(FadeEndAlpha);
        serializedObject.ApplyModifiedProperties();
    }
}
使用效果



赞赏与支持

【收藏与点赞】
觉得写的不错的可以收藏点赞转发噢~

【请作者喝杯咖啡】
觉得写的不错的可以请作者喝杯咖啡噢~


(完)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901846.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号