这篇文章主要为大家详细介绍了UGUI绘制动态曲线的具体方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了UGUI绘制动态曲线的具体代码,供大家参考,具体内容如下
前言
等有空再补详细说明,先上代码。看官自行阅读
代码
UICurveData 类,用于存放点数据的基础结构。
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。
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
}
测试使用
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绘制动态曲线
基础教程推荐
猜你喜欢
- C# windows语音识别与朗读实例 2023-04-27
- C#类和结构详解 2023-05-30
- winform把Office转成PDF文件 2023-06-14
- C# 调用WebService的方法 2023-03-09
- ZooKeeper的安装及部署教程 2023-01-22
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- 一个读写csv文件的C#类 2022-11-06
- C#控制台实现飞行棋小游戏 2023-04-22
- C# List实现行转列的通用方案 2022-11-02
- unity实现动态排行榜 2023-04-27