本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
基于UGUI的Unity画线工具
iamitnan · 3527浏览 · 发布于2019-10-14 +关注

基于UGUI的Unity画线工具

最近项目里需要做一个画线的小游戏,LineRenderer不是很好用,自己撸了一个小工具,效果如下

20191013183503553.gif


下面上代码

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using FMCShape;
    public class MyLineDrawer : Image
    {
        public List<Vector2> pointer = new List<Vector2>();
        public float radio = 30;
        private int headPointCount = 7;//头部顶点数量
        private Vector2 offset;
        protected override void Awake()
        {
            base.Awake();
            offset = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f);
        }
        protected override void OnPopulateMesh(VertexHelper toFill)
        {
            toFill.Clear();
            if (pointer.Count >= 2)
            {
                for (int i = 1; i < pointer.Count; i++)
                {
                    Draw(toFill, pointer[i - 1], pointer[i]);
                }
            }
        }
        public void AddPointer(Vector2 pointer)
        {
            this.pointer.Add(pointer);
            ReDraw();
        }
        public void ReDraw()
        {
            SetVerticesDirty();
        }
        void Draw(VertexHelper vh, Vector2 start, Vector2 end)
        {
            Vector2 to = end - start;
            Vector2 nor_to = to.normalized * radio + start;
            Vector2 up = MathHepler.RotateVector2(90, nor_to, start);
            Vector2 down = MathHepler.RotateVector2(-90, nor_to, start);
            Vector2 up_end = up + to;
            Vector2 down_end = down + to;
            //添加直线
            AddQuad(vh, up, down, up_end, down_end);
            List<Vector2> tempPointer = ListPool<Vector2>.Get();
            //添加左边头部
            float angel = 180 / (headPointCount + 1);
            tempPointer.Add(down);
            for (float i = -angel; i > -180; i -= angel)
            {
                tempPointer.Add(MathHepler.RotateVector2(i, down, start));
            }
            tempPointer.Add(up);
            for (int i = 1; i < tempPointer.Count; i++)
            {
                AddVert(vh, tempPointer[i - 1], tempPointer[i], start);
            }
            //添加右边头部
            tempPointer.Clear();
            tempPointer.Add(up_end);
            for (float i = -angel; i > -180; i -= angel)
            {
                tempPointer.Add(MathHepler.RotateVector2(i, up_end, end));
            }
            tempPointer.Add(down_end);
            for (int i = 1; i < tempPointer.Count; i++)
            {
                AddVert(vh, tempPointer[i - 1], tempPointer[i], end);
            }
            ListPool<Vector2>.Release(tempPointer);
        }
        void AddVert(VertexHelper vh, Vector2 pos1, Vector2 pos2, Vector2 pos3)
        {
            AddVert(vh, CreateEmptyVertex(pos1), CreateEmptyVertex(pos2), CreateEmptyVertex(pos3));
        }
        void AddVert(VertexHelper vh, UIVertex v1, UIVertex v2, UIVertex v3)
        {
            int index = vh.currentVertCount;
            vh.AddVert(v1);
            vh.AddVert(v2);
            vh.AddVert(v3);
            vh.AddTriangle(index, index + 1, index + 2);
        }
        void AddQuad(VertexHelper vh, Vector2 pos1, Vector2 pos2, Vector2 pos3, Vector2 pos4)
        {
            AddQuad(vh, CreateEmptyVertex(pos1), CreateEmptyVertex(pos2), CreateEmptyVertex(pos3), CreateEmptyVertex(pos4));
        }
        void AddQuad(VertexHelper vh, UIVertex v1, UIVertex v2, UIVertex v3, UIVertex v4)
        {
            int index = vh.currentVertCount;
            vh.AddVert(v1);
            vh.AddVert(v2);
            vh.AddVert(v3);
            vh.AddVert(v4);
            vh.AddTriangle(index, index + 1, index + 2);
            vh.AddTriangle(index + 2, index + 3, index + 1);
        }
        UIVertex CreateEmptyVertex(Vector2 pos)
        {
            UIVertex v = new UIVertex();
            v.position = pos;
           //需要修改颜色,在这里改就可以了
            v.color = color;
            v.uv0 = Vector2.zero;
            return v;
        }
}

使用时当做一个image就可以,代码如下

  public MyLineDrawer line;
    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            line.AddPointer(Input.mousePosition-new Vector3(540,960));
        }
    }


相关推荐

图形学基础 | 实现OBJ文件的载入

iamitnan · 1698浏览 · 2019-05-29 10:10:17
干货!麻将平胡算法

· 993浏览 · 2019-06-06 11:45:17
Java桌球小游戏

奔跑的男人 · 640浏览 · 2019-06-11 09:37:46
图形用户界面和游戏开发

qq2360248666 · 712浏览 · 2019-06-11 09:57:01
Three.js模型隐藏或显示

吴振华 · 560浏览 · 2019-06-14 10:18:27
Cocos工程命名规则整理(node部分)

吴振华 · 879浏览 · 2019-06-14 10:24:18
加载中

0评论

评论
分类专栏
小鸟云服务器
扫码进入手机网页