LineRenderer是Unity提供的一个用于划线的组件。
可以使用它在场景中绘制线段,一般可用于 绘制攻击范围、武器红外线、辅助线段等。
// 动态添加一个线段(创建一个包含LineRenderer的GameObject)
GameObject lineGameObject = new GameObject("LineObject");
LineRenderer lineRenderer = lineGameObject.AddComponent<LineRenderer>();
// 设置线段的名字
lineGameObject.name = "Line";
// 首尾相连(是否闭合线条)
lineRenderer.loop = true;
// 设置线段的起始和结束宽度
lineRenderer.startWidth = 0.1f; // 设置线条起点的宽度
lineRenderer.endWidth = 0.1f; // 设置线条结束点的宽度
// 设置线段的起始和结束颜色
lineRenderer.startColor = Color.red; // 设置线条起点的颜色
lineRenderer.endColor = Color.yellow; // 设置线条结束点的颜色
// 设置材质(LineRenderer需要材质才能正确渲染)
// 需要在Unity项目中创建一个材质,并将其Shader设置为Unlit/Color或Standard等
// 例如:创建一个名为 "LineMaterial" 的材质,并将其Shader设置为 "Sprites/Default"
// lineRenderer.material = new Material(Shader.Find("Sprites/Default"));
// 如果有现有材质,可以拖拽赋值或通过Resources.Load加载
// lineRenderer.material = Resources.Load("Materials/LineMaterial");
// 设置点(定义线条的形状,至少需要两个点)
// 设置线条的顶点数量
lineRenderer.positionCount = 2;
// 设置第一个点的位置
lineRenderer.SetPosition(0, new Vector3(0, 0, 0));
// 设置第二个点的位置
lineRenderer.SetPosition(1, new Vector3(5, 5, 0));
// 是否使用世界坐标系
// 如果为true,线条的顶点坐标是世界坐标;如果为false,则是相对于GameObject的本地坐标
lineRenderer.useWorldSpace = true;
// 决定了是否随对象移动而移动 (useWorldSpace为false时生效,即使用本地坐标)
// 如果useWorldSpace为false,LineRenderer的线条会跟随其所在的GameObject一起移动、旋转和缩放。
// 如果useWorldSpace为true,LineRenderer的线条位置是固定的世界坐标,不随GameObject的Transform变化。
参数作用详细解释:
Loop(循环):
Positions(位置):
Color(颜色):
Corner Vertices(拐角顶点):
End Cap Vertices(末端顶点):
Alignment(对齐):
View
表示始终面向摄像机,Transform Z
表示始终与线条Transform的Z轴对齐。Texture Mode(纹理模式):
Tile
(平铺)、Stretch
(拉伸)、Repeat Per Segment
(每段重复)、Repeat Per Length
(每长度重复)。Shadow Bias(阴影偏移):
Generate Lighting Data(生成光照数据):
Line Renderer
将为光照贴图生成数据。Use World Space(使用世界空间):
Line Renderer
所在的GameObject)。Materials(材质):
Line Renderer
使用的材质。材质决定了线条的外观(颜色、纹理、着色器等)。Lighting(光照):
Probes(探头):
这是一个探头相关的设置展开项。
Light Probes(光照探头):
Reflection Probes(反射探头):
Additional Settings(附加设置):
这是一个高级设置展开项。
Motion Vectors(运动矢量):
Dynamic Occlusion(动态遮挡):
Sorting Layer(排序层):
Order in Layer(层内顺序):
LineRenderer
画一个圆出来。LineRenderer
画出鼠标移动的轨迹。本解决方案通过 LineRenderer
组件来实现两种绘制功能:
LineRenderer
的位置点来绘制一个圆形。LineRenderer
,并在鼠标按住拖动时不断添加鼠标的世界坐标点到 LineRenderer
中,从而绘制出鼠标的移动轨迹。核心思想:
LineRenderer
组件:Unity中用于绘制线段或曲线的组件,通过设置一系列顶点来定义线的形状。using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lea40 : MonoBehaviour
{
// 用于绘制线条的LineRenderer组件
private LineRenderer lineRenderer;
// 用于存储当前鼠标的世界坐标
private Vector3 nowPos;
void Start()
{
// 在游戏开始时,调用DrawCircle方法绘制一个圆
// 中心点为当前GameObject的位置,半径为5,圆由360个点构成(形成一个近似的圆)
DrawCircle(this.transform.position, 5, 360);
}
void Update()
{
// 检测鼠标左键是否按下(只在按下的第一帧触发)
if(Input.GetMouseButtonDown(0))
{
// 创建一个新的GameObject来承载LineRenderer
GameObject g = new GameObject("MouseTrail");
// 为新创建的GameObject添加LineRenderer组件
lineRenderer = g.AddComponent<LineRenderer>();
// 设置LineRenderer不循环,即线条起点和终点不连接
lineRenderer.loop = false;
// 设置LineRenderer的起始点数量为0,准备开始绘制新轨迹
lineRenderer.positionCount = 0;
}
// 检测鼠标左键是否按住(每帧触发)
if(Input.GetMouseButton(0))
{
// 增加LineRenderer的点数量
lineRenderer.positionCount += 1;
// 获取当前鼠标在屏幕上的位置
nowPos = Input.mousePosition;
// 设置鼠标Z坐标,使其在摄像机前方10个单位,以便ScreenToWorldPoint正确转换
nowPos.z = 10;
// 将屏幕坐标转换为世界坐标,并将其设置为LineRenderer的最后一个点
lineRenderer.SetPosition(lineRenderer.positionCount - 1, Camera.main.ScreenToWorldPoint(nowPos));
}
}
///
/// 绘制一个圆。
///
/// 圆的中心点。
/// 圆的半径。
/// 构成圆的线段数量(点数量),值越大圆越平滑。
private void DrawCircle(Vector3 centerPos, float r, int num)
{
// 创建一个新的GameObject来承载LineRenderer
GameObject gameObject = new GameObject("Circle");
// 为新创建的GameObject添加LineRenderer组件
LineRenderer line = gameObject.AddComponent<LineRenderer>();
// 设置LineRenderer的点数量
line.positionCount = num;
// 设置LineRenderer循环,形成一个闭合的圆
line.loop = true;
// 计算每个点之间的角度间隔
// 这里原本的 num/360 应该是 360f / num,表示每个点的角度增量
// 如果num是360,anglePerPoint就是1度
float anglePerPoint = 360f / num;
// 遍历所有点,计算每个点在圆周上的位置
for(int i = 0; i < num; i++)
{
// 计算当前点的角度
float currentAngle = anglePerPoint * i;
// 使用四元数旋转一个初始向量(例如Vector3.forward),然后乘以半径并加上中心点
// 这样可以得到圆周上每个点在世界空间的位置
// Quaternion.AngleAxis(currentAngle, Vector3.up) 创建一个绕Y轴旋转的四元数
// Vector3.forward * r 得到半径为r,方向为Z轴正方向的向量
line.SetPosition(i, centerPos + Quaternion.AngleAxis(currentAngle, Vector3.up) * Vector3.forward * r);
}
}
}