当前位置: 首页 > article >正文

Unity Line Renderer Component入门

Overview

Line Renderer 组件是 Unity 中用于绘制连续线段的工具。它通过在三维空间中的两个或两个以上的点的数组,并在每个点之间绘制一条直线。可以绘制从简单的直线到复杂的螺旋线等各种图形。

1. 连续性和独立线条

  • 连续性:Line Renderer 绘制的线条始终是连续的,即一条直线连接每两个相邻的点。

  • 独立线条:如果需要绘制多个完全分开的线段,应该使用多个 GameObject,每个 GameObject 配置一个独立的 Line Renderer。

  • 世界单位:Line Renderer 渲染的线条宽度不是以像素为单位,而是以世界单位为单位。这意味着线条的宽度会根据世界空间中的实际尺寸进行计算,而不是屏幕像素大小。

Getting started

这样会在三维空间创建一个默认的Line.

三种编辑模式

None,Edit Points和Create Points.顶部有两个开关,两个开关都没有选择的情况下是None,点击第一个就进入了Edit Points模式,再次点击则回到None,第二个同理代表Create Points模式.

None模式

  • Simplify(简化):

    • 点击 Simplify 按钮后,Line Renderer 会根据设置的 Tolerance 值,使用 Ramer-Douglas-Peucker 算法 来简化线条的点。这一算法会根据你设置的公差值,计算并删除不必要的点,从而减少 Line Renderer 中的点数。
    • 通过简化,你可以显著提高性能,尤其是在需要大量渲染线条的情况下,减少过多的点可以降低计算量。
  • Simplify Preview(简化预览):

    • 启用这个选项后,你可以在 Inspector 窗口中看到简化操作的预览效果。这意味着你可以实时查看简化后的线条效果,而不必实际执行简化操作。
  • Tolerance(公差):

    • Tolerance 控制简化过程中允许线条偏离原始线条的程度。换句话说,Tolerance 设置了简化过程中允许的最大误差。
    • 0 的值表示没有偏差,因此没有简化效果,线条保持原样。
    • 较高的正值表示允许更大的偏差,从而进行更多的简化。例如,如果你设置一个较高的值,简化后的线条会失去一些精度,但点的数量会显著减少。
    • 默认值是 1,表示有一定的简化,但仍会保持较为平滑的曲线。

    Edit Points模式

    当设置为 Edit Points 时,Unity 会在 Scene 视图中将 Line RendererPositions 数组 中的每个点表示为一个黄色球体。可以使用 移动工具 (Move tool) 来移动这些点,从而调整线条的形状。

    左键套索一个或者多个点

    • Show Wireframe(显示线框):

      • 启用此选项后,Unity 会在 Scene 视图中绘制一个线框,帮助你可视化线条的形状。这个线框将帮助你更清晰地查看并调整线条的构成。
    • Subdivide Selected(细分选中的点):

      • 当你选中两个或更多相邻的点时,Subdivide Selected 按钮会变得可用。点击此按钮后,Unity 会在选中的相邻点之间插入一个新点,从而细分这两个点之间的线段,使线条更加平滑。

    Create Points模式

    当设置为 Create Points 时,可以在 Scene 视图 中点击以将新点添加到 Line RendererPositions 数组 的末尾。通过鼠标点击或射线检测的方式来添加新的点,这让编辑变得更加直观和方便。

    • Input(输入方式):
      • 选择你希望使用的输入方式来创建点。
      • Mouse Position(鼠标位置):根据鼠标在 Scene 视图中的位置创建新点。
      • Physics Raycast(物理射线检测):根据射线投射在 Scene 中的碰撞位置来创建新点。Unity 会在射线碰撞的点上创建新点。
    • Layer Mask(层掩码):
      • 当输入方式设置为 Physics Raycast 时,你可以使用此属性来指定射线检测时所用的层。它帮助你过滤掉不需要的对象,仅创建射线与特定层上的物体碰撞时的点。
    • Min Vertex Distance(最小顶点距离):
      • 当你在 Scene 视图中拖动鼠标以创建点时,Line Renderer 会在鼠标拖动的距离超过此值时才创建一个新点。这样可以避免过于密集的点,使线条更简洁。
    • Offset(偏移):
      • 这个属性决定了创建点时的偏移量:
        • 如果输入方式设置为 Mouse Position,则偏移是相对于 Scene 摄像机的。
        • 如果输入方式设置为 Physics Raycast,则偏移是相对于射线的法线方向。

    Line settings

    1. Loop(闭环)
    • 启用此选项后,Line Renderer 会将线条的第一个点与最后一个点连接起来,形成一个闭合的环形线条。
    2. Positions(位置)
    • 一个 Vector3 数组,用于定义 Line Renderer 需要连接的点。每个点都会形成线条的一个顶点。
    3. Width(宽度)
    • 设置线条的宽度值和曲线值,以控制线条沿着其长度的宽度。

    横坐标对应线长,纵坐标对应宽度.

    4. Color(颜色)
    • 定义一个渐变来控制线条沿其长度的颜色变化。
      • Unity 会在每个顶点处从颜色渐变中采样,并在相邻的顶点之间进行线性插值。通过增加更多顶点,可以更精确地逼近复杂的颜色渐变效果。
    5. Corner Vertices(转角顶点)
    • 控制绘制转角时所使用的额外顶点数量。增加此值可以使线条的转角看起来更加圆滑。
    6. End Cap Vertices(端点顶点)
    • 控制绘制端点时所使用的额外顶点数量。增加此值可以使线条的端点看起来更加圆滑。
    7. Alignment(对齐方式)
    • 设置线条面朝的方向。
      • View:线条朝向摄像机。线条会始终朝向摄像机。也就是说,不管摄像机在哪里,线条的“前方”总是面向摄像机。这个设置通常用于确保线条始终面向玩家或视角的方向,常见于需要根据摄像机角度动态调整的场景中。
      • TransformZ:线条朝向其 Transform 组件的 Z 轴。线条会根据其 Transform 组件Z 轴 来确定朝向。这意味着线条会沿着 GameObjectZ 轴 绘制,不会随摄像机的移动而改变方向。这个设置适用于你希望线条保持固定方向,并且不受摄像机角度影响的场景。
    8. Texture Mode(纹理模式)
    • 控制纹理如何应用到线条上。
      • Stretch:将纹理一次性贴图到整个线条长度。
      • Tile:根据线条的世界单位长度重复纹理。可以通过 Material.SetTextureScale 来设置纹理的平铺频率。
      • DistributePerSegment:假设所有顶点均匀分布,纹理会被映射一次,覆盖整个线条的长度。
      • RepeatPerSegment:沿着线条重复纹理,每个线段重复一次。可以通过 Material.SetTextureScale 来调整纹理的平铺频率。
    9. Shadow Bias(阴影偏差)
    • 设置将阴影从光源偏移的量,以去除由于将体积近似为广告板几何体而导致的阴影伪影。
    10. Generate Lighting Data(生成光照数据)
    • 启用此选项后,Unity 会在构建线条几何体时包含法线和切线信息,从而使材质能够使用场景的光照。
    11. Use World Space(使用世界空间)
    • 如果启用,则将 Positions 数组中的点视为世界空间坐标。如果禁用,则点的位置相对于附加此组件的 GameObject 的Transform进行计算(即局部空间)。

    Materials

    组件使用的的全部材质列表

    Lighting

    阴影和全局光照相关的设置.

    Line Renderer 组件中的相关设置

    1. Cast Shadows(投射阴影)

      • 说明:该属性用于指定 Line Renderer 是否会在有适当光源时投射阴影。

      • 选项

        • On:该 Line Renderer 会投射阴影,只要有合适的光源照射。
        • Off:该 Line Renderer 不会投射阴影。
        • Two-sided:该 Line Renderer 会投射双面阴影,这意味着即使是单面物体(例如平面或四边形)也可以在光源位于其背后时投射阴影。
        • Shadows Only(仅阴影):启用此选项后,Line Renderer 仅投射阴影,而本身不会被渲染出来。

        注意:如果启用了 Baked Global Illumination(烘焙全局光照)或 Enlighten Realtime Global Illumination(Enlighten 实时全局光照),要支持双面阴影,材质必须支持 Double Sided Global Illumination(双面全局光照)。

    2. Receive Shadows(接收阴影)

      • 说明:该属性控制 Line Renderer 是否会接收投射到它上的阴影。只有在启用了 Baked Global IlluminationEnlighten Realtime Global Illumination 时,此设置才会生效。
      • 对应API:此属性对应于 Renderer.receiveShadows API。
    3. Contribute Global Illumination(贡献全局光照)

      • 说明:启用此属性后,Line Renderer 会参与全局光照计算(通常在光照烘焙时进行)。这使得它在 Baked Global IlluminationEnlighten Realtime Global Illumination 计算时考虑进来。
      • 对应API:启用此选项会在 GameObjectStatic Editor Flags 中启用 Contribute GI 标志,并与 StaticEditorFlags.ContributeGI API 对应。
    4. Receive Global Illumination(接收全局光照)

      • 说明:此属性决定 Line Renderer 是否会接收来自光照贴图或运行时光照探针的全局光照数据。只有启用了 Contribute Global Illumination 属性时,才可以编辑此选项。
      • 对应API:此属性与 MeshRenderer.receiveGI API 对应。

    其他的光照和阴影设置:

    • Lightmaps(光照贴图):控制是否使用光照贴图来接收全局光照。
    • Light Probes(光照探针):控制是否使用光照探针接收全局光照数据。
    • Prioritize Illumination(优先光照):启用此选项可以确保该渲染器始终参与 Enlighten 实时全局光照 计算,确保远距离发光物体的影响不会被排除。

    主要影响 Line Renderer 如何与场景中的光源、阴影、光照贴图、全局光照等互动。如果 Line Renderer 需要在光照环境中表现更为真实或者需要影响场景的光照计算,这些设置会非常有用。

    这是 Line Renderer 组件 中关于 光照探针 (Light Probes)反射探针 (Reflection Probes) 的设置部分。以下是这些设置的详细解释和翻译:

    Probes(探针)

    Light Probes(光照探针)

    此属性控制 Line Renderer 如何使用场景中的光照探针系统。光照探针可以提供环境中的光照信息,通常用于间接光照或实时光照数据。

    • Off(关闭)

      • 说明:禁用光照探针。Line Renderer 将不会使用任何插值的光照探针数据。
    • Blend Probes(混合光照探针)

      • 说明:启用插值光照探针(默认值)。Line Renderer 将使用一个插值后的光照探针来提供光照信息。
    • Use Proxy Volume(使用代理体积)

      • 说明:启用此选项时,Line Renderer 会使用一个3D网格形式的插值光照探针。它通过代理体积来决定光照的插值方式。
    • Custom Provided(自定义提供)

      • 说明:通过 MaterialPropertyBlock 从材质中提取光照探针的着色器统一值。这允许您自定义光照探针的行为。
    • Proxy Volume Override(代理体积覆盖)

      • 说明:设置一个其他 GameObject,该 GameObject 必须具有 Light Probe Proxy Volume 组件。启用此选项后,Line Renderer 将使用该代理体积组件中的光照探针数据。

      注意:此选项只有在 Light Probes 设置为 Use Proxy Volume 时才可见。

    Reflection Probes(反射探针)

    此属性控制 Line Renderer 如何接收来自反射探针的反射信息。反射探针通常用于提供场景中反射光的详细信息,适用于反射效果的渲染。

    • Off(关闭)
      • 说明:禁用反射探针。Unity 将使用默认的天空盒来处理反射,而不使用反射探针数据。
    • Blend Probes(混合反射探针)
      • 说明:启用反射探针,并且仅在多个反射探针之间进行混合。这在室内环境中尤其有用,在这种环境中,角色可能会在不同的光照条件之间切换。
    • Blend Probes and Skybox(混合反射探针和天空盒)
      • 说明:启用反射探针,并支持反射探针和默认天空盒之间的混合。这适用于室外环境,可以使得反射更加自然。
    • Simple(简单)
      • 说明:启用反射探针,但在两个重叠的反射体积之间没有混合。适用于简单的反射效果,不需要复杂的过渡。
    Anchor Override(锚点覆盖)
    • 说明:此设置指定 Unity 使用哪个 Transform 来确定在使用光照探针或反射探针时的插值位置。默认情况下,Unity 使用 Renderer 几何体的边界框中心来确定插值位置。

    • 对应 API:此属性对应于 Renderer.probeAnchor API。

    总结:

    这些设置控制 Line Renderer 如何与光照探针和反射探针互动,从而影响其光照和反射效果的渲染。根据场景的光照需求,可以启用或禁用这些探针功能,或选择不同的探针插值模式,以实现更精确的光照和反射表现。

    Additional Settings

    Motion Vectors(运动向量)
    • 说明:设置是否使用运动向量来跟踪 Renderer 每个像素在屏幕空间中的运动。这些运动信息可以用于应用后处理效果,如运动模糊。

    • 注意:并非所有平台都支持运动向量。可以查看 SystemInfo.supportsMotionVectors 来确认是否支持此功能。

    • 对应 API:此属性对应于 Renderer.motionVectorGenerationMode API。

      运动模式选项

      • Camera Motion Only(仅摄像机运动):仅跟踪摄像机的运动。
      • Per Object Motion(每个对象的运动):使用特定的通道来跟踪该 Renderer 的运动。
      • Force No Motion(强制不跟踪运动):不跟踪任何运动。
    Dynamic Occlusion(动态遮挡)
    • 说明:启用动态遮挡时,Unity 的遮挡剔除系统会在 Renderer 被静态遮挡物(如墙壁)阻挡时将其剔除,不进行渲染。
    • 默认:动态遮挡默认启用。
    • 应用场景:对于一些特殊效果,例如绘制角色的轮廓在墙后,可以禁用动态遮挡来确保该效果被正确渲染。
    Sorting Layer(排序层)
    • 说明:设置该 Renderer 所在的 Sorting Layer,用于确定渲染顺序。这个属性通常用于 2D 渲染系统,但在 3D 场景中也可通过设置不同的排序层来控制显示的先后顺序。
    Order in Layer(层级中的顺序)
    • 说明:设置该 RendererSorting Layer 中的渲染顺序。较大的值会覆盖较小值的渲染,适用于多个渲染对象之间的排序。

    总结:

    这些附加设置为 Line Renderer 提供了进一步的控制选项,主要用于调整渲染行为和效果。包括:

    • 运动向量 用于后处理效果,如运动模糊;
    • 动态遮挡 用于提高渲染性能,避免渲染被遮挡的物体;
    • 排序层层级中的顺序 用于控制渲染顺序,尤其在处理多个 2D 或 3D 渲染对象时非常有用。

    常用API

    1. 基本属性和方法

    • positionCount: 获取或设置 Line Renderer 中点的数量(即数组的大小)。

      lineRenderer.positionCount = 5;  // 设置 5 个点
      
    • SetPosition(int index, Vector3 position): 设置线条在指定索引处的点的位置。

      lineRenderer.SetPosition(0, new Vector3(0, 0, 0));  // 设置第一个点的位置
      
    • GetPosition(int index): 获取指定索引处的点的位置。

      Vector3 position = lineRenderer.GetPosition(0);  // 获取第一个点的位置
      
    • widthMultiplier: 控制线条的宽度比例。

      lineRenderer.widthMultiplier = 0.1f;  // 设置线条的宽度
      
    • startWidthendWidth: 控制线条起始和结束处的宽度。

      lineRenderer.startWidth = 0.1f;  // 起始宽度
      lineRenderer.endWidth = 0.1f;    // 结束宽度
      
    • startColorendColor: 控制线条的起始和结束颜色。

      lineRenderer.startColor = Color.red;  // 起始颜色
      lineRenderer.endColor = Color.green;  // 结束颜色
      
    • loop: 设置线条是否应该连接回起始点形成闭环。

      lineRenderer.loop = true;  // 设置为闭合
      

    2. 控制材质和纹理

    • material: 设置 Line Renderer 的材质。

      lineRenderer.material = new Material(Shader.Find("Sprites/Default"));
      
    • textureMode: 设置纹理的模式,控制纹理如何应用在整个线条上。

      lineRenderer.textureMode = LineTextureMode.Stretch;  // 拉伸纹理
      
    • alignment: 控制线条的朝向。

      lineRenderer.alignment = LineAlignment.Local;  // 根据对象的本地坐标轴
      

    3. 颜色和渐变

    • colorGradient: 使用渐变来控制线条颜色。
      Gradient gradient = new Gradient();
      gradient.SetKeys(
          new GradientColorKey[] { new GradientColorKey(Color.red, 0.0f), new GradientColorKey(Color.blue, 1.0f) },
          new GradientAlphaKey[] { new GradientAlphaKey(1.0f, 0.0f), new GradientAlphaKey(0.0f, 1.0f) }
      );
      lineRenderer.colorGradient = gradient;
      

    4. 控制线条的细节

    • numCornerVertices: 设置绘制线条角落时使用的额外点的数量,用于使角落更加圆滑。

      lineRenderer.numCornerVertices = 10;  // 设置角落平滑度
      
    • numCapVertices: 设置线条末端的点数,以创建圆形端点。

      lineRenderer.numCapVertices = 10;  // 设置端点的平滑度
      
    • generateLightingData: 启用后,生成用于照明计算的法线和切线。

      lineRenderer.generateLightingData = true;
      

    5. 动态更新

    • enabled: 启用或禁用 Line Renderer 的渲染功能。
      lineRenderer.enabled = true;  // 启用 Line Renderer
      lineRenderer.enabled = false; // 禁用 Line Renderer
      

    示例代码

    using UnityEngine;
    
    public class LineRendererExample : MonoBehaviour
    {
        public LineRenderer lineRenderer;
    
        void Start()
        {
            // 设置 Line Renderer 属性
            lineRenderer.positionCount = 4;  // 4个点
            lineRenderer.SetPosition(0, new Vector3(0, 0, 0));   // 第一个点
            lineRenderer.SetPosition(1, new Vector3(1, 0, 0));   // 第二个点
            lineRenderer.SetPosition(2, new Vector3(1, 1, 0));   // 第三个点
            lineRenderer.SetPosition(3, new Vector3(0, 1, 0));   // 第四个点
    
            lineRenderer.startWidth = 0.1f; // 起始宽度
            lineRenderer.endWidth = 0.1f;   // 结束宽度
    
            lineRenderer.startColor = Color.red; // 起始颜色
            lineRenderer.endColor = Color.green; // 结束颜色
    
            lineRenderer.loop = true; // 闭合线条
    
            // 设置渐变色
            Gradient gradient = new Gradient();
            gradient.SetKeys(
                new GradientColorKey[] { new GradientColorKey(Color.red, 0.0f), new GradientColorKey(Color.blue, 1.0f) },
                new GradientAlphaKey[] { new GradientAlphaKey(1.0f, 0.0f), new GradientAlphaKey(0.0f, 1.0f) }
            );
            lineRenderer.colorGradient = gradient;
        }
    }
    


    http://www.kler.cn/a/514831.html

    相关文章:

  • CentOS 7乱码问题如何解决?
  • Redis支持数据类型详解
  • elementUI Table组件实现表头吸顶效果
  • 如何实现亿级用户在线状态统计?
  • AI需要的基础数学知识
  • 卸载和安装Git小乌龟、git基本命令
  • IP所属地与上网地点:如何匹配?
  • 2024大模型双向突破:MoE架构创新与小模型崛起
  • [Dialog屏幕开发] 屏幕绘制(文本/输入框/按钮控件)
  • 【组件分享】商品列表组件-最佳实践
  • 【子矩阵——优先队列】
  • Leecode刷题C语言之从栈中取出K个硬币的最大面积和
  • node.js 07.npm下包慢的问题与nrm的使用
  • Java 设计模式一
  • 聚类OTU vs 降噪识别生物序列——谁将主宰扩增子领域未来
  • CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅
  • Markdown Viewer 浏览器, vscode
  • 如何为64位LabVIEW配置正确的驱动程序
  • 基于STM32F103驱动AD7606串行采集数据信号
  • C++之初识模版
  • 安卓APP如何适配不同的手机分辨率
  • 【动态规划】--- 斐波那契数模型
  • 短剧系统开发功能需求/APP开发/源码指南
  • 计算在不规则形状内不同结构的占比
  • winfrom项目,引用EPPlus.dll实现将DataTable 中的数据保存到Excel文件
  • 鸿蒙开发入门之Hello World