博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity中在Game窗口画线
阅读量:2145 次
发布时间:2019-04-30

本文共 6057 字,大约阅读时间需要 20 分钟。

在Unity中画线有几种方式:

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

一、使用 Debug.DrawLine()  画线

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 窗口都会显示。

          


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

结果如下图所示

  

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 组件(只要添加一个即可,其它的可以在代码中添加),并设置好材质。

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


三、LineRenderer 绘制虚线

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

     

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

    

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


参考资料:

[1]  

[2]  

 

 

转载地址:http://zsegf.baihongyu.com/

你可能感兴趣的文章
行为型模式之模板方法模式(TemplateMethod)
查看>>
行为型模式之访问者模式(Visitor)
查看>>
大小端详解
查看>>
source insight使用方法简介
查看>>
<stdarg.h>头文件的使用
查看>>
C++/C 宏定义(define)中# ## 的含义 宏拼接
查看>>
Git安装配置
查看>>
linux中fork()函数详解
查看>>
C语言字符、字符串操作偏僻函数总结
查看>>
Git的Patch功能
查看>>
分析C语言的声明
查看>>
TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>