using System; using System.Collections.Generic; using TMPro; using UnityEngine; using Studio.Util; using XRLib; using XRLib.UI; using Studio.AssetTool; namespace Studio.UI { public class Panel_ObjectDistance : PanelBase, ISingle { UI_ObjectDistance[] ui_ObjectDistances; LineRenderer[] lineRenderers = new LineRenderer[6]; Dictionary distanceLines = new(); [SerializeField] float lineThickness = 0.1f; CustomAssetRenderObject selectedObject; public override void AfterAwake() { ui_ObjectDistances = GetComponentsInChildren(true); var lineMat = Resources.Load("Materials/Mat_LineRender"); for (int i = 0; i < lineRenderers.Length; i++) { lineRenderers[i] = new GameObject("DistanceLine").AddComponent(); lineRenderers[i].transform.SetParent(transform, true); lineRenderers[i].material = lineMat; lineRenderers[i].positionCount = 2; lineRenderers[i].startWidth = lineThickness; lineRenderers[i].endWidth = lineThickness; distanceLines.Add(ui_ObjectDistances[i], lineRenderers[i]); } DeactivateAll(); } private void Update() { if (selectedObject == null || selectedObject.isCollided) { DeactivateAll(); return; } UpdateDistance(ui_ObjectDistances[0], Vector3.up); UpdateDistance(ui_ObjectDistances[1], Vector3.down); UpdateDistance(ui_ObjectDistances[2], Vector3.left); UpdateDistance(ui_ObjectDistances[3], Vector3.right); UpdateDistance(ui_ObjectDistances[4], Vector3.forward); UpdateDistance(ui_ObjectDistances[5], Vector3.back); } public void SelectObjectFromCreate(CustomAssetRenderObject obj) { selectedObject = obj; } public void SelectObjectFromClick(string name, List objects) { if (objects.Count != 1) { SetSelecetedObjectToNull(); return; } selectedObject = objects[0].GetComponent(); } public void SetSelecetedObjectToNull() { selectedObject = null; } void DeactivateAll() { foreach (var distanceUI in distanceLines.Keys) { distanceUI.gameObject.SetActive(false); distanceLines[distanceUI].enabled = false; } } void UpdateDistance(UI_ObjectDistance distanceUI, Vector3 direction) { RaycastHit hit = selectedObject.GetObjectHit(direction); if (hit.collider != null) { float distance = hit.distance; Vector3 hitPoint = hit.point; Vector3 distanceCenterPoint = hitPoint - (direction * distance / 2); distanceUI.SetText(distance); distanceUI.SetPos(distanceCenterPoint); distanceLines[distanceUI].SetPosition(0, hitPoint); distanceLines[distanceUI].SetPosition(1, hitPoint - (direction * distance)); distanceLines[distanceUI].enabled = true; } else { distanceUI.gameObject.SetActive(false); distanceLines[distanceUI].enabled = false; return; } } } }