日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > C# > 正文

UGUI繪制多點連續的平滑曲線

2019-10-29 19:41:04
字體:
來源:轉載
供稿:網友

本文實例為大家分享了UGUI繪制平滑曲線的具體代碼,供大家參考,具體內容如下

繪制

實現自定義的MaskableGraphic掛載在UGUI的UI節點上

public class UGUIObjectRender : MaskableGraphic{  /**  * points 為需要穿過的點  * segments 為曲線細分度  * linewidth 為曲線粗細  */  protected override void OnPopulateMesh(VertexHelper vh)  {    vh.DrawBeziers(points,segments,linewidth);  }}

需要時用的工具類在后面

二次貝塞爾工具類

using UnityEngine;namespace ViVi.UIExtensions{/** * Created by vivi on 16/5/11. */  public class BezierUtils {    public float P0x;    public float P1x;    public float P2x;    public float P3x;    public float P0y;    public float P1y;    public float P2y;    public float P3y;    public BezierUtils(float p0x,float p0y,float p1x,float p1y,float p2x,float p2y,float p3x,float p3y) {      P0x = p0x;      P0y = p0y;      P1x = p1x;      P1y = p1y;      P2x = p2x;      P2y = p2y;      P3x = p3x;      P3y = p3y;    }    public BezierUtils(Vector2 p0,Vector2 p1,Vector2 p2,Vector2 p3) {      P0x = p0.x;      P0y = p0.y;      P1x = p1.x;      P1y = p1.y;      P2x = p2.x;      P2y = p2.y;      P3x = p3.x;      P3y = p3.y;    }    public float beze_x(float t){      float it = 1-t;      return it*it*it*P0x + 3*it*it*t*P1x + 3*it*t*t*P2x + t*t*t*P3x;    }    public float beze_y(float t){      float it = 1-t;      return it*it*it*P0y + 3*it*it*t*P1y + 3*it*t*t*P2y + t*t*t*P3y;    }    //-------------------------------------------------------------------------------------    public float beze_speed_x(float t)    {      float it = 1-t;      return -3*P0x*it*it + 3*P1x*it*it - 6*P1x*it*t + 6*P2x*it*t - 3*P2x*t*t + 3*P3x*t*t;    }    public float beze_speed_y(float t)    {      float it = 1-t;      return -3*P0y*it*it + 3*P1y*it*it - 6*P1y*it*t + 6*P2y*it*t - 3*P2y*t*t + 3*P3y*t*t;    }    private float beze_speed(float t)    {      float sx = beze_speed_x(t);      float sy = beze_speed_y(t);      return (float) Mathf.Sqrt(Mathf.Pow(sx,2)+Mathf.Pow(sy,2));    }    //-------------------------------------------------------------------------------------    private float beze_length(float t)    {      float LATESTCOUNT = 10000;      int steps = (int) Mathf.Ceil(LATESTCOUNT * t);      if (steps == 0)        return 0;      if (steps % 2 != 0)        steps++;      float halfSteps = steps * .5f;      float nSum = 0;      float n1Sum = 0;      float disStep = t / steps;      for (int i = 0; i < halfSteps; i++ ) {        n1Sum += beze_speed((2 * i + 1) * disStep);        nSum += beze_speed(2 * i * disStep);      }      return (beze_speed(0) + beze_speed(1) + 2 * n1Sum + 4 * nSum) * disStep / 3;    }    //-------------------------------------------------------------------------------------    private float beze_even(float t)    {      float len = t * beze_length(1);      float uc = 0;      do {        float ulen = beze_length(t);        float uspeed = beze_speed(t);        uc = t - (ulen - len) / uspeed;        if (Mathf.Abs(uc - t) < 0.0001)          break;        t = uc;      }while(true);      return uc;    }    private float totallength = -1;    public float getTotalLength(){      if(totallength<0)        totallength = beze_length(1);      return totallength;    }    public Vector2 getPosition(float t){      return new Vector2(beze_x(t),beze_y(t));    }  }}

UGUI 繪圖工具類

using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;namespace ViVi.UIExtensions{  public static class PolygonHelper  {    public static void AddUIVertexTriangles(this VertexHelper vh,UIVertex[] verts)    {      for (int i = 0; i < verts.Length; i += 3)      {        int currentVertCount = vh.currentVertCount;        for (int index = i; index < i+3; index++)        {          vh.AddVert(verts[index].position, verts[index].color, verts[index].uv0, verts[index].uv1, verts[index].normal, verts[index].tangent);        }        vh.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2);      }    }    public static void AddUIVertexTriangle(this VertexHelper vh,UIVertex[] verts)    {      int currentVertCount = vh.currentVertCount;      for (int index = 0; index < 3; ++index)        vh.AddVert(verts[index].position, verts[index].color, verts[index].uv0, verts[index].uv1, verts[index].normal, verts[index].tangent);      vh.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2);    }    private static void vertex(this List<UIVertex> vertices,float x, float y , Color color)    {      UIVertex v = UIVertex.simpleVert;      v.color = color;      v.position = new Vector2(x,y);      v.uv0 = Vector2.zero;    }    //畫圓形    public static void circle (this VertexHelper vh, Vector2 pos, float radius,Color color,bool filled = false) {      circle(vh,pos.x, pos.y, radius, Mathf.Max(1, (int)(6 * Mathf.Pow(radius,1/3f))),color,filled);    }    public static void circle (this VertexHelper vh, float x, float y, float radius,Color color,bool filled = false) {      circle(vh,x, y, radius, Mathf.Max(1, (int)(6 * Mathf.Pow(radius,1/3f))),color,filled);    }    public static void circle (this VertexHelper vh, float x, float y, float radius, int segments ,Color color,bool filled = false) {      if (segments > 0){        float angle = 2 * Mathf.PI / segments;        float cos = Mathf.Cos(angle);        float sin = Mathf.Sin(angle);        float cx = radius, cy = 0;        List<UIVertex> vs = new List<UIVertex>();        segments--;        for (int i = 0; i < segments; i++) {          vs.vertex(x, y, color);          vs.vertex(x + cx, y + cy, color);          float temp = cx;          cx = cos * cx - sin * cy;          cy = sin * temp + cos * cy;          vs.vertex(x + cx, y + cy, color);        }        vs.vertex(x, y, color);        vs.vertex(x + cx, y + cy, color);        cx = radius;        cy = 0;        vs.vertex(x + cx, y + cy, color);        vh.AddUIVertexTriangles(vs.ToArray());      }    }    public static void DrawBeziers(this VertexHelper vh,List<Vector2> points,float segment,float width)    {      List<BezierUtils> beziers = CreateBeziers(points);      if (beziers != null) {         for (int i = 0; i < beziers.Count; i++) {          BezierUtils bezier = beziers[i];          DrawBezier(vh ,bezier,segment,width);        }      }    }    public static Vector2 nor (this Vector2 vec) {      float len = vec.magnitude;      if (len != 0) {        vec.x /= len;        vec.y /= len;      }      return vec;    }    public static Vector2 rotate90 (this Vector2 vec, int dir) {      float x = vec.x;      if (dir >= 0) {        vec.x = -vec.y;        vec.y = x;      } else {        vec.x = vec.y;        vec.y = -x;      }      return vec;    }    public static Vector2 cpy (this Vector2 vec) {      return new Vector2(vec.x,vec.y);    }    private static void DrawBezier(VertexHelper vh,BezierUtils bezier,float segment,float width)    {      List<Vector2> lpos = new List<Vector2>();      List<Vector2> rpos = new List<Vector2>();      for (int i = 0; i <= segment; i++)      {        Vector2 bezierPos = new Vector2(bezier.beze_x((float)i/(float)segment),bezier.beze_y((float)i/(float)segment));        Vector2 bezierSpeed = new Vector2(bezier.beze_speed_x((float)i/(float)segment),bezier.beze_speed_y((float)i/(float)segment));        Vector2 offseta = bezierSpeed.normalized.rotate90(1) * (0.5f * width);        Vector2 offsetb = bezierSpeed.normalized.rotate90(-1) * (0.5f * width);        lpos.Add(bezierPos.cpy() + offseta);         rpos.Add(bezierPos.cpy() + offsetb);       }      for (int j = 0; j < segment; j++)      {        vh.AddUIVertexQuad(GetQuad(lpos[j], lpos[j+1], rpos[j+1], rpos[j]));      }    }    private static UIVertex[] GetQuad (params Vector2[] vertPos) {      UIVertex[] vs = new UIVertex[4];      Vector2[] uv = new Vector2[4];      uv[0] = new Vector2(0, 0);      uv[1] = new Vector2(0, 1);      uv[2] = new Vector2(1, 0);      uv[3] = new Vector2(1, 1);      for (int i = 0; i < 4; i++) {        UIVertex v = UIVertex.simpleVert;        v.color = Color.blue;        v.position = vertPos[i];        v.uv0 = uv[i];        vs[i] = v;      }      return vs;    }    private static List<BezierUtils> CreateBeziers(List<Vector2> points)    {      float scale = 0.6f;      List<BezierUtils> beziers = new List<BezierUtils>();      int originCount = points.Count - 1;      List<Vector2> midpoints = new List<Vector2>();      for (int i = 0; i < originCount; i++) {        midpoints.Add(new Vector2(          Mathf.Lerp(points[i].x,points[i+1].x,0.5f),          Mathf.Lerp(points[i].y,points[i+1].y,0.5f))        );      }      List<Vector2> ctrlPoints = new List<Vector2>();      float offsetx;      float offsety;      ctrlPoints.Add(new Vector2(        points[0].x,        points[0].y      ));      for (int i = 0; i < originCount - 1; i++) {        Vector2 orginPoint = points[i + 1];        offsetx = orginPoint.x - Mathf.Lerp(midpoints[i].x, midpoints[i + 1].x, 0.5f);        offsety = orginPoint.y - Mathf.Lerp(midpoints[i].y, midpoints[i + 1].y, 0.5f);        ctrlPoints.Add(new Vector2(          midpoints[i].x + offsetx,          midpoints[i].y + offsety        ));        ctrlPoints.Add(new Vector2(          midpoints[i+1].x + offsetx,          midpoints[i+1].y + offsety        ));        ctrlPoints[i * 2 + 1] = Vector2.Lerp(orginPoint, ctrlPoints[i * 2 + 1], scale);        ctrlPoints[i * 2 + 2] = Vector2.Lerp(orginPoint, ctrlPoints[i * 2 + 2], scale);       }      ctrlPoints.Add(new Vector2(        points[points.Count - 1].x,        points[points.Count - 1].y      ));      for (int i = 0; i < originCount; i++) {        BezierUtils bezier = getBezier(points[i], ctrlPoints[i * 2], ctrlPoints[i * 2 + 1],points[i + 1]);        beziers.Add(bezier);      }      return beziers;    }    public static BezierUtils getBezier(Vector2 p0,Vector2 p1 ,Vector2 p2,Vector2 p3){      return new BezierUtils( p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y);    }  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
色综合久久88色综合天天免费| 亚洲女同中文字幕| 日韩在线a电影| 91精品久久久久久久久久入口| 在线中文字幕网站| 不卡中文一二三区| 欧美中文字幕视频| 中文字幕在线精品| 一区视频在线播放| 日韩国产专区| 中文字幕在线导航| 日本不卡视频一区| 国产一级在线播放| 国产午夜在线观看| 97国产视频| 亚洲国产www| 精品视频国产| 日韩欧美不卡视频| 久草中文在线观看| 中文字幕一区不卡| 日韩精品视频在线播放| 亚洲第一精品在线| 日韩一级中文字幕| 欧美久久久久久蜜桃| 一区二区三区在线不卡| 视频一区视频二区中文| 欧美不卡123| 国产乱码在线| www中文字幕在线观看| 91精品国产91久久久久| 欧美久久久久久蜜桃| 亚洲综合在线电影| 欧美一级二级三级区| 91精品国产乱码久久蜜臀| 日韩欧美国产成人精品免费| 免费视频二区| 亚洲免费在线观看av| 一区在线免费| 视频一区三区| 日韩国产欧美| 91蜜桃婷婷狠狠久久综合9色| 91欧美日韩| 日韩久久精品成人| 亚洲伊人婷婷| 亚洲国内精品视频| 一级国产黄色片| 欧美一级搡bbbb搡bbbb| 欧美高清视频一区二区三区| 日韩国产一区三区| 激情久久99| 在线看av的网址| 久久精品国产91精品亚洲| 91精品视频国产| 日韩av一区二区在线观看| 91精品久久久久久久久| 深夜福利亚洲| 欧美日韩三级在线观看| 日韩亚洲一区在线| 国产成人一区二区精品非洲| 最近免费中文字幕在线第一页| 久久99蜜桃精品久久久久小说| 亚洲美女视频一区| 一区二区精品| 一区二区三区在线|网站| 欧美日韩在线不卡一区| 一区二区不卡久久精品| 91精品国产91久久久| 黄色一区二区视频| 一本久久a久久精品亚洲| 久久精品女人| 日韩www在线| 欧美日韩国产综合久久| 午夜精品一区二区三区视频免费看| 欧美日韩第一| 欧美日韩国产一区在线| 欧美亚洲天堂网| 欧美黄页在线免费观看| 一区三区二区视频| 亚洲视频 中文字幕| 国产日韩免费| 精品视频123区在线观看| 亚洲羞羞网站| 久久久精品欧美| 日韩视频在线一区二区三区| 国产丝袜在线播放| 91精品国产91久久久久青草| 丰满少妇一区| 日韩免费视频一区| 亚洲一区导航| 99色在线视频| 国产三级在线观看视频| 欧美日韩国产一区在线| 日韩国产一区三区| av免费看在线| 区日韩二区欧美三区| 在线视频你懂得一区| 久久久久久99精品| 亚洲一区在线观看网站| 精品福利一区二区三区| 国产小视频在线| 国产午夜精品视频免费不卡69堂 | 亚洲专区一区| 天天综合天天做| 日韩精品综合在线| 一区二区三区在线免费| www在线播放| 欧美日本精品在线| 国产福利在线看| 精品日韩视频在线观看| 欧美日韩国产综合视频在线观看中文| 97视频在线| 亚洲综合在线视频| 欧美日韩国产页| 日韩精品免费观看视频 | 国产在线日韩精品| 国产日韩在线视频| 亚洲大片精品永久免费| 精品不卡一区二区| 亚洲一区在线观看免费| 欧美大片在线观看一区| 青青久在线视频免费观看| 日韩三级高清在线| 91久久中文| 精品日本视频| 日韩av在线中文字幕| 亚洲三级中文字幕| 欧美高清视频一区二区三区| 日韩一级在线免费观看| 中文字幕精品www乱入免费视频| 欧美在线日韩在线| 日韩福利视频导航| 91精品在线观| 99色在线视频| 国产三级精品网站| 亚洲最新永久观看在线| 欧美日韩精品不卡| 久久夜色精品国产欧美乱极品| 国产亚洲人成a一在线v站| 日韩精品欧美在线| 日韩精品在线观看视频| 在线视频观看日韩| 亚洲第一中文字幕在线观看| 日韩中文字幕在线视频观看 | 国产日韩成人精品| 日韩在线精品| 日韩欧美中文字幕视频| 91精品国产91久久久久久不卡| 一区二区国产在线| 国产不卡在线观看视频| 在线视频不卡国产V| 国产欧美日韩在线观看| 国产丝袜一区| 亚洲一级影院| 欧美三级精品| 国产精品福利视频一区二区三区| 免费视频二区| 午夜影院在线观看欧美| 欧美久久久久久蜜桃| 99在线精品视频免费观看20| 中文网丁香综合网| 欧美亚洲另类制服自拍| 久久精品不卡| 最新中文字幕在线播放| 日韩精品视频免费在线观看| 中文天堂资源在线| 中文字幕亚洲国产| 日韩欧美中文在线| 亚洲一区中文| 麻豆一区二区99久久久久| 在线免费91| 成人久久在线| 欧美日韩国产成人| 欧美日韩国产综合久久| 国产欧美日韩精品在线观看| 国产v日产∨综合v精品视频| 在线日韩中文字幕| 国产午夜精品视频免费不卡69堂| 日韩欧美不卡视频| 欧美日韩午夜在线| 日本精品免费观看高清观看| 色妇色综合久久夜夜| 国自产拍在线网站网址视频| 国产黄色精品| 欧美乱大交xxxxx免费| 中文字幕在线观看亚洲| 在线日韩中文| 久久精品国产91精品亚洲| 国产三级视频网站| 国产视频97| 精品欧美不卡一区二区在线观看| 日韩精品在线免费播放| 国产裸舞福利在线视频合集| 中文字幕日韩视频| 欧美日韩国产亚洲一区| 日韩在线高清视频| 日韩在线观看a| 国产小视频免费在线网址| 日韩一级免费视频| 91精品国产乱码久久蜜臀| 成人禁用看黄a在线| av午夜在线| 日韩高清在线不卡| 久久精品蜜桃| 国产婷婷一区二区| 中文精品电影| 日韩久久久精品| 欧美中文字幕第一页| 日韩精品视频免费播放| 日韩中文字幕网| 日韩欧美三级视频| 二区中文字幕| 日韩欧美国产1| 精品在线网站观看| 亚洲免费专区| 欧美日韩高清一区二区不卡| 国产一级在线播放| 婷婷精品进入| 久久精品一二三| 欧美中文字幕视频在线观看| 91麻豆免费视频网站| 亚洲黄色片在线观看| 在线看av的网址| 久久99久久久欧美国产| 日韩区欧美区| 国产乱码在线观看| 欧美日韩视频网站| 91麻豆精品国产91久久久使用方法 | 国产成人精品网址| 欧美日韩国产区| 日韩国产一区| 国产高清精品二区| 国产在线精品国自产拍免费| 欧美在线视频一区二区| 欧美成人一区二区| 免费看ww视频网站入口| 国产伦精品免费视频| 日韩中文字幕二区| 日韩精品在线看| 亚洲综合在线小说| 色欧美日韩亚洲| 黄色在线资源| 日韩一级中文字幕| 日韩中文在线中文网三级| 欧美另类久久久品| 国产一级视频在线播放| wwwav在线播放| 欧美日韩一二三| 日韩视频在线免费看| 亚洲社区在线| 精品调教chinesegay| 一区二区三区在线播| www.狠狠干| 欧美日韩国产高清视频| 日韩字幕在线观看| 国产嫩草影院久久久久| 日韩欧美一卡二卡| 日韩国产亚洲欧美| 日韩欧美不卡| 欧美国产中文| 欧美日韩国产高清一区| 高清在线一区| 日韩欧美中文在线| 日韩中文字幕视频在线| 欧美大片在线观看一区| av免费观看国产| 国产成人综合精品| 日韩欧美综合视频| 欧美中日韩在线| 中文官网资源新版中文第二页在线观看 | 91精品国产免费久久综合| 中文字幕在线播放一区| 精品视频资源站| 日韩在线精品| 欧美国产亚洲一区| 日韩一二三四区| 日韩一级在线视频| 国产视频一区三区| 亚洲高清中文字幕| 欧美日韩在线观看一区| 婷婷久久综合九色国产成人| 精品日韩av| 中文在线日韩| 久久夜色精品国产欧美乱极品| 日韩欧美中文在线视频| 午夜国产福利在线观看| 日韩精品三级| 麻豆一区二区99久久久久| 久久精品免费看| 亚洲.国产.中文慕字在线| 日韩欧美一级在线| 欧美日韩中文字幕视频| 国产黄色片大全| 日韩精品视频在线免费观看| 国产传媒久久久| 日韩视频中文| 不卡在线视频| 欧美在线日韩在线| 91久久中文| 亚洲图片小说综合| 亚洲大片精品永久免费| 国产成人精品三级| 欧美日韩第一区日日骚| 国产日韩中文在线| 韩日中文字幕第一页| 日韩精品在线网站| 欧美激情一区二区在线| 欧美一级免费观看| 日本a口亚洲| 一级日韩一级欧美| www.91香蕉视频| 国产导航在线| 91精品xxx在线观看| 欧美日韩高清在线播放| 欧美 日韩 综合| 国产欧美日韩视频在线| 欧美日韩国产成人| 蜜桃精品在线| 亚洲制服丝袜一区| 美女免费视频一区| 中文字幕 亚洲一区| 日本中文字幕在线观看| 国产一级视频在线播放| 日韩精品在线观| 日韩视频在线观看一区| 欧美日韩国产页| 亚洲大片精品永久免费| 国产中文在线观看| 日韩中文字幕在线观看视频| 精品三级av| 亚洲一区在线观看网站| 日本精品专区| 国产黄色在线网站| 日韩欧美不卡在线| 中文字幕亚洲在| av午夜在线| 在线国产99| 国产免费电影网站入口| 中文字幕欧美日韩精品| 日本精品专区| 精品999在线| 欧美人妻一区二区三区| 欧美三级中文字幕在线观看| 亚洲丝袜一区| 欧美日韩中文| 亚洲第一视频网站| 日韩欧美中文第一页| 精品视频1区2区3区| 美女黄a一级视频| 国产日韩在线视频| 中文字幕 亚洲一区| 中文字幕2020第一页| 蜜桃精品在线| 欧美日韩精品在线| 日韩视频一区| 中文字幕国产视频| 美女黄a一级视频| 亚洲一区三区在线观看| 中文字幕精品视频| 国产福利一区在线观看| 在线看欧美日韩| 久久福利视频一区二区| 成人精品视频一区| 欧美激情一区二区在线| 欧美中文字幕视频| 1区2区在线| 国产伦精品免费视频| 日韩欧美中文字幕一区| 成人h视频在线观看| 欧美日韩国产三级| 精品国产欧美日韩不卡在线观看| 免费日韩精品中文字幕视频在线| av中文在线播放| 香蕉视频亚洲一级| 91久久久精品| 午夜高潮免费视频| 中文字幕在线日韩| 91精品国产91久久久久| 精品日韩欧美在线| 欧美三级一区二区三区| 日韩综合精品| 色国产在线视频| 99久久www免费| 国产香蕉精品视频| 99视频精品全国免费| 日韩欧美在线影院| 国产日韩精品在线观看| 欧美婷婷久久| 亚洲人成欧美中文字幕| 亚洲第一页中文字幕| 国产资源在线观看入口av| 91精品国产入口| 91www成人久久| 国产对白在线| 国产在线播放一区二区| 国精品产品一区| 亚洲一级二级| 欧美日韩国产黄色| 久久久另类综合| 91精品综合久久| 国内精品99|