我们分两种情况,一种是UI上连线,一种是世界坐标下连线。
UI用
效果图
UI代码示例
public class DrawLine : MonoBehaviour
{
[Header("Point")]
public RectTransform startPoint;//起始点,UI用
public RectTransform endPoint;//终点,UI用
public GameObject linePrefab;//一个空物体下挂一个SpriteRender就行了
public float lineWidth;//线的宽度
private GameObject m_line;//线的实例
private RectTransform m_rect;
private RectTransform m_lineRect;
private void Awake()
{
m_rect = GetComponent<RectTransform>();
}
private void Start()
{
m_line = CreateLine(m_rect.anchoredPosition, endPoint.anchoredPosition);
//下方UI要加,世界坐标下不需要
//不明白函数意思看文档,作用是防止线段遮挡视野(层级不同可能会遮挡)
m_line.transform.SetAsFirstSibling();
}
private void Update()
{
DrawStraightLine(m_line, m_rect.anchoredPosition, endPoint.anchoredPosition);
}
/// <summary>
/// 创建一条两点之间的线
/// </summary>
/// <param name="startPoint">起始点</param>
/// <param name="endPoint">结束点</param>
public GameObject CreateLine(Vector2 startPoint, Vector2 endPoint)
{
GameObject line = Instantiate(linePrefab, transform.parent);
m_lineRect = line.GetComponent<RectTransform>();
return line;
}
//划线功能
private void DrawStraightLine(GameObject line, Vector2 a, Vector2 b)
{
float distance = Vector2.Distance(a, b); //求距离
float angle = Vector2.SignedAngle(a - b, Vector2.left); //求夹角
line.GetComponent<RectTransform>().anchoredPosition = (a + b) / 2;
line.GetComponent<RectTransform>().sizeDelta = new Vector2(distance, lineWidth); //长度,宽度
line.transform.localRotation = Quaternion.AngleAxis(-angle, Vector3.forward);
}
}
挂载示例
世界坐标用
挂载示例
简单一点的方法是直接用Unity自带的Line Renderer
在一个游戏对象上挂载Line Renderer
效果图
世界坐标代码示例
public class LineRendererText : MonoBehaviour
{
public Transform startPoint;
public Transform endPoint;
private LineRenderer m_lineRenderer;
private void Awake()
{
m_lineRenderer = GetComponent<LineRenderer>();
}
private void Update()
{
m_lineRenderer.SetPosition(0, startPoint.position);
m_lineRenderer.SetPosition(1, endPoint.position);
}
}