用UGUI的Image画面积图

使用UGUI的Image画面积图


哈哈,本大猫又回来了,新的工作,新的生活。愿自己和看到这段话的你们,生活越来越辛福美满!


唔,先上图:
这里写图片描述


1. 参考引用:

[1] https://www.cnblogs.com/jeason1997/p/5130413.html 在Unity中使用UGUI修改Mesh绘制几何图形 (作者:Jeason1997)


2. 实现思路:
UGUI的Image实现方式和一般的Mesh一样,都是通过顶点描绘出来的。通过察看Image这个类的代码,发现它提供了虚函数,需要用到的关键函数是OnPopulateMesh(VertexHelper toFill)。


3. 好像也没啥需要多说的,就是给出顶点(位置,颜色,VU),然后一个一个三角形按照顺时针方向连起来。emmmm,上代码~


1)核心代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DrawAreaDiagram : Image {
    private List<float> percentArray = new List<float>();//百分比数组
    private float brokenLineWidth = 3f;//折线的宽度
    private Vector3 origin;//绘图区域的原点
    private Vector2 area;//宽高范围
    private Color[] lineColors;//折线
    private Color[] imageTopColors;//顶部
    private Color[] imageButtomColors;//底部
    private Vector3[] vertPositions;
    private int times = 3;

    private float pointQuadlength = 6f;//节点的边长
    private Vector3[] pointQuadPositions;//节点的位置
    private int quadSides = 4;//节点的边数

    private void Update()
    {
        SetVerticesDirty();//刷新
    }

    protected override void OnPopulateMesh(VertexHelper toFill)
    {
        if (percentArray.Count == 0)
        {
            base.OnPopulateMesh(toFill);
        }
        else
        {
            toFill.Clear();
            for (int i = 0; i < percentArray.Count; i++)
            {
                toFill.AddVert(vertPositions[i * times], imageButtomColors[i], new Vector2((float)i / percentArray.Count, 0));//下
                toFill.AddVert(vertPositions[i * times + 1], imageTopColors[i], new Vector2((float)i / percentArray.Count, 0.25f));//上
                toFill.AddVert(vertPositions[i * times + 1], lineColors[i], new Vector2((float)i / percentArray.Count, 0.25f));//上
                toFill.AddVert(vertPositions[i * times + 2], lineColors[i], new Vector2((float)i / percentArray.Count, 0.5f));//顶
            }

            for (int i = 0; i < percentArray.Count; i++)
            {
                toFill.AddVert(pointQuadPositions[i * quadSides], lineColors[i], new Vector2((float)i / percentArray.Count, 0.5f));//下
                toFill.AddVert(pointQuadPositions[i * quadSides + 1], lineColors[i], new Vector2((float)i / percentArray.Count, 1f));//上
                toFill.AddVert(pointQuadPositions[i * quadSides + 2], lineColors[i], new Vector2((float)i / percentArray.Count, 0.5f));//上
                toFill.AddVert(pointQuadPositions[i * quadSides + 3], lineColors[i], new Vector2((float)i / percentArray.Count, 1f));//顶
            }

            for (int i = 0; i < percentArray.Count - 1; i++)
            {
                toFill.AddTriangle(i * 4 + 0, i * 4 + 1, i * 4 + 4);
                toFill.AddTriangle(i * 4 + 1, i * 4 + 5, i * 4 + 4);

                toFill.AddTriangle(i * 4 + 2, i * 4 + 3, i * 4 + 6);
                toFill.AddTriangle(i * 4 + 3, i * 4 + 7, i * 4 + 6);
            }

            for (int i = percentArray.Count; i < percentArray.Count * 2; i++)
            {
                toFill.AddTriangle(i * 4 + 0, i * 4 + 1, i * 4 + 2);
                toFill.AddTriangle(i * 4 + 1, i * 4 + 3, i * 4 + 2);
            }
        }
    }

    public void InitDrawingParam(float _pointQuadlength,float buttomAlpha,float topAplha, float lineWidth,Color[] colors,List<float> _percentArray)
    {
        if (colors.Length != _percentArray.Count)
        {
            Debug.LogError("ArrayList is Wrong!");
            return;
        }
        pointQuadlength = _pointQuadlength;
        percentArray = _percentArray;//百分比数组
        brokenLineWidth = lineWidth;//折线的宽

        GetDrawArea();//得到绘图区域
        CreateVertPositions(_percentArray);//获取到每个顶点的坐标

        lineColors = new Color[colors.Length];
        imageTopColors = new Color[colors.Length];
        imageButtomColors = new Color[colors.Length];
        //颜色
        for (int i = 0; i < colors.Length; i++)
        {
            lineColors[i] = colors[i];
            imageTopColors[i] = colors[i];
            imageButtomColors[i] = colors[i];
            //透明度
            lineColors[i].a = 1;
            imageTopColors[i].a = _percentArray[i] * topAplha;
            imageButtomColors[i].a = buttomAlpha;
        }   
    }
    private void CreateVertPositions(List<float> _percentArray)
    {
        vertPositions = new Vector3[_percentArray.Count * times];//折线顶,折线底,图片底
        pointQuadPositions = new Vector3[_percentArray.Count * quadSides];//节点
        int arrayCount = _percentArray.Count - 1;
        for (int i = 0; i < arrayCount + 1; i++)
        {
            vertPositions[times * i] = origin + new Vector3(area.x * i / arrayCount, 0, 0);//图片底
            vertPositions[times * i + 1] = vertPositions[times * i] + new Vector3(0, area.y * _percentArray[i] - brokenLineWidth / 2);//折线底
            vertPositions[times * i + 2] = vertPositions[times * i + 1] + new Vector3(0, brokenLineWidth);//折线顶

            pointQuadPositions[quadSides * i] = origin + new Vector3(area.x * i / arrayCount - pointQuadlength / 2, area.y * _percentArray[i] - pointQuadlength / 2);//节点左下
            pointQuadPositions[quadSides * i + 1] = origin + new Vector3(area.x * i / arrayCount - pointQuadlength / 2, area.y * _percentArray[i] + pointQuadlength / 2);//节点左上
            pointQuadPositions[quadSides * i + 2] = origin + new Vector3(area.x * i / arrayCount + pointQuadlength / 2, area.y * _percentArray[i] - pointQuadlength / 2);//节点右下
            pointQuadPositions[quadSides * i + 3] = origin + new Vector3(area.x * i / arrayCount + pointQuadlength / 2, area.y * _percentArray[i] + pointQuadlength / 2);//节点右上
        } 
    }
    //原点,宽,高
    private void GetDrawArea()
    {
        area = rectTransform.rect.size;
        origin = -(Vector3)area / 2;
    }
} 

2)测试代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DrawTest : MonoBehaviour {
    private DrawAreaDiagram areaDiagram;
    # region 测试代码
    protected void Start()
    {
        areaDiagram = GetComponentInChildren<DrawAreaDiagram>(true);
        StartCoroutine(FreshImage());
    }

    IEnumerator FreshImage()
    {
        while (true)
        {
            yield return new WaitForSeconds(0.9f);
            Test();
        }
    }
    protected void Test()
    {
        Color[] colors = new Color[19];
        List<float> _percentArray = new List<float>();
        for (int i = 0; i < colors.Length; i++)
        {
            colors[i] = new Color(Random.Range(0.1f, 1f), Random.Range(0.1f, 1f), Random.Range(0.1f, 1f), 1);
            _percentArray.Add(Random.Range(0.1f, 1f));
        }
        areaDiagram.InitDrawingParam(29f, 0f, 0.9f, 5f, colors, _percentArray);
    }
    #endregion

}

4. 使用大概是这样子的:(父节点挂测试代码)
这里写图片描述

### 回答1: UGUI翻页动Shader是一种用于Unity引擎中用户形用户界面(UGUI)元素交互动效果的特殊Shader。该Shader实现了各种UI元素(例如按钮、进度条、文本框等)的翻页动效果。当用户在UI元素上进行互动时,翻页动效果会在屏幕上呈现出来,为UI元素增添了动感和生动性。 该Shader的实现原理是基于OpenGL ES Shading Language(GLSL)语言,通过在shader中定义相关变量、函数、计算等操作,实现不同UI元素的翻页动效果。例如,实现按钮按下时的翻页动效果,可以通过以下操作实现:先定义一个时间变量t,通过逐渐递增这个变量,实现按钮的“翻页”效果,和控制按钮的不透明度变化,实现按钮尺寸变化及颜色变化等,从而达到翻页动效果的目的。 UGUI翻页动Shader具有高效运行、易于实现、定制性高等特点,在游戏制作、APP开发等领域被广泛应用。该Shader不仅可以实现基本的翻页动效果,还可以实现更复杂的动效果,例如卡片翻转、书页翻动等。 总之,UGUI翻页动Shader是拥有广泛应用前景和开发价值的一种Shader,具有灵活性和多样性,可以大大增强游戏、APP等项目的用户体验效果。 ### 回答2: UGUI是Unity自带的UI系统,可以用于制作UI界面。而翻页动则是一种常见的UI效果,在翻页过程中,页面会根据鼠标的拖动或者触摸移动,并且具有一定的阻尼效果,这样用户可以更加自然的翻页。 UGUI翻页动的实现离不开Shader技术,Shader可以控制UI界面中每个元素的材质,包括颜色、纹理、透明度、反射率、折射率等属性,通过改变这些属性的值来制作出不同的效果。 翻页动使用的Shader技巧主要包括: 1. 数学计算:通过计算页面的位置和距离来实现页面的移动和旋转,并且加入阻尼效果,使得页面翻转更加自然。 2. 材质属性:通过修改材质属性来实现不同的效果,比如设置不同的透明度来模拟页面翻转的过程,设置反射率和折射率来模拟页面的光影效果。 3. 贴:通过贴来实现页面内容的翻转效果,比如将背面的贴翻转过来来模拟翻页过程中页面内容的变化。 总之,在实现UGUI翻页动的过程中,Shader技术起到了至关重要的作用,通过合理的使用数学计算、材质属性和贴等技巧,可以制作出各种不同的翻页动效果,为UI界面增添更多的视觉效果和用户体验。 ### 回答3: ugui翻页动shader实质上是一种用于实现翻页动的渲染技术。这种技术能够让UI界面的元素在翻页时呈现出更加真实的效果,使得用户交互更加自然、流畅。该技术对于游戏或其他需要实现UI交互的应用程序都具有较高的实用性。 ugui翻页动shader通常是由基于OpenGL或DirectX API等底层形库实现的。它使用了像纹理映射、着色器等高级渲染技术,将翻页过程的各个阶段的纹理映射和着色组合起来,从而生成一种类似于真实书本翻页的效果。在使用过程中,ugui翻页动shader需要许多参数来进行自定义配置,比如翻页速度、翻页曲率、阴影、透明度、边缘变形等等,可以根据实际需求进行相关设置。 在实现ugui翻页动shader时,需要使用着色器编程语言进行编写,并且需要深入了解OpenGL或DirectX API的渲染原理。目前,许多专业3D制作软件都提供了ugui翻页动shader的可视化开发工具,使得非专业人员也可以用较少的时间和精力实现比较高质量的翻页效果。 总的来说,ugui翻页动shader技术的出现,不仅仅是UI界面效果的提升,更是对UI交互带来的革新和用户体验的提升。随着技术的不断发展,ugui翻页动shader也将不断完善和更新,为用户的交互体验提供更加细致、流畅的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值