Unity 如何使用LineRenderer 动态划线
1 2 3 4 5 6 7 8 9 10 11 12 | private LineRenderer line1; //画线 line1 = this .gameObject.AddComponent<LineRenderer>(); //只有设置了材质 setColor才有作用 line1.material = new Material(Shader.Find( "Particles/Additive" )); line1.SetVertexCount(2); //设置两点 line1.SetColors(Color.yellow, Color.red); //设置直线颜色 line1.SetWidth(5f, 10f); //设置直线宽度 //设置指示线的起点和终点 line1.SetPosition(0, A.transform.position); line1.SetPosition(1, B.transform.position); Destroy( this .gameObject.GetComponent<LineRenderer>()); |
补充:Unity LineRenderer绘制物体行走路线
我是用的角色控制器(Character Controller)+LineRenderer做的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerTest : MonoBehaviour { public GameObject clone; //这是个空物体 只添加了一个LineRenderer组件 public float speed = 5; public float jumpSpeed = 10f; public float luodi = 15; private Vector3 movePos = Vector3.zero; public CharacterController controller; private LineRenderer line; Vector3[] path; private float time = 0; List<Vector3> pos= new List<Vector3> (); void Awake() { path = pos.ToArray(); //初始化 line = clone.GetComponent<LineRenderer>(); //获得该物体上的LineRender组件 line.SetColors(Color.blue, Color.red); //设置颜色 line.SetWidth(0.2f, 0.1f); //设置宽度 } void Update() { time += Time.deltaTime; if (time>0.1) //每0.1秒绘制一次 { time = 0; pos.Add(transform.position); //添加当前坐标进链表 path = pos.ToArray(); //转成数组 } if (controller.isGrounded) //判断人物是否落地 { movePos = new Vector3(Input.GetAxis( "Horizontal" ), 0, Input.GetAxis( "Vertical" )); movePos = transform.TransformDirection(movePos); movePos *= speed; if (Input.GetButton( "Jump" )) { movePos.y = jumpSpeed; } } movePos.y -= luodi * Time.deltaTime; controller.Move(movePos * Time.deltaTime); if (path.Length!=0) //有数据时候再绘制 { line.SetVertexCount(path.Length); //设置顶点数 line.SetPositions(path); //设置顶点位置 } } } |
补充:Unity组件 ― LineRenderer动态添加碰撞
基础知识:
选中要添加组件的gameObject,在Inspector面板,点击“Add Component”按钮,选中LineRenderer组件,添加。
cast Shadows : 蒙上阴影
Receive Shadows : 是否接受阴影
Dynamic Occludee : 是否动态遮罩
Materials 中的属性:
size : 材质球的数量
Element : 具体的材质球
Positions 中的属性:
size : 位置的数量
Element : 具体的位置
Use World Space : 是否使用世界坐标系,还是使用相对坐标系
Width : 线条的宽度
Color : 线条的颜色,注:如果没有赋值材质,无论怎样改变Color的值,颜色都不会有改变。
Corner Vertices : 可形成线条的圆角效果
End Cap Vertices : 影响线条的两端的圆角效果。
注:当line Renderer拥有了材质,可以通过修改Color来改变颜色。当时当修改了Color后,line的颜色没有改变,应该是Material和Color属性结合不好。将Material修改为Sprites/Default,Color的颜色就可以成功的显示在line上面了。
动态添加碰撞器(Polygon Collider2D)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class MouseTrack : MonoBehaviour { /// <summary> /// 获取LineRenderer组件 /// </summary> [Header( "获得LineRenderer组件" )] public LineRenderer lineRenderer; //获得鼠标跟踪位置 private Vector3[] mouseTrackPositions = new Vector3[20]; private Vector3 headPosition; //头位置 private Vector3 lastPosition; //尾位置 private int positionCount = 0; //位置计数 [Header( "设置多远距离记录一个位置" )] public float distanceOfPositions = 0.01f; private bool firstMouseDown = false ; //第一次鼠标点击 private bool mouseDown = false ; //鼠标点击 PolygonCollider2D polygonCollider; //添加多边形碰撞 void Start() { polygonCollider = gameObject.GetComponent<PolygonCollider2D>(); } void Update() { //鼠标点击的时候 if (Input.GetMouseButtonDown(0)) { polygonCollider.enabled = true ; lineRenderer.positionCount = 20; firstMouseDown = true ; mouseDown = true ; } if (Input.GetMouseButtonUp(0)) { mouseDown = false ; //ClearColliderAndLineRenderer(); } OnDrawLine(); firstMouseDown = false ; } //画线 private void OnDrawLine() { if (firstMouseDown == true ) { positionCount = 0; //头坐标 headPosition = Camera.main.ScreenToViewportPoint(Input.mousePosition + new Vector3(0, 0, 11)); lastPosition = headPosition; } if (mouseDown == true ) { headPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, 11)); //判断头坐标到尾坐标的距离是否大于记录点位 if (Vector3.Distance(headPosition, lastPosition) > distanceOfPositions) { //用于保存位置 SavePosition(headPosition); positionCount++; } lastPosition = headPosition; } //设置线性渲染器的位置 SetLineRendererPosition(mouseTrackPositions); } //保存位置 private void SavePosition(Vector3 pos) { pos.z = 0; if (positionCount <= 19) { for ( int i = positionCount; i < 20; i++) { mouseTrackPositions[i] = pos; } } else { for ( int i = 0; i < 19; i++) { mouseTrackPositions[i] = mouseTrackPositions[i + 1]; } } mouseTrackPositions[19] = pos; //创建碰撞路径 List<Vector2> colliderPath = GetColliderPath(mouseTrackPositions); polygonCollider.SetPath(0, colliderPath.ToArray()); } //计算碰撞体轮廓 float colliderWidth; List<Vector2> pointList2 = new List<Vector2>(); List<Vector2> GetColliderPath(Vector3[] pointList3) { //碰撞体宽度 colliderWidth = lineRenderer.startWidth; //Vector3转Vector2 pointList2.Clear(); for ( int i = 0; i < pointList3.Length; i++) { pointList2.Add(pointList3[i]); } //碰撞体轮廓点位 List<Vector2> edgePointList = new List<Vector2>(); //以LineRenderer的点位为中心, 沿法线方向与法线反方向各偏移一定距离, 形成一个闭合且不交叉的折线 for ( int j = 1; j < pointList2.Count; j++) { //当前点指向前一点的向量 Vector2 distanceVector = pointList2[j - 1] - pointList2[j]; //法线向量 Vector3 crossVector = Vector3.Cross(distanceVector, Vector3.forward); //标准化, 单位向量 Vector2 offectVector = crossVector.normalized; //沿法线方向与法线反方向各偏移一定距离 Vector2 up = pointList2[j - 1] + 0.5f * colliderWidth * offectVector; Vector2 down = pointList2[j - 1] - 0.5f * colliderWidth * offectVector; //分别加到List的首位和末尾, 保证List中的点位可以围成一个闭合且不交叉的折线 edgePointList.Insert(0, down); edgePointList.Add(up); //加入最后一点 if (j == pointList2.Count - 1) { up = pointList2[j] + 0.5f * colliderWidth * offectVector; down = pointList2[j] - 0.5f * colliderWidth * offectVector; edgePointList.Insert(0, down); edgePointList.Add(up); } } //返回点位 return edgePointList; } //设置线条渲染器位置 private void SetLineRendererPosition(Vector3[] position) { lineRenderer.SetPositions(position); } //用于清除碰撞和线性渲染 void ClearColliderAndLineRenderer() { if (polygonCollider) { polygonCollider.enabled = false ; } lineRenderer.positionCount = 0; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)