1、在Game窗口不开启Gizmos的情况下, Debug.DrawLine() 函数画线只是在Scene窗口显示,如果在 Start 函数中调用 Debug.DrawLine ,则需要指定显示的时间(单位是秒),否则会只显示一帧。如果在 Update 函数中调用 Debug.DrawLine() ,则无需指定显示的时间。
// 在Start 函数中调用时
void Start ()
{
// 需指定显示的时间
Debug.DrawLine(Vector3.zero, Vector3.up, Color.red, 10);
}
// 在Update 函数中调用时
private void Update()
{
// 无需指定显示的时间
Debug.DrawLine(Vector3.zero, Vector3.up, Color.red);
}
2、在Game窗口开启Gizmos的情况下(如下图), Debug.DrawLine() 函数画线在Scene 和 Game 窗口都会显示。
方法一:所有的线都是在脚本中通过代码来创建组件,并添加材质
【注:使用 该种方法来画线,在Unity中可以正常运行,但是编译发布后,在其它平台上运行的时候线条却出现问题,线显示为一个整体平面。经过排查问题出现在材质上,由于都是在代码中创建的材质,因而打包发布后,无法找到对应的材质。此时,解决办法是注释掉 Shader.Find("Particles/Additive") 所在的这行代码。其结果是只能显示默认的红色,无法修改其颜色】
1、在场景中由给定的几个点来进行画线时,在场景中创建一个空物体,并将如下的脚本挂载在该空物体上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DrawLine : MonoBehaviour
{
private LineRenderer line;
Vector3[] pos = new Vector3[4];
private float startTime;
private float curTime;
void Start () {
// 线段上三个点的位置
pos[0] = new Vector3(0, 0, 1);
pos[1] = new Vector3(0, 1, 0);
pos[2] = new Vector3(1, 0, 0);
pos[3] = new Vector3(2, 1, 1);
// 为当前物体添加 LineRenderer 组件。
line = gameObject.AddComponent();
// 设置材料的属性
line.material = new Material(Shader.Find("Particles/Additive"));
line.positionCount = 4; // 设置该线段由几个点组成
// 设置线段的起点颜色和终点颜色
line.startColor = Color.blue;
line.endColor = Color.red;
// 设置线段起点宽度和终点宽度
line.startWidth = 0.009f;
line.endWidth = 0.009f;
line.SetPosition(0, pos[0]);
line.SetPosition(1, pos[1]);
line.SetPosition(2, pos[2]);
line.SetPosition(3, pos[3]);
startTime = Time.time;
}
private void Update()
{
// 设置所画的线按指定的时间间隔闪烁
curTime = Time.time;
if (curTime - startTime > 0.1)
{
line.enabled = false;
startTime = curTime;
}
else
{
line.enabled = true;
}
}
}
结果如下图所示
2、对于在物体中绘制线段,并且要能看见,即线段覆盖物体的一部分。此时可以使用多个相机,将挂载画线的物体单独用一个相机来显示,并将该相机的深度设置为最高。
【注意】:一个物体上挂载的 LineRenderer 一次只能画一条线,画线的方式是将该线上的所有点串联起来,所以不能画多条线,如下图所示的带分叉的线,一个空物体上挂载的 LineRenderer 将无法完成。
3、用 LineRenderer 画多条线
(1)、首先在Unity中新建 Line 的空物体,该物体用来挂载画线的脚本。再在该空物体下创建两个空物体 Line0、Line1 作为其子物体,用来画两条线。
(2)、画第一条线的代码及结果如下
using UnityEngine;
public class DrawLine : MonoBehaviour
{
private LineRenderer[] line = new LineRenderer[2];
Vector3[] pos = new Vector3[4];
void Start () {
//四个球体的位置
pos[0] = new Vector3(0, 0, 1);
pos[1] = new Vector3(0, 1, 0);
pos[2] = new Vector3(1, 0, 0);
pos[3] = new Vector3(2, 1, 1);
//***************** 画第一条线段 *******************************
line[0] = GameObject.Find("Line/Line0").AddComponent();
line[0].material = new Material(Shader.Find("Particles/Additive"));
line[0].positionCount = 3;
line[0].startColor = Color.blue;
line[0].endColor = Color.red;
line[0].startWidth = 0.006f;
line[0].endWidth = 0.006f;
line[0].SetPosition(0, pos[3]);
line[0].SetPosition(1, pos[2]);
line[0].SetPosition(2, pos[1]);
}
}
(2)、画第二条线的代码及结果
using UnityEngine;
public class DrawLine : MonoBehaviour
{
private LineRenderer[] line = new LineRenderer[2];
Vector3[] pos = new Vector3[4];
void Start () {
//四个球体的位置
pos[0] = new Vector3(0, 0, 1);
pos[1] = new Vector3(0, 1, 0);
pos[2] = new Vector3(1, 0, 0);
pos[3] = new Vector3(2, 1, 1);
//*************** 画第二条线段 *********************************
line[1] = GameObject.Find("Line/Line1").AddComponent();
line[1].material=new Material(Shader.Find("Particles/Additive"));
line[1].positionCount = 2;
line[1].startColor = Color.blue;
line[1].endColor = Color.red;
line[1].startWidth = 0.006f;
line[1].endWidth = 0.006f;
line[1].SetPosition(0, pos[2]);
line[1].SetPosition(1, pos[0]);
}
}
(3)、同时画两条线的代码及结果
using UnityEngine;
public class DrawLine : MonoBehaviour
{
private LineRenderer[] line = new LineRenderer[2];
Vector3[] pos = new Vector3[4];
void Start () {
//四个球体的位置
pos[0] = new Vector3(0, 0, 1);
pos[1] = new Vector3(0, 1, 0);
pos[2] = new Vector3(1, 0, 0);
pos[3] = new Vector3(2, 1, 1);
//***************** 画第一条线段 *******************************
line[0] = GameObject.Find("Line/Line0").AddComponent();
line[0].material = new Material(Shader.Find("Particles/Additive"));
line[0].positionCount = 3;
line[0].startColor = Color.blue;
line[0].endColor = Color.red;
line[0].startWidth = 0.006f;
line[0].endWidth = 0.006f;
line[0].SetPosition(0, pos[3]);
line[0].SetPosition(1, pos[2]);
line[0].SetPosition(2, pos[1]);
//*************** 画第二条线段 *********************************
line[1] = GameObject.Find("Line/Line1").AddComponent();
line[1].material=new Material(Shader.Find("Particles/Additive"));
line[1].positionCount = 2;
line[1].startColor = Color.blue;
line[1].endColor = Color.red;
line[1].startWidth = 0.006f;
line[1].endWidth = 0.006f;
line[1].SetPosition(0, pos[2]);
line[1].SetPosition(1, pos[0]);
}
}
***********************************************************************************************************
方法二:在Unity中的空物体上添加对应的 LineRenderer 组件(只要添加一个即可,其它的可以在代码中添加),并设置好材质。
注,此种方式可以解决上面的问题,是最好的解决方式。它可以在代码中设置自己想要的颜色和宽度而不受影响。
1、首先创建一个空物体为 Line0 ,并在其上添加 LineRenderer 组件。再创建一个材质,将其Shader 修改为如下图所示
2、再将提前准备好的虚线贴图(已经去除了背景),添加到 Particle Texture ,如下图
3、再将准备好的材质,放到 LineRenderer 组件的材质选项上,即可来画虚线。
参考资料:
[1] Unity 通过LineRenderer绘制两点之间的直线
[2] Unity3D研究院之游戏对象的访问绘制线与绘制面详解(十七)