LineRenderer画线

 

using UnityEngine;
using System.Collections;

public class Script1 : MonoBehaviour
{
    //LineRenderer  
    private LineRenderer lineRenderer;
    //定义一个Vector3,用来存储鼠标点击的位置  
    private Vector3 position;
    //用来索引端点  
    private int index = 0;
    //端点数  
    private int LengthOfLineRenderer = 0;



    void Start()
    {
        //添加LineRenderer组件  
        lineRenderer = gameObject.AddComponent<LineRenderer>();
        gameObject.GetComponent<LineRenderer>().SetPosition(0,new Vector3(0,0,0));
        gameObject.GetComponent<LineRenderer>().SetPosition(1,new Vector3(0,0,0));
        //设置材质  
        //lineRenderer.material = new Material(Shader.Find("Particles/Additive"));
        Material lineMat = new Material(Shader.Find("Legacy Shaders/Diffuse"));
        lineMat.SetColor("_Color", new Color(100/255f, 100 / 255f, 100 / 255f, 1));

        lineRenderer.material = lineMat;
        //设置颜色  
        lineRenderer.SetColors(Color.red, Color.yellow);
        //设置宽度  
        lineRenderer.SetWidth(0.05f, 0.05f);
    }

    void Update()
    {
        //鼠标左击  
        if (Input.GetMouseButtonDown(0))
        {
            //将鼠标点击的屏幕坐标转换为世界坐标,然后存储到position中  
         //   position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1.0f));
            position = RayDemo01.instance.nowVertex;


            //端点数+1  
            LengthOfLineRenderer++;
            //设置线段的端点数  
            lineRenderer.SetVertexCount(LengthOfLineRenderer);


          //  Debug.Log(LengthOfLineRenderer);

        }
        //连续绘制线段  
        while (index < LengthOfLineRenderer)
        {
          //  Debug.Log(index);
          //  Debug.Log(position);

 
                //两点确定一条直线,所以我们依次绘制点就可以形成线段了  
                lineRenderer.SetPosition(index, position);
                index++;
 

        }
    }

    void OnGUI()
    {
        GUILayout.Label("当前鼠标X轴位置:" + Input.mousePosition.x);
        GUILayout.Label("当前鼠标Y轴位置:" + Input.mousePosition.y);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RayDemo01 : MonoBehaviour {
    //顶点数组
    public List<Vector3> Vertexes;
    public List<Vector2> UVtexes;
    public Vector3 nowVertex;

    public static RayDemo01 instance;

    //网格过滤器
    private MeshFilter _meshFilter;
    //网格
    private Mesh _mesh;

    public int trianglesCount;

    public bool forward ;
    public bool backward;
    List<int> tempVertexList;
    public bool isAlreadyforward;
    public bool isAlreadybackward;

    void Start()
    {
        instance = this;
        mainCrma = Camera.main;
        Vertexes = new List<Vector3>();
        UVtexes = new List<Vector2>();
        tempVertexList = new List<int>();

    }
    private Camera mainCrma;
    private RaycastHit objhit;
    private Ray _ray;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            _ray = mainCrma.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标
            Debug.DrawLine(_ray.origin, objhit.point, Color.red, Mathf.Infinity);//显示一条射线,只有在scene视图中才能看到
            if (Physics.Raycast(_ray, out objhit, Mathf.Infinity, 1 << LayerMask.NameToLayer("floor")))
            {
                GameObject gameObj = objhit.collider.gameObject;
                Vertexes.Add(objhit.point);
                UVtexes.Add(new Vector2(objhit.point.x, objhit.point.z));
                nowVertex = objhit.point;

               // Debug.Log("Hit objname:" + gameObj.name +"   Hit objlayer:" + objhit.point +"   Hit objlayer:" + gameObj.layer);
                if (Vertexes.ToArray().Length - 2 >= 1)
                {
                    RefreshMesh();
                }
            }
        }

    }

    public void RefreshMesh()
    {
        GameObject obj = new GameObject("mesh");
        MeshFilter mf = obj.AddComponent<MeshFilter>();
        MeshRenderer mr = obj.AddComponent<MeshRenderer>();

        得到三角形的数量
        // trianglesCount = Vertexes.ToArray().Length - 2;
        //if (trianglesCount>=1)
        //{

        //  //  Debug.Log(trianglesCount);
        //    //三角形顶点ID数组
        //    int[] triangles = new int[trianglesCount * 3];

        //    Mesh _mesh = new Mesh();

        //    //绘制三角形
        //    _mesh.vertices = Vertexes.ToArray();

        //    //三角形顶点索引,确保按照顺时针方向设置三角形顶点
        //    for (int i = 0; i < trianglesCount; i++)
        //    {
        //        for (int j = 0; j < 3; ++j)
        //        {
        //            triangles[i * 3 + j] = j == 0 ? 0 : i + j;
        //        }
        //    }
        //    _mesh.uv = UVtexes.ToArray();
        //    _mesh.triangles = triangles;
        //    mf.mesh = _mesh;
        //}

        //得到三角形的数量
        trianglesCount = Vertexes.ToArray().Length - 2;
        if (trianglesCount >= 1)
        {

            //  Debug.Log(trianglesCount);
            //三角形顶点ID数组
            int[] triangles = new int[trianglesCount * 3];

            Mesh _mesh = new Mesh();

            //绘制三角形
            _mesh.vertices = Vertexes.ToArray();

            if (trianglesCount>=1)
            {
                
                Vector3 temp1 = Vertexes[Vertexes.ToArray().Length - 2] - Vertexes[0];
                Vector3 temp2 = Vertexes[Vertexes.ToArray().Length - 1] - Vertexes[0];
                float c = Vector3.Dot(temp1.normalized, temp2.normalized);
                float angle = Mathf.Acos(Vector3.Dot(temp1.normalized, temp2.normalized)) * Mathf.Rad2Deg;
                Vector3 cross = Vector3.Cross(temp1.normalized, temp2.normalized);
                float angle2 = Mathf.Asin(Vector3.Distance(Vector3.zero, cross)) * Mathf.Rad2Deg;
 
                if (cross.y > 0  )
                {
                    forward = true;
                    backward = false;
                }
                if (cross.y < 0)
                {
                    forward = false;
                    backward = true;
                }


                if (forward)
                {
                    if (!isAlreadybackward)
                    {
                        for (int i = 0; i < trianglesCount; i++)
                        {
                            for (int j = 0; j < 3; ++j)
                            {
                                triangles[i * 3 + j] = j == 0 ? 0 : i + j;
                            }
                        }
                    }
                    else
                    {
                         

                        int maxNum = Vertexes.ToArray().Length - 1;
                        int deltaValue = maxNum -tempVertexList.Count;
                        int deltaStart = maxNum - tempVertexList.Count - 1;
 

                        for (int i = 0; i < tempVertexList.Count; i++)
                        {
                            for (int j = 0; j < 3; ++j)
                            {
 
                                if (j<2)
                                {
                                    triangles[deltaValue + j + i] = deltaStart + j + i;
                                    
                                }
                                else
                                {
                                    triangles[deltaValue + j + i] = maxNum;

                                }
                                Debug.Log("point " + (deltaValue + j + i).ToString());

                                Debug.Log("value "+triangles[deltaValue + j + i]);

                            }
                        }

                        isAlreadybackward = false;
                    }

                }
 
                if (backward)
                {
                    tempVertexList.Add(Vertexes.ToArray().Length - 1);
                    isAlreadybackward = true;
 

                    int tempStart = Vertexes.ToArray().Length-1  - tempVertexList.Count;
 
                    foreach (var index in tempVertexList)
                    {
                        Debug.Log("aaaaa " + index);
                    }
 

                }


            }


            _mesh.uv = UVtexes.ToArray();
            _mesh.triangles = triangles;
            mf.mesh = _mesh;
        }


        obj.GetComponent<MeshRenderer>().material = Resources.Load<Material>("Material/CubeMat");

        //关闭渲染
        obj.GetComponent<MeshRenderer>().enabled = false;

        obj.AddComponent<DebugMeshInfo>();

    }


 


}

感觉写的还是有点问题的。。。很早之前的Demo翻出来看看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值