效果图如下:
绘画的点,可以是Vector2也可以是Transform。
代码如下:
1.
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace ExtraFoundation.Components
{
//===============================================================================
[DisallowMultipleComponent]
[RequireComponent(typeof(CanvasRenderer))]
[AddComponentMenu("UI/Effects/UILineRenderer")]
public class UILineRenderer : MaskableGraphic
{
#region Public Properties
//---------------------------------------------------------------------------
public Texture MainTexture
{
get { return texture; }
set { texture = value; }
}
//---------------------------------------------------------------------------
public float LineWidth
{
get { return lineWidth; }
set { lineWidth = value; }
}
//---------------------------------------------------------------------------
public PositionType Space
{
get { return posType; }
set { posType = value; }
}
//---------------------------------------------------------------------------
public bool LineList
{
get { return lineList; }
set { lineList = value; }
}
//---------------------------------------------------------------------------
public bool LineCaps
{
get { return lineCaps; }
set { lineCaps = value; }
}
//---------------------------------------------------------------------------
public JoinType LineJoin
{
get { return lineJoin; }
set { lineJoin = value; }
}
//---------------------------------------------------------------------------
public override Texture mainTexture
{
get
{
return texture == null ? s_WhiteTexture : texture;
}
}
//---------------------------------------------------------------------------
/// <summary>
/// Texture to be used.
/// </summary>
public Texture Texture
{
get
{
return texture;
}
set
{
if (texture == value)
{
return;
}
texture = value;
SetVerticesDirty();
SetMaterialDirty();
}
}
//---------------------------------------------------------------------------
public Rect UVRect
{
get
{
return uvRect;
}
set
{
if (uvRect == value)
{
return;
}
uvRect = value;
SetVerticesDirty();
}
}
#endregion
#region Public Methods
//---------------------------------------------------------------------------
public void AddVector2Point(Vector2 pos)
{
Point point = new Point();
point.Position = pos;
point.IsTarget = false;
points.Add(point);
}
//---------------------------------------------------------------------------
public void AddTransformPoint(Transform trans)
{
Point point = new Point();
point.Target = trans;
point.IsTarget = true;
points.Add(point);
}
public void InsertVector2PointAt(int index, Vector2 pos)
{
Point point = new Point();
point.Position = pos;
point.IsTarget = false;
points.Insert(index, point);
}
//---------------------------------------------------------------------------
public void RemovePointAt(int index)
{
if(index >= 0 && points.Count > index)
{
points.RemoveAt(index);
}
}
//---------------------------------------------------------------------------
public void ClearPoints()
{
points.Clear();
}
#endregion
#region UnityMethods
//---------------------------------------------------------------------------
private void Update()
{
if (Application.isEditor && transform.position != cachePos)
{
cachePos = transform.position;
OnRebuildRequested();
}
}
#endregion
#region Internal Methods
//---------------------------------------------------------------------------
private List<Vector2> GetTruePoins()
{
List<Vector2> truePoins = new List<Vector2>();
if (posType == PositionType.Absolute)
{
Vector2 pOffset = transform.position;
for (int i = 0, count = points.Count; i < count; i++)
{
Point point = points[i];
if (point.IsTarget)
{
if (point.Target)
{
truePoins.Add((Vector2)point.Target.position - pOffset);
}
}
else
{
truePoins.Add(point.P