using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>将对象与面板线连接</summary>
public class ConnectPanelWithLine : MonoBehaviour
{
/// <summary>开始对象</summary>
public Transform startObject;
/// <summary>面板对象</summary>
public RectTransform panelObject;
/// <summary>绘制线条的粗细</summary>
public float lineSize = 0.015f;
/// <summary>材质</summary>
public Material material;
/// <summary>链接点</summary>
public ConnectPoint connectPoint= ConnectPoint.Auto;
private LineRenderer lineRenderer;
private Vector3 leftCenter;
private Vector3 rightCenter;
private Vector3 bottomCenter;
private Vector3 topCenter;
private void Awake()
{
if (material == null)
{
material = Resources.Load<Material>("Materials/Line");
}
lineRenderer = GetComponent<LineRenderer>();
if (lineRenderer == null) lineRenderer = gameObject.AddComponent<LineRenderer>();
lineRenderer.positionCount = 2;
lineRenderer.material = material;
}
private void Update()
{
if (startObject == null || panelObject == null) return;
getUIObjectBounds();
drawerLine();
}
/// <summary>绘制线</summary>
private void drawerLine()
{
if (startObject == null || panelObject == null || lineRenderer == null) return;
lineRenderer.startWidth = lineSize;
lineRenderer.endWidth = lineSize;
// 更新两个点的位置
lineRenderer.SetPosition(0, startObject.position);
switch(connectPoint)
{
case ConnectPoint.Auto: lineRenderer.SetPosition(1, getClosestObje()); break;
case ConnectPoint.LeftCenter: lineRenderer.SetPosition(1,leftCenter); break;
case ConnectPoint.RightCenter: lineRenderer.SetPosition(1,rightCenter); break;
case ConnectPoint.TopCenter: lineRenderer.SetPosition(1,topCenter); break;
case ConnectPoint.BottomCenter : lineRenderer.SetPosition(1,bottomCenter); break;
}
}
/// <summary>获取UI对象边界</summary>
private void getUIObjectBounds()
{
RectTransform rectTransform = panelObject.GetComponent<RectTransform>();
if (rectTransform == null) return;
// 获取相对于Canvas的位置和大小
Vector3 positionRelativeToCanvas = rectTransform.position;
Vector2 sizeRelativeToCanvas = Vector2.Scale(rectTransform.rect.size, rectTransform.lossyScale);
Quaternion rotationQuaternion = rectTransform.rotation;
leftCenter = positionRelativeToCanvas - rotationQuaternion * new Vector3(0.5f * sizeRelativeToCanvas.x, 0f, 0f);
rightCenter = positionRelativeToCanvas + rotationQuaternion * new Vector3(0.5f * sizeRelativeToCanvas.x, 0f, 0f);
topCenter = positionRelativeToCanvas + rotationQuaternion * new Vector3(0f, 0.5f * sizeRelativeToCanvas.y, 0f);
bottomCenter = positionRelativeToCanvas - rotationQuaternion * new Vector3(0f, 0.5f * sizeRelativeToCanvas.y, 0f);
}
/// <summary>获取距离最近的物体</summary>
private Vector3 getClosestObje()
{
if (panelObject == null|| startObject==null) return Vector3.zero;
float distance1 = Vector3.Distance(leftCenter, startObject.position);
float distance2 = Vector3.Distance(rightCenter, startObject.position);
float distance3 = Vector3.Distance(bottomCenter, startObject.position);
float distance4 = Vector3.Distance(topCenter, startObject.position);
float minDistance = Mathf.Min(distance1, distance2, distance3, distance4);
if (minDistance == distance1) return leftCenter;
else if (minDistance == distance2) return rightCenter;
else if (minDistance == distance3) return bottomCenter;
else if (minDistance == distance4) return topCenter;
return panelObject.position;
}
/// <summary>链接点位置</summary>
public enum ConnectPoint
{
/// <summary>自动寻找</summary>
Auto,
/// <summary>左边中心</summary>
LeftCenter,
/// <summary>右边中心</summary>
RightCenter,
/// <summary>底部中心</summary>
BottomCenter,
/// <summary>顶部中心</summary>
TopCenter,
}
}