117 lines
3.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|