服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - UGUI绘制动态曲线

UGUI绘制动态曲线

2022-08-03 15:27Admin_Jhon C#

这篇文章主要为大家详细介绍了UGUI绘制动态曲线的具体方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了UGUI绘制动态曲线的具体代码,供大家参考,具体内容如下

前言

等有空再补详细说明,先上代码。看官自行阅读

代码

UICurveData 类,用于存放点数据的基础结构。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class UICurveData
{
 #region [Fields]
 public List<Vector2> Postion = new List<Vector2>();
 public Color Ccolor;
 public float Thickness = 1;
 #endregion
 
 #region [PublicTools]
 public void Addpos(float varX, float varY)
 {
  Addpos(new Vector2(varX, varY));
 }
 public void Addpos(Vector2 varV2)
 {
  Postion.Add(varV2);
 }
 #endregion
 
}

UICurve 负责构建顶点数据,mesh。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public class UICurve : MaskableGraphic
{
 #region [Fields]
 private Dictionary<int, UICurveData> mCurveData = new Dictionary<int, UICurveData>();
 #endregion
 
 #region [Inherit]
 protected override void OnPopulateMesh(VertexHelper varVerHeler)
 {
  varVerHeler.Clear();
 
  foreach (var tempKvp in mCurveData)
  {
   var tempUICurveData = tempKvp.Value;
   if (tempUICurveData.Postion.Count < 2)
   {
    continue;
   }
   for (int i = 1; i < tempUICurveData.Postion.Count; i++)
   {
    UIVertex[] verts = new UIVertex[4];
 
    float x1 = tempUICurveData.Postion[i - 1].x;
    float y1 = tempUICurveData.Postion[i - 1].y;
    float x2 = tempUICurveData.Postion[i].x;
    float y2 = tempUICurveData.Postion[i].y;
 
    float xd = (y2 - y1) / Mathf.Sqrt(Mathf.Pow(x2 - x1, 2) * Mathf.Pow(y2 - y1, 2)) * tempKvp.Value.Thickness / 2;
    float yd = (x2 - x1) / Mathf.Sqrt(Mathf.Pow(x2 - x1, 2) * Mathf.Pow(y2 - y1, 2)) * tempKvp.Value.Thickness / 2;
 
    int idx = 0;
    verts[idx].position = new Vector3(tempUICurveData.Postion[i - 1].x - xd, tempUICurveData.Postion[i - 1].y + yd);
    verts[idx].color = tempUICurveData.Ccolor;
    verts[idx].uv0 = Vector2.zero;
 
    idx++;
    verts[idx].position = new Vector3(tempUICurveData.Postion[i].x - xd, tempUICurveData.Postion[i].y + yd);
    verts[idx].color = tempUICurveData.Ccolor;
    verts[idx].uv0 = Vector2.zero;
 
    idx++;
    verts[idx].position = new Vector3(tempUICurveData.Postion[i].x + xd, tempUICurveData.Postion[i].y - yd);
    verts[idx].color = tempUICurveData.Ccolor;
    verts[idx].uv0 = Vector2.zero;
 
    idx++;
    verts[idx].position = new Vector3(tempUICurveData.Postion[i - 1].x + xd, tempUICurveData.Postion[i - 1].y - yd);
    verts[idx].color = tempUICurveData.Ccolor;
    verts[idx].uv0 = Vector2.zero;
 
    varVerHeler.AddUIVertexQuad(verts);
   }
  }
 
 }
 #endregion
 
 #region [PublicTools]
 public void AddCurveData(int varID, UICurveData varCurveData)
 {
  mCurveData.Add(varID, varCurveData);
  SetAllDirty();
 }
 public void Clear()
 {
  mCurveData.Clear();
  SetAllDirty();
 }
 public void RemovePointIDs(params int[] varRemovepoints)
 {
  List<int> tempL = new List<int>();
  tempL.AddRange(varRemovepoints);
  RemovePointIDs(tempL);
 }
 public void RemovePointIDs(List<int> varRemovePoints)
 {
  foreach (var i in varRemovePoints)
  {
   if (!mCurveData.ContainsKey(i)) continue;
   mCurveData.Remove(i);
  }
  SetAllDirty();
 }
 #endregion
}

测试使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TestCurve : MonoBehaviour
{
 void Start()
 {
  var tempCurve = this.gameObject.AddComponent<UICurve>();
  UICurveData tempcd = new UICurveData();
  tempcd.Ccolor = Color.yellow;
  tempcd.Thickness = 2;
  for (int i = 0; i < 360; i++)
  {
   tempcd.Addpos(i * 2,(float)Mathf.Cos(i));
  }
  tempCurve.AddCurveData(1,tempcd);
 }
}

将该脚本挂在 Canvas 上,运行会看到

UGUI绘制动态曲线

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/Admin_Jhon/article/details/79482349

延伸 · 阅读

精彩推荐
  • C#C#结束Excel进程的步骤教学

    C#结束Excel进程的步骤教学

    在本篇文章里小编给大家分享了关于C#结束Excel进程的步骤教学内容,有兴趣的朋友们学习下。...

    C#教程网10262022-03-08
  • C#C#控制台应用程序中输出彩色字体

    C#控制台应用程序中输出彩色字体

    这篇文章主要为大家详细介绍了C#控制台应用程序中输出彩色字体的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    雲霏霏8602022-01-06
  • C#解析C#中断言与异常的应用方式及异常处理的流程控制

    解析C#中断言与异常的应用方式及异常处理的流程控制

    这篇文章主要介绍了C#中断言与异常的应用方式及异常处理的流程控制,一般来说断言用于修正程序员自己的错误而异常用于应对程序运行过程中可能出现的...

    曹宗颖9932021-11-08
  • C#C#反射的入门之C#反射实例

    C#反射的入门之C#反射实例

    C#反射的入门学习首先要明白C#反射提供了封装程序集、模块和类型的对象等等。那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从...

    CSharp编程大全10302021-03-16
  • C#浅谈C# 类的继承

    浅谈C# 类的继承

    本文主要介绍了C# 类的继承相关知识。具有很好的参考价值,下面跟着小编一起来看下吧...

    liyongke7232021-12-20
  • C#C#如何给PDF文件添加水印

    C#如何给PDF文件添加水印

    这篇文章主要为大家详细介绍了C#如何给PDF文件添加水印的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一...

    Yesi7052021-12-07
  • C#C#中委托(Delegates)的使用方法详解

    C#中委托(Delegates)的使用方法详解

    这篇文章主要为大家详细介绍了C#中委托(Delegates)的使用方法,感兴趣的朋友可以参考一下...

    C#教程网8652021-11-25
  • C#C#创建SQLite控制台应用程序详解

    C#创建SQLite控制台应用程序详解

    这篇文章主要为大家详细介绍了C#创建SQLite控制台应用程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    cnc6062022-01-17