1、LineRenderer
LineRenderer是Unity提供的一个用于画线的组件,使用它可以在场景中绘制线段,一般可以用于
- 绘制攻击范围
- 武器红外线
- 辅助功能
- 其他画线功能
一个物体只能绑定一个LineRenderer组件
2、LineRenderer参数相关
Loop | 是否起点起始始终相连 | ||
Positions | 线段的点坐标(一般是世界坐标系,通过Use World Space调整),通过增加点的数量与代码控制可以画圆 & 线段宽度调整(并非点与点的宽度调整,而是从开始到结尾) |
||
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 | 线使用的材质球 | ||
Lighting | 关照影响 |
Cast Shodows:是否开启阴影 |
|
Receive Shadows:接收 | |||
Probes | 光照探针 | Light Probes:光探测器模式
|
|
Reflection Probes:反射探测器模式 和Use Probes几乎一样,除了两个:
|
|||
Additional Settings |
附加设置 |
Motion Vectors:运动矢量
|
|
Dynamic Occlude:动态遮挡剔除 |
|||
Sorting Layer:排序图册 | |||
Order in Layer:线段在排序图层中的顺序 |
3、LineRenderer代码相关
// 动态添加一个线段
GameObject line = new GameObject();
line.name = "Line";
LineRenderer lineRenderer = line.AddComponent<LineRenderer>();
// 首位相连
lineRenderer.loop = true;
// 开始结束的宽
lineRenderer.startWidth = 0.03f;
lineRenderer.endWidth = 0.02f;
// 开始结束的颜色
lineRenderer.startColor = Color.white;
lineRenderer.endColor = Color.red;
// 设置材质
lineRenderer.material = Resources.Load<Material>("material");
// 设置点,一定要设置点的个数,然后设置点的位置
// 同时设定了点的数量后,如果少于已有点的数量,会将多余的点删掉
lineRenderer.positionCount = 4;
// 通过数组批量设置
lineRenderer.SetPositions(new Vector3[] {new Vector3(0, 0, 0),
new Vector3(0, 0, 5),
new Vector3(5, 0, 5)};
// 注意,如果设置的点的数量与插入点位置的数量不一致,那么最后会补齐一个坐标为(0,0,0)的点
// 通过索引设定第(index+1)个点的坐标
lineRenderer.SetPostion(3, new Vector3(5, 0, 0));
// 是否使用世界坐标系,决定了是否随对象而移动
lineRenderer.useWorldSpace = false;
// 让线段会受光的影响,进行着色器计算
lineRenderer.generateLightingData = true
-
如果要画一个圆:
public void DrawCircle(Vector3 centerPos, float r, int pointNum) {
GameObject obj = new GameObject();
obj.name = "circle";
LineRenderer line = obj.AddCompoent<LineRenderer>();
line.loop = true;
line.positionCount = pointNum;
float angle = 350f / pointNum;
for(int i = 0; i < pointNum; ++i) {
// 1、点+向量 => 平移点
// 2、 四元数* 向量 => 旋转向量
line.SetPosition(i, centerPos + Quaternion.AngleAxis(angle * i, Vector3.up) * Vector3.forward * r)
}
}
-
长按鼠标得到鼠标移动的轨迹
-
private Vectore3 nowPos; private void Update() { if (Input.GetMouseButtonDown(0)) { GameObject obj = new GameObject(); obj.name = "trace"; LineRenderer line = obj.AddCompoent<LineRenderer>(); line.positionCount = 0; line.loop = false; line.starWidth = 0.5f; line.endWidth = 0.5f; } if (Input.GetMousePosition(0)) { line.positionCount += 1; nowPos = Input.mousePosition; nowPos.z = 10; // 设定屏幕的横截面,即画线的平面 Camera.main.ScreenToWorldPoint(Input.nowPos); line.sSetPostion(line.positionCount - 1, } }