本文共 6057 字,大约阅读时间需要 20 分钟。
1、在Game窗口不开启Gizmos的情况下, Debug.DrawLine() 函数画线只是在Scene窗口显示,如果在 Start 函数中调用 ,则需要指定显示的时间(单位是秒),否则会只显示一帧。如果在 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]
[2]
转载地址:http://zsegf.baihongyu.com/