首页 > 编程 > C# > 正文

UGUI绘制动态曲线

2020-01-24 00:01:26
字体:
来源:转载
供稿:网友

本文实例为大家分享了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 上,运行会看到

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表