Unity测量周长小工具

实现效果如下:
我们这里鼠标点击使用的是圆点的预制体,大家可以根据自己项目需求制作预制体

点击两个点可以测出两个点之间的距离,并计算总长度

实现代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;

public class DistanceTest : MonoBehaviour
{
    public Camera camera;
    static Material lineMaterial;
    public Text Count;
    public Text Length;
    bool IsStart = false;
    public void sta()
    {
        IsStart = true;
    }
    public void clo()
    {
        IsStart = false;
    }
    static void CreateLineMaterial()
    {
        if (!lineMaterial)
        {

            Shader shader = Shader.Find("Hidden/Internal-Colored");
            lineMaterial = new Material(shader);
            lineMaterial.hideFlags = HideFlags.HideAndDontSave;
            // Turn on alpha blending
            lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
            lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
            // Turn backface culling off
            lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off);
            // Turn off depth writes
            lineMaterial.SetInt("_ZWrite", 0);
        }
    }

    public void OnRenderObject()
    {
        CreateLineMaterial();
        lineMaterial.SetPass(0);
        GL.PushMatrix();
        GL.Begin(GL.LINES);
        for (int i = 0; i < lv.Count; i++)
        {
            GL.Vertex3(lv[i].x, lv[i].y, lv[i].z);
        }
        GL.End();
        GL.PopMatrix();

    }
    bool sb = false;
    //圆点的预制体
    public GameObject aim;
    //GL 绘制的顶点数组  顺序是  0->1  2->3 4->5    取法 0 1 3 5 7 9
    //参考UI界面
    public List<Vector3> lv;
    private List<GameObject> aims;
    public Vector3 V3;
    void Start()
    {
        lv = new List<Vector3>();
        aims = new List<GameObject>();
        V3 = Vector3.zero;
    }
    void Update()
    {
        if (IsStart)
        {
            if (Input.GetMouseButtonDown(0))
            {
                Vector3 point = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 4.0f);//获得鼠标点击点               
                point = camera.ScreenToWorldPoint(point);//从屏幕空间转换到世界空间
                                                         // point = Camera.main.ScreenToWorldPoint(point);//从屏幕空间转换到世界空间
                GameObject go = Instantiate(aim);//生成点位           
                go.transform.position = point;
                aims.Add(go);
                aims.Add(Instantiate(aim, new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.z), Quaternion.Euler(90, 0, 0)) as GameObject);
                if (lv.Count >= 2)
                {
                    lv.Add(lv[lv.Count - 1]);
                    lv.Add(point);
                }
                else
                {
                    lv.Add(point);
                }
            }
        }
    }
    void OnGUI()
    {
        // 利用gui 为了实时动态更新画线数据
        if (lv.Count >= 2)
        {
            float dis = 0;
            for (int i = 0; i < lv.Count - 1; i = i + 2)//除了第一个点和最后个点,其它点都是存了两遍
            {
                Vector3 s = new Vector3((lv[i].x + lv[i + 1].x) / 2, (lv[i].y + lv[i + 1].y) / 2, (lv[i].z + lv[i + 1].z) / 2);
                Vector3 a = camera.WorldToScreenPoint(s);
                //注意屏幕坐标系与GUI的ui坐标系y轴相反,ToString(".000")保留小数点后3位数,几个零几位数
                GUI.Label(new Rect(a.x, Screen.height - a.y, 100, 20), "<color=red>" + (Vector3.Distance(lv[i], lv[i + 1]) > 1 ? Vector3.Distance(lv[i], lv[i + 1]).ToString(".000") : 0 + Vector3.Distance(lv[i], lv[i + 1]).ToString(".000")) + "</color>");
                //GUI.Label(new Rect(a.x, Screen.height - a.y, 100, 20),  Vector3.Distance(lv[i], lv[i + 1]).ToString(".000")  + "<color=blue>" + "米" + "</color>");

            }
        }
        if (lv.Count >= 1)
        {
            //Debug.Log(lv + "lv");
            //GUI.Label(new Rect(15, 15, 120, 40), ComputePolygonLength(lv).ToString(".000"));
            Length.text = ComputePolygonLength(lv) > 1 ? ComputePolygonLength(lv).ToString(".000") : 0 + ComputePolygonLength(lv).ToString(".000");
            Count.text = (lv.Count < 2 ? 1 : (lv.Count / 2 + 1)).ToString();
        }
    }
    public void ClearLines()
    {

        for (int i = 0; i < aims.Count; i++)
        {
            GameObject.Destroy(aims[i]);
        }
        lv.Clear();
        aims.Clear();
        Length.text = "0.0";
        Count.text = "0";

    }

    double ComputePolygonLength(List<Vector3> points)
    {
        // Debug.Log((points.Count)/2 +1);       
        float s = 0;
        if ((points.Count + 2) < 2)
            return s;
        else
        {
            for (int i = 0; i < points.Count - 1; i++)
                s += Vector3.Distance(points[i], points[i + 1]);
        }
        return Mathf.Abs(s);
    }
}
//public class DistanceTest : MonoBehaviour
//{
//    Vector3 point;
//    public GameObject target;
//    private List<GameObject> targets;
//    void Start()
//    {
//    }

//    void Update()
//    {
//        if (Input.GetMouseButtonDown(0))
//        {
//            point = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 4.0f);//获得鼠标点击点
//            point = Camera.main.ScreenToWorldPoint(point);//从屏幕空间转换到世界空间
//            GameObject go = Instantiate(target);//生成点位           
//            go.transform.position = point;
//        }
//    }

//    public void Clear()
//    {


//        for (int i = 0; i < targets.Count; i++)
//        {
//            GameObject.Destroy(targets[i]);
//        }
//        targets.Clear();
//    }
//    double ComputePolygonLength(List<Vector3> points)
//    {
//        float s = 0;
//        int point_num = points.Count;
//        if (point_num < 1)
//            return s;
//        for (int i = 0; i < point_num; ++i)
//            s += Vector3.Distance(points[i], points[i+1]);
//        return Mathf.Abs(s);
//    }
//}
posted @ 2022-06-22 16:52  嘿,阿然  阅读(202)  评论(0编辑  收藏  举报