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动态划线好像不错,没具体看,记录下