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 Renderer 的 Positions 数组 中的每个点表示为一个黄色球体。可以使用 移动工具 (Move tool) 来移动这些点,从而调整线条的形状。
左键套索一个或者多个点
-
Show Wireframe(显示线框):
- 启用此选项后,Unity 会在 Scene 视图中绘制一个线框,帮助你可视化线条的形状。这个线框将帮助你更清晰地查看并调整线条的构成。
-
Subdivide Selected(细分选中的点):
- 当你选中两个或更多相邻的点时,Subdivide Selected 按钮会变得可用。点击此按钮后,Unity 会在选中的相邻点之间插入一个新点,从而细分这两个点之间的线段,使线条更加平滑。
Create Points模式
当设置为 Create Points 时,可以在 Scene 视图 中点击以将新点添加到 Line Renderer 的 Positions 数组 的末尾。通过鼠标点击或射线检测的方式来添加新的点,这让编辑变得更加直观和方便。
- 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 轴 来确定朝向。这意味着线条会沿着 GameObject 的 Z 轴 绘制,不会随摄像机的移动而改变方向。这个设置适用于你希望线条保持固定方向,并且不受摄像机角度影响的场景。
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 组件中的相关设置
-
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(双面全局光照)。
-
-
Receive Shadows(接收阴影)
- 说明:该属性控制 Line Renderer 是否会接收投射到它上的阴影。只有在启用了 Baked Global Illumination 或 Enlighten Realtime Global Illumination 时,此设置才会生效。
- 对应API:此属性对应于
Renderer.receiveShadows
API。
-
Contribute Global Illumination(贡献全局光照)
- 说明:启用此属性后,Line Renderer 会参与全局光照计算(通常在光照烘焙时进行)。这使得它在 Baked Global Illumination 或 Enlighten Realtime Global Illumination 计算时考虑进来。
- 对应API:启用此选项会在 GameObject 的 Static Editor Flags 中启用 Contribute GI 标志,并与
StaticEditorFlags.ContributeGI
API 对应。
-
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(层级中的顺序)
- 说明:设置该 Renderer 在 Sorting 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; // 设置线条的宽度
-
startWidth 和 endWidth: 控制线条起始和结束处的宽度。
lineRenderer.startWidth = 0.1f; // 起始宽度 lineRenderer.endWidth = 0.1f; // 结束宽度
-
startColor 和 endColor: 控制线条的起始和结束颜色。
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;}
}