• 对象与面板链接画线功能


    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. /// 将对象与面板线连接
    5. public class ConnectPanelWithLine : MonoBehaviour
    6. {
    7. /// 开始对象
    8. public Transform startObject;
    9. /// 面板对象
    10. public RectTransform panelObject;
    11. /// 绘制线条的粗细
    12. public float lineSize = 0.015f;
    13. /// 材质
    14. public Material material;
    15. /// 链接点
    16. public ConnectPoint connectPoint= ConnectPoint.Auto;
    17. private LineRenderer lineRenderer;
    18. private Vector3 leftCenter;
    19. private Vector3 rightCenter;
    20. private Vector3 bottomCenter;
    21. private Vector3 topCenter;
    22. private void Awake()
    23. {
    24. if (material == null)
    25. {
    26. material = Resources.Load("Materials/Line");
    27. }
    28. lineRenderer = GetComponent();
    29. if (lineRenderer == null) lineRenderer = gameObject.AddComponent();
    30. lineRenderer.positionCount = 2;
    31. lineRenderer.material = material;
    32. }
    33. private void Update()
    34. {
    35. if (startObject == null || panelObject == null) return;
    36. getUIObjectBounds();
    37. drawerLine();
    38. }
    39. /// 绘制线
    40. private void drawerLine()
    41. {
    42. if (startObject == null || panelObject == null || lineRenderer == null) return;
    43. lineRenderer.startWidth = lineSize;
    44. lineRenderer.endWidth = lineSize;
    45. // 更新两个点的位置
    46. lineRenderer.SetPosition(0, startObject.position);
    47. switch(connectPoint)
    48. {
    49. case ConnectPoint.Auto: lineRenderer.SetPosition(1, getClosestObje()); break;
    50. case ConnectPoint.LeftCenter: lineRenderer.SetPosition(1,leftCenter); break;
    51. case ConnectPoint.RightCenter: lineRenderer.SetPosition(1,rightCenter); break;
    52. case ConnectPoint.TopCenter: lineRenderer.SetPosition(1,topCenter); break;
    53. case ConnectPoint.BottomCenter : lineRenderer.SetPosition(1,bottomCenter); break;
    54. }
    55. }
    56. /// 获取UI对象边界
    57. private void getUIObjectBounds()
    58. {
    59. RectTransform rectTransform = panelObject.GetComponent();
    60. if (rectTransform == null) return;
    61. // 获取相对于Canvas的位置和大小
    62. Vector3 positionRelativeToCanvas = rectTransform.position;
    63. Vector2 sizeRelativeToCanvas = Vector2.Scale(rectTransform.rect.size, rectTransform.lossyScale);
    64. Quaternion rotationQuaternion = rectTransform.rotation;
    65. leftCenter = positionRelativeToCanvas - rotationQuaternion * new Vector3(0.5f * sizeRelativeToCanvas.x, 0f, 0f);
    66. rightCenter = positionRelativeToCanvas + rotationQuaternion * new Vector3(0.5f * sizeRelativeToCanvas.x, 0f, 0f);
    67. topCenter = positionRelativeToCanvas + rotationQuaternion * new Vector3(0f, 0.5f * sizeRelativeToCanvas.y, 0f);
    68. bottomCenter = positionRelativeToCanvas - rotationQuaternion * new Vector3(0f, 0.5f * sizeRelativeToCanvas.y, 0f);
    69. }
    70. /// 获取距离最近的物体
    71. private Vector3 getClosestObje()
    72. {
    73. if (panelObject == null|| startObject==null) return Vector3.zero;
    74. float distance1 = Vector3.Distance(leftCenter, startObject.position);
    75. float distance2 = Vector3.Distance(rightCenter, startObject.position);
    76. float distance3 = Vector3.Distance(bottomCenter, startObject.position);
    77. float distance4 = Vector3.Distance(topCenter, startObject.position);
    78. float minDistance = Mathf.Min(distance1, distance2, distance3, distance4);
    79. if (minDistance == distance1) return leftCenter;
    80. else if (minDistance == distance2) return rightCenter;
    81. else if (minDistance == distance3) return bottomCenter;
    82. else if (minDistance == distance4) return topCenter;
    83. return panelObject.position;
    84. }
    85. /// 链接点位置
    86. public enum ConnectPoint
    87. {
    88. /// 自动寻找
    89. Auto,
    90. /// 左边中心
    91. LeftCenter,
    92. /// 右边中心
    93. RightCenter,
    94. /// 底部中心
    95. BottomCenter,
    96. /// 顶部中心
    97. TopCenter,
    98. }
    99. }

  • 相关阅读:
    QT集成Protobuf
    GAN原理及代码实现
    就是把一个数组中相同类别数据,组成新的数组
    5毛VS600亿,食品安全问题是卫龙上市最大的拦路虎?
    Spark中的Driver、Executor、Stage、TaskSet、DAGScheduler等介绍
    堆外内存和堆内内存及虚引用的应用
    windows2022远程桌面连接管理员已结束会话解决方法
    店铺进销存管理系统源码
    如何公网远程访问本地群晖NAS File Station文件夹
    约数相关问题
  • 原文地址:https://blog.csdn.net/a451319296/article/details/134548708