0
点赞
收藏
分享

微信扫一扫

对象与面板链接画线功能


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,
    }

}

举报

相关推荐

0 条评论