22.画线功能LineRenderer
22.1 知识点
LineRenderer画线渲染器组件是什么?
- LineRenderer 是Unity提供的一个用于画线的组件。
- 使用它我们可以在场景中绘制线段,一般可以用于:
- 绘制攻击范围
- 武器红外线
- 辅助功能
- 其它画线功能
LineRenderer画线渲染器组件参数
场景点编辑模式
编辑点和删除点
无编辑操作
Simplify Preview 简化预览
开启会显示一个明显的线段
Tolerance 宽容度
- 偏离值,越大,偏差越大
- 假如点分密集,宽容度越大,越只会画出粗略线段,一般设置为1就行
编辑点操作
Show Wireframe 显示线框
Subdivide Selected 细分选项
- 鼠标左键画框选择两个或多个相邻点时,该按钮启用,点击后会在相邻点之间插入一个新点,可以移动改变点的位置
添加点模式
Input 输入模式
- Mouse Position 鼠标位置:点击会在摄像机处创建点,一般不用
- Physics Raycast 基于物理射线:鼠标点击到能触发射线的位置,添加点,比如平面,UI等
LayerMask 选择哪些层可以检测射线
Min VertexDistance 最小顶点距离
- 拖动鼠标创建点时,会在超出该距离时创建一个点
Offset 偏移量
- 创建点的偏移值
Loop 循环
- 是否终点起始自动相连。
Positions 位置
- 默认以世界坐标系为基准,设置线段的点并连接。
- 可以在 Use World Space 是否使用世界坐标系修改是否以世界坐标系为基准。
- 设置开不开启 Loop 循环 就能选择是否收尾线段点相连。
Width 宽度
- 线段宽度曲线调整。
- 可以在宽度表里右键添加key,添加秘钥,修改划线宽度曲线。
Color 颜色
- 修改颜色变化,颜色也可以是渐变的,假如没有材质修改颜色不起作用。
Corner Vertices 角顶点
- 角顶点可以理解为把划线的角变成圆角。
- 此属性指示在一条线中绘制角时使用了多少额外的顶点。
- 增加此值,使线角看起来更圆。
End Cap Vertices 末端顶点
- 终端顶点也变成圆角。
Alignment 对其方式
- View:视点线段对着摄像机。
- Transform Z:线段面向其Z轴。
Texture Mode 纹理模式
- Stretch:拉伸,沿整条线映射纹理一次。
- Tile:瓷砖平铺,不停的重复纹理。
- Distribute Per Segment:分配执行。
- Repeat Per Segment:重复显示。
Shadow Bias 阴影偏移
Generate Lighting Data 生成光源数据
Use World Space 是否使用世界坐标系
- 勾选了,不管怎么改都是相对于世界坐标的线段点。
- 不勾选,就会是当前依附的游戏对象的相对坐标点,移动游戏对象也会移动划线。
Materials 划线使用的材质球
- 我们可以新建一个材质,使用默认shader,关联一张图片,拖拽到划线组件的材质球上。
- 注意:假如一些材质需要光源,要开Generate Lighting Data 生成光源数据,不然可能变黑显示不出来。
- 有了材质之后可以修改Texture Mode 纹理模式查看效果。
Lighting 光照影响
- Cast Shadows:投射阴影,是否开启阴影。
- Receive Shadows:接收阴影。
Probes 光照探针
- Light Probes:光探测器模式
- 不使用光探针
- 使用内插光探针
- 使用三维网格内插光探针
- 自定义从材质决定
- Reflection Probes:反射探测器模式
- 不使用反射探针
- 启用混合反射探针
- 启用混合反射探针并且和天空和混合
- 启用普通探针,重叠式不混合
Additional Settings 附加设置
- Motion Vectors:运动矢量
- 使用相机运动来跟踪运动
- 特定对象来跟踪运动
- 不跟踪
- Dynamic Occludee:动态遮挡剔除
- Sorting Layer:排序图层
- Order in Layer:此线段在排序图层中的顺序
LineRenderer画线渲染器代码控制
动态添加一个线段
GameObject line = new GameObject();
line.name = "Line";
LineRenderer lineRenderer = line.AddComponent<LineRenderer>();
loop变量 首尾相连
//将线的起点和终点位置连接在一起,以形成连续循环。
lineRenderer.loop = true;
startWidth和endWidth变量 开始结束宽
//设置线起点处的宽度。
//设置线终点处的宽度。
lineRenderer.startWidth = 0.02f;
lineRenderer.endWidth = 0.02f;
startColor和endColor变量 开始结束颜色
//设置线起点处的颜色。
//设置线终点处的颜色。
lineRenderer.startColor = Color.white;
lineRenderer.endColor = Color.red;
material变量 设置材质
//返回指定给渲染器的第一个实例化 Material。
material = Resources.Load<Material>("火焰材质");
lineRenderer.material = material;
positionCount变量 设置点个数
//设置 /获取顶点数。
//一定注意 设置点 要 先设置点的个数
lineRenderer.positionCount = 4;
SetPositions方法 设置点位置
//设置线中所有顶点的位置。
//接着就设置 对应每个点的位置
lineRenderer.SetPositions(new Vector3[] { new Vector3(0,0,0),new Vector3(0,0,5), new Vector3(5,0,5)});
//注意:假如positionCount设置的点的数量比SetPositions传入点具体值的数量多,多出的点默认就在(0,0,0)位置
lineRenderer.SetPosition(3, new Vector3(5, 0, 0));//设置好最后一个点
useWorldSpace变量 是否使用世界坐标系
//如果启用,则在世界空间中定义线。
//决定了 是否随对象移动而移动
lineRenderer.useWorldSpace = false;
generateLightingData变量 判断是否让线段受光影响
//配置线以生成法线和切线。借助此数据,场景光照可以通过法线贴图和 Unity 标准着色器或是您自己的定制着色器来影响线。
lineRenderer.generateLightingData = true;
22.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson22_画线功能LineRenderer : MonoBehaviour
{
private Material material;
void Start()
{
#region 知识点一 LineRenderer是什么
//LineRenderer是Unity提供的一个用于画线的组件
//使用它我们可以在场景中绘制线段
//一般可以用于
//1绘制攻击范围
//2武器红外线
//3辅助功能
//4其它画线功能
#endregion
#region 知识点二 LineRender参数相关
#endregion
#region 知识点三 LineRender代码相关
//动态添加一个线段
GameObject line = new GameObject();
line.name = "Line";
LineRenderer lineRenderer = line.AddComponent<LineRenderer>();
//loop变量 首尾相连
//将线的起点和终点位置连接在一起,以形成连续循环。
lineRenderer.loop = true;
//startWidth变量和endWidth变量 开始结束宽
//设置线起点处的宽度。
//设置线终点处的宽度。
lineRenderer.startWidth = 0.02f;
lineRenderer.endWidth = 0.02f;
//startColor和endColor变量 开始结束颜色
//设置线起点处的颜色。
//设置线终点处的颜色。
lineRenderer.startColor = Color.white;
lineRenderer.endColor = Color.red;
//material变量 设置材质
//返回指定给渲染器的第一个实例化 Material。
material = Resources.Load<Material>("火焰材质");
lineRenderer.material = material;
//设置点
//positionCount变量 设置点个数
//设置 / 获取顶点数。
//一定注意 设置点 要 先设置点的个数
lineRenderer.positionCount = 4;
//SetPositions方法 设置点位置
//设置线中所有顶点的位置。
//接着就设置 对应每个点的位置
lineRenderer.SetPositions(new Vector3[] { new Vector3(0,0,0),new Vector3(0,0,5), new Vector3(5,0,5)});
//注意:假如positionCount设置的点的数量比SetPositions传入点具体值的数量多,多出的点默认就在(0,0,0)位置
lineRenderer.SetPosition(3, new Vector3(5, 0, 0));//设置好最后一个点
//useWorldSpace变量 是否使用世界坐标系
//如果启用,则在世界空间中定义线。
//决定了 是否随对象移动而移动
lineRenderer.useWorldSpace = false;
//generateLightingData变量 判断是否让线段受光影响 会接受光数据 进行着色器计算
//配置线以生成法线和切线。借助此数据,场景光照可以通过法线贴图和 Unity 标准着色器或是您自己的定制着色器来影响线。
lineRenderer.generateLightingData = true;
#endregion
}
}
22.3 练习题
请写一个方法,传入一个中心点,传入一个半径,用 LineRenderer 画一个圆出来
添加画圆函数,需要传入圆心位置(centerPos),半径(r),点的数量(pointNum)
// 画圆函数,需要传入圆心位置(centerPos),半径(r),点的数量(pointNum)
public void DrawLineRenderer(Vector3 centerPos, float r, int pointNum)
{
// 动态创建一个游戏对象,并设置其名称为 "R"
GameObject obj = new GameObject();
obj.name = "R";
// 给该游戏对象添加 LineRenderer 组件
LineRenderer line = obj.AddComponent<LineRenderer>();
// 设置线段是否是闭合状态来避免首尾连接处有断裂
line.loop = true;
// 设置顶点数来确定每条线段的终点可以组成一个圆
line.positionCount = pointNum;
// 根据点的数量得到每个点之间的度数角度
float angle = 360f / pointNum;
// 遍历所有的顶点,计算每个顶点相对于圆心在平面上固定的偏移指向,并赋值形成圆环状
for (int i = 0; i < pointNum; i++)
{
// 知识点
// 1. 点加向量相当于平移点
// 2. 四元数 * 向量相当于在旋转向量
// 通过四元数进行旋转后,再进行位移操作
Vector3 pos = Quaternion.AngleAxis(angle * i, Vector3.up) * Vector3.forward * r + centerPos;
// Vector3.forward * r 代表方向向量乘半径,就是当前向量
// Quaternion.AngleAxis(angle * i, Vector3.up) 代表绕着 y 轴转,当前角转的度数是当前索引乘根据点的数量得到每个点之间的度数角度
// 设置当前索引的点
line.SetPosition(i, pos);
}
}
调用画圆函数
// 调用画圆函数
DrawLineRenderer(Vector3.zero, 5, 360);
请实现,在 Game 窗口长按鼠标用 LineRenderer 画出鼠标移动的轨迹
// 练习题二用来装 LineRenderer 的临时变量
private LineRenderer line2;
void Start()
{
#region 练习题二
// 在 Game 窗口长按鼠标用 LineRenderer 画出鼠标移动的轨迹
////假如没有添加鼠标左键被按下时的逻辑,那么每次只能接着上次画,会和上次画的末尾连接起来
//line2 = this.gameObject.AddComponent<LineRenderer>();
//line2.loop = false;
//line2.startWidth = 0.5f;
//line2.endWidth = 0.5f;
//line2.positionCount = 0;
#endregion
}
// 定义一个类成员变量 nowPos,记录当前鼠标指针所在的位置
private Vector3 nowPos;
// 在 Update 函数中,检测鼠标点击事件,实现从当前鼠标指针处开始划线的功能。
private void Update()
{
// 鼠标左键被按下时
if (Input.GetMouseButtonDown(0))
{
// 鼠标左键被按下时,创建新的游戏对象,并且新增为其 LineRenderer 组件
GameObject obj = new GameObject();
line2 = obj.AddComponent<LineRenderer>();
// 设置线段状态为非闭合状态,设置开始和结束的宽度为 0.5
line2.loop = false;
line2.startWidth = 0.5f;
line2.endWidth = 0.5f;
// 设置顶点数目为 0 表示该线段暂时为空
line2.positionCount = 0;
}
// 鼠标左键持续按压时
if (Input.GetMouseButton(0))
{
// 鼠标左键持续按压时,不断新增线段中增加顶点,记录每个顶点的世界坐标,直到松开鼠标键停止绘制。
line2.positionCount += 1;
// 如何得到鼠标转世界坐标的对应点
// 知识点
// 1. 如何得到鼠标位置
// Input.mousePosition
// 2. 怎么把鼠标转世界坐标
// 使用 Camera.main.ScreenToWorldPoint() 方法来将当前鼠标所在的屏幕像素坐标转换到和场景中对象相对应的世界坐标上。
nowPos = Input.mousePosition;
// 这个 z 是设置和摄像机的距离的,这样画出来的线一直和摄像机的距离是 10
nowPos.z = 10; // 将 Z 轴坐标设置为一个固定值,使得线段可以显示在屏幕上方
line2.SetPosition(line2.positionCount - 1, Camera.main.ScreenToWorldPoint(nowPos));
}
}
22.4 练习题代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson22_练习题 : MonoBehaviour
{
//练习题二用来装LineRenderer的临时变量
private LineRenderer line2;
void Start()
{
#region 练习题一
//请写一个方法,传入一个中心点,传入一个半径,用LineRender画一个圆出来
//调用画圆函数
DrawLineRenderer(Vector3.zero, 5, 15);
#endregion
#region 练习题二
//在Game窗口长按鼠标用LineRenderer画出鼠标移动的轨迹
////假如没有添加鼠标左键被按下时的逻辑 那么每次只能接着上次画 会和上次画的末尾连接起来
//line2 = this.gameObject.AddComponent<LineRenderer>();
//line2.loop = false;
//line2.startWidth = 0.5f;
//line2.endWidth = 0.5f;
//line2.positionCount = 0;
#endregion
}
// 定义一个类成员变量nowPos,记录当前鼠标指针所在的位置
private Vector3 nowPos;
// 在Update函数中,检测鼠标点击事件,实现从当前鼠标指针处开始划线的功能。
private void Update()
{
//鼠标左键被按下时
if (Input.GetMouseButtonDown(0))
{
// 鼠标左键被按下时,创建新的游戏对象,并且新增为其 LineRenderer 组件
GameObject obj = new GameObject();
line2 = obj.AddComponent<LineRenderer>();
// 设置线段状态为非闭合状态,设置开始和结束的宽度为 0.5
line2.loop = false;
line2.startWidth = 0.5f;
line2.endWidth = 0.5f;
// 设置顶点数目为 0 表示该线段暂时为空
line2.positionCount = 0;
}
//鼠标左键持续按压时
if (Input.GetMouseButton(0))
{
// 鼠标左键持续按压时,不断新增线段中增加顶点,记录每个顶点的世界坐标,直到松开鼠标键停止绘制。
line2.positionCount += 1;
//如何得到鼠标转世界坐标的 对应点
//知识点
//1.如何得到鼠标位置
//Input.mousePosition
//2.怎么把鼠标 转世界坐标
// 使用Camera.main.ScreenToWorldPoint()方法来将当前鼠标所在的屏幕像素坐标转换到和场景中对象相对应的世界坐标上。
nowPos = Input.mousePosition;
//这个z是设置和摄像机的距离的,这样画出来的线一直和摄像机的距离是10
nowPos.z = 10; // 将Z轴坐标设置为一个固定值,使得线段可以显示在屏幕上方
line2.SetPosition(line2.positionCount - 1, Camera.main.ScreenToWorldPoint(nowPos));
}
}
// 画圆函数,需要传入圆心位置(centerPos),半径(r),点的数量(pointNum)
public void DrawLineRenderer(Vector3 centerPos, float r, int pointNum)
{
// 动态创建一个游戏对象,并设置其名称为 "R"
GameObject obj = new GameObject();
obj.name = "R";
// 给该游戏对象添加 LineRender组件
LineRenderer line = obj.AddComponent<LineRenderer>();
// 设置线段是否是闭合状态来避免首尾连接处有断裂
line.loop = true;
// 设置顶点数来确定每条线段的终点可以组成一个圆
line.positionCount = pointNum;
// 根据点的数量得到每个点之间的度数角度
float angle = 360f / pointNum;
// 遍历所有的顶点,计算每个顶点相对于圆心在平面上固定的偏移指向,并赋值形成圆环状
for (int i = 0; i < pointNum; i++)
{
//知识点
//1.点加向量 相当于平移点
//2.四元数 * 向量 相当于在 旋转向量
// 通过四元数进行旋转后,再进行位移操作
Vector3 pos = Quaternion.AngleAxis(angle * i, Vector3.up) * Vector3.forward * r + centerPos;
//Vector3.forward* r 代表方向向量乘半径 就是当前向量
//Quaternion.AngleAxis(angle * i, Vector3.up) 代表绕着y轴转,当前角转的度数是当前索引*根据点的数量得到每个点之间的度数角度
//设置当前索引的点
line.SetPosition(i, pos);
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com