Unity中在Game窗口画线

在Unity中画线有几种方式:

  • Debug.DrawLine()  函数画线,在Game窗口不开启 Gizmos 时,只在Scene窗口显示,多用于调试。
  • 通过  LineRenderer  来画线,在 SceneGame 窗口中都进行显示。
  • 使用 Gizmos.DrawLine 来画线,只是在Scene窗口显示

一、使用 Debug.DrawLine()  画线

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中在Game窗口画线_第1张图片  


二、使用 LineRenderer 来在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;
        }
        
    }
	
}

结果如下图所示

  Unity中在Game窗口画线_第2张图片

2、对于在物体中绘制线段,并且要能看见,即线段覆盖物体的一部分。此时可以使用多个相机,将挂载画线的物体单独用一个相机来显示,并将该相机的深度设置为最高。

【注意】:一个物体上挂载的 LineRenderer 一次只能画一条线,画线的方式是将该线上的所有点串联起来,所以不能画多条线,如下图所示的带分叉的线,一个空物体上挂载的 LineRenderer 将无法完成。

  Unity中在Game窗口画线_第3张图片

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]);
    }
}

Unity中在Game窗口画线_第4张图片

(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]);
        
    }
}

    Unity中在Game窗口画线_第5张图片

(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中在Game窗口画线_第6张图片

                 ***********************************************************************************************************

方法二:在Unity中的空物体上添加对应的 LineRenderer 组件(只要添加一个即可,其它的可以在代码中添加),并设置好材质。

注,此种方式可以解决上面的问题,是最好的解决方式。它可以在代码中设置自己想要的颜色和宽度而不受影响。


三、LineRenderer 绘制虚线

1、首先创建一个空物体为 Line0 ,并在其上添加  LineRenderer 组件。再创建一个材质,将其Shader 修改为如下图所示

     Unity中在Game窗口画线_第7张图片

2、再将提前准备好的虚线贴图(已经去除了背景),添加到 Particle Texture ,如下图

    Unity中在Game窗口画线_第8张图片

   3、再将准备好的材质,放到   LineRenderer 组件的材质选项上,即可来画虚线。


参考资料:

[1]  Unity 通过LineRenderer绘制两点之间的直线

[2]  Unity3D研究院之游戏对象的访问绘制线与绘制面详解(十七)

 

 

你可能感兴趣的:(Unity)