Unity中使用LineRenderer进行画线

阅读: 评论:0

Unity中使用LineRenderer进行画线

Unity中使用LineRenderer进行画线

一:世界空间下绘制

挂载到任意游戏物体身上

using UnityEngine;
using System.Collections.Generic;
using System;/// <summary>
/// 画线控制器
/// </summary>
public class DrawLineController : MonoSingleton<DrawLineController>
{private bool m_EnableDraw = true;//是否开启绘制public bool EnableDraw{get { return m_EnableDraw; }set { m_EnableDraw = value; }}public bool openOptimize;//是否开启优化(顶点数增加会带来性能消耗)public int optimizeAddVertexCount;//优化后两个点之间添加的顶点数private bool m_IsMouseDown;//鼠标是否按下private Vector2 m_LastMousePos;//上一次的鼠标位置private List<LineRenderer> m_LineRendererList = new List<LineRenderer>();//存储所有的LineRendererprivate LineRenderer m_CurLineRenderer;//当前的LineRendererpublic float drawLineMinDist = 0.2f;//绘制线段的最小距离public LayerMask ignoreLayer;//忽略的层//线段参数public float lineWidth = 0.2f;//线的宽度public Material lineMat;//线的材质public int lineCapVertices;//线顶点平滑度public int lineCornerVertices;//线拐点顶点数public Color startColor;//线的颜色public Color endColor;//线的颜色private Action<LineRenderer> m_OnBeginDrawLine;//开始绘制的回调private Action<LineRenderer, Vector2, bool> m_OnMouseDrag;//鼠标拖拽时的回调private Action<LineRenderer, Vector2, Vector2> m_OnDrawLine;//绘制的回调(只有绘制的时候才会调用)private Action<LineRenderer> m_OnEndDrawLine;//结束绘制的回调public void RegisterOnBeginDrawLineCallback(Action<LineRenderer> onBeginDrawLine){m_OnBeginDrawLine = onBeginDrawLine;}public void RegisterOnMouseDragCallback(Action<LineRenderer, Vector2, bool> onMouseDrag){m_OnMouseDrag = onMouseDrag;}public void RegisterOnDrawLineCallback(Action<LineRenderer, Vector2, Vector2> onDrawLine){m_OnDrawLine = onDrawLine;}public void RegisterOnEndDrawLineCallback(Action<LineRenderer> onEndDrawLine){m_OnEndDrawLine = onEndDrawLine;}/// <summary>/// 创建LineRenderer/// </summary>private void CreateLineRenderer(){GameObject go = new GameObject("LineRenderer");go.transform.SetParent(transform);m_CurLineRenderer = go.AddComponent<LineRenderer>();m_CurLineRenderer.positionCount = 0;m_CurLineRenderer.startWidth = lineWidth;dWidth = lineWidth;m_CurLineRenderer.material = lineMat;m_CurLineRenderer.numCapVertices = lineCapVertices;m_CurLineRenderer.numCornerVertices = lineCornerVertices;m_CurLineRenderer.useWorldSpace = false;m_CurLineRenderer.startColor = startColor;dColor = endColor;m_LineRendererList.Add(m_CurLineRenderer);}private void Update(){if (!m_EnableDraw){return;}if (Input.GetMouseButtonDown(0)){BeginDrawLine();m_IsMouseDown = true;}if (Input.GetMouseButtonUp(0)){EndDrawLine();m_IsMouseDown = false;}if (m_IsMouseDown){InDrawLine();}}/// <summary>/// 开始画线/// </summary>private void BeginDrawLine(){CreateLineRenderer();AddPosition(CTUtils.usePosition));m_OnBeginDrawLine?.Invoke(m_CurLineRenderer);}/// <summary>/// 画线中/// </summary>private void InDrawLine(){Vector2 curLineWorldPos = CTUtils.usePosition);Vector2 lastLineWorldPos = m_CurLineRenderer.GetPosition(m_CurLineRenderer.positionCount - 1);bool isMoving = curLineWorldPos != m_LastMousePos;m_OnMouseDrag?.Invoke(m_CurLineRenderer, curLineWorldPos, isMoving);if (Vector2.Distance(lastLineWorldPos, curLineWorldPos) >= drawLineMinDist && CanDraw(lastLineWorldPos, curLineWorldPos)){if (openOptimize){//为两个点之间再添加多个点,让线段看起来更平滑optimizeAddVertexCount = optimizeAddVertexCount == 0 ? 1 : optimizeAddVertexCount;Vector2 deltaPos = (curLineWorldPos - lastLineWorldPos) / optimizeAddVertexCount;for (int i = 1; i <= optimizeAddVertexCount; i++){AddPosition(lastLineWorldPos + deltaPos * i);}}else{AddPosition(curLineWorldPos);}m_OnDrawLine?.Invoke(m_CurLineRenderer, lastLineWorldPos, curLineWorldPos);}m_LastMousePos = curLineWorldPos;}/// <summary>/// 结束画线/// </summary>private void EndDrawLine(){m_OnEndDrawLine?.Invoke(m_CurLineRenderer);if (m_CurLineRenderer.positionCount <= 1){ClearLine(m_CurLineRenderer);}m_CurLineRenderer = null;}/// <summary>/// 向LineRenderer添加点/// </summary>private void AddPosition(Vector2 curLineWorldPos){m_CurLineRenderer.SetPosition(m_CurLineRenderer.positionCount++, curLineWorldPos);}/// <summary>/// 能否画线/// </summary>private bool CanDraw(Vector2 lastPos, Vector2 nextPos){//是否画在忽略的层上Vector2 dir = (nextPos - lastPos).normalized;float dist = (nextPos - lastPos).magnitude;RaycastHit2D raycastHit2D = Physics2D.Raycast(lastPos, dir, dist, ignoreLayer.value);if (llider != null){return false;}return true;}/// <summary>/// 清除全部线/// </summary>public void ClearAllLine(){for (int i = m_LineRendererList.Count - 1; i >= 0; i--){ClearLine(m_LineRendererList[i]);}}/// <summary>/// 清除线/// </summary>private void ClearLine(LineRenderer lineRenderer){lineRenderer.positionCount = 0;m_LineRendererList.Remove(lineRenderer);Destroy(lineRenderer.gameObject);}/// <summary>/// 设置是否开启绘制/// </summary>public void SetEnableDraw(bool isEnable){m_EnableDraw = isEnable;}
}

二:UI上绘制

本文发布于:2024-01-30 14:07:01,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170659482320538.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:画线   Unity   LineRenderer
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23