Files
Studio/Assets/Scripts/Studio/UI/Panel/Panel_ObjectDistance.cs
2025-05-26 12:06:08 +09:00

117 lines
3.6 KiB
C#

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<UI_ObjectDistance, LineRenderer> distanceLines = new();
[SerializeField]
float lineThickness = 0.1f;
CustomAssetRenderObject selectedObject;
public override void AfterAwake()
{
ui_ObjectDistances = GetComponentsInChildren<UI_ObjectDistance>(true);
var lineMat = Resources.Load<Material>("Materials/Mat_LineRender");
for (int i = 0; i < lineRenderers.Length; i++)
{
lineRenderers[i] = new GameObject("DistanceLine").AddComponent<LineRenderer>();
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<GameObject> objects)
{
if (objects.Count != 1)
{
SetSelecetedObjectToNull();
return;
}
selectedObject = objects[0].GetComponent<CustomAssetRenderObject>();
}
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;
}
}
}
}