unity几种画线(网格)方式使用

1、GL划线

这是调用低级别的图形库划线,效率较高,需要放在OnPostRender()函数,并将代码挂载到相机上,下面代码画了一个正方形

using System.Collections.Generic;
using UnityEngine;

public class GLSquare : MonoBehaviour
{
    //网格材质
    public Material LineMat;//随意指定一个材质就行
    //网格颜色
    public Color MeshColor;
    //网格线坐标存储
    List<Vector3[]> m_linePoints = new List<Vector3[]>();

    void Start()
    {
        initPoints();
        //修改网格材质颜色
        LineMat.SetColor("_Color", MeshColor);
    }

    //一个10*10的,单位大小为1网格
    void initPoints()
    {
        for(int i = -5; i <= 5; i++)
        {
            Vector3[] rows = new Vector3[2];
            rows[0] = new Vector3(-5, 0, i);
            rows[1] = new Vector3(5, 0, i);
            m_linePoints.Add(rows);
            Vector3[] clos = new Vector3[2];
            clos[0] = new Vector3(i, 0, 5);
            clos[1] = new Vector3(i, 0, -5);
            m_linePoints.Add(clos);
        }
    }

    /// <summary>
    /// 照相机完成场景渲染后调用
    /// </summary>
    void OnPostRender()
    {
        //线条材质
        LineMat.SetPass(0);
        GL.PushMatrix();
        //线条颜色,当前材质下,该方式修改颜色无效,详情可以看官方文档
        //GL.Color(MeshColor);
        //绘制线条
        GL.Begin(GL.LINES);

        //所有线条 (两点一条线)
        for (int i = 0; i < m_linePoints.Count; i++)
        {
            GL.Vertex(m_linePoints[i][0]);
            GL.Vertex(m_linePoints[i][1]);
        }
        GL.End();
        GL.PopMatrix();
    }
}

在这里插入图片描述

注意:代码必须挂载到相机上,而已画线只能在Game视图中显示,Scene视图不显示
具体GL参数详情,可查看官方GL相关文档

2、用Debug.DrawLine()来划线

在这里插入图片描述
比较简单,多用于调试,其中duration参数特别重要,控制线显示的时间,不设置,则存在一帧
利用上个实例中的点,划线核心代码为:

 void Start()
    {
        initPoints();
        //画网格
        for (int i = 0; i < m_linePoints.Count; i++)
        {
            //duration参数特别重要,控制线显示的时间,不设置,则存在一帧
            Debug.DrawLine(m_linePoints[i][0], m_linePoints[i][1], Color.green, 100, true);
        }
            
    }

这个代码随意挂载在哪个对象上都可
在这里插入图片描述
注意:显示在Scene视图,Game视图若开启了Gizmos,也能显示
具体Debug参数详情,可查看官方Debug相关文档

3、用Gizmos.DrawLine ()来划线

这种方式划线代码需要放在OnDrawGizmos 或 OnDrawGizmosSelected 函数中

 void OnDrawGizmos()
    {
        Gizmos.color = Color.blue;
        //画网格
        for (int i = 0; i < m_linePoints.Count; i++)
        {
            Gizmos.DrawLine(m_linePoints[i][0], m_linePoints[i][1]);
        }
    }

这个代码随意挂载在哪个对象上都可
在这里插入图片描述
注意:显示在Scene视图,Game视图若开启了Gizmos,也能显示
具体Gizmos参数详情,可查看官方Gizmos相关文档

4、用LineRenderer组件来划线

线渲染器用于在 3D 空间中绘制自由浮动的线,比较灵活,可以调节连接线的开始、截止宽度变化、颜色变化等,用在3d空间做连接线,运动轨迹等,但这个组件的线是一堆连续点的数组,顺序相连,类似于一笔画,其实不太适合用来画网格。
在这里插入图片描述
若要用它来画网格可以考虑如下思路:
请添加图片描述
请添加图片描述
类似这种一笔连画应该可以实现。这个组件主要还是用于画多样变化的线条比较好。
下面用LineRenderer实现运动轨迹代码(wasd键控制立方体运动,生成对应轨迹):
请添加图片描述
代码见上传项目。项目git连接
更多LineRenderer需要了解相关官方文档参数

备注:这篇lineRenderer动态划线好像不错,没具体看,记录下