Files
2026-07-09 21:33:33 +02:00

97 lines
3.6 KiB
C#

using System.Linq;
using Sirenix.OdinInspector;
using Sirenix.Utilities;
using UnityEngine;
using UnityEngine.Rendering;
using VOID.Generic.Objects.Item;
using VOID.Generic.Trajectory;
namespace VOID.Generic.Player
{
[DefaultExecutionOrder(-1)]
public class DraggingVisualizer : MonoBehaviour
{
[ShowInInspector] private Transform _transformStart;
[ShowInInspector] private Transform _transformEnd;
private Vector3 _positionStart;
private Vector3 _positionEnd;
private Vector3 _lastPositionStart;
private Vector3 _lastPositionEnd;
private LineRenderer _lineRenderer;
private ParabolicTrajectory _trajectory = new();
public static DraggingVisualizer Create(Transform transformStart, Transform transformEnd, ItemObject item)
{
// Prepare for scene dragging
var go = Instantiate(item.gameObject);
go.name = "Dragging Visualizer Dummy - " + go.name;
go.transform.localPosition = Vector3.zero;
go.transform.rotation = Quaternion.Euler(0, go.transform.rotation.eulerAngles.y, 0);
// Remove everything except rendering components
go.GetComponentsInChildren<Component>()
.Where(component => component is not Transform and not MeshFilter and not MeshRenderer)
.ForEach(component => Destroy(component));
// Make sure that our dummy don't copy highlight/outlines
go.GetComponentsInChildren<Component>()
.FilterCast<MeshRenderer>()
.ForEach(meshRenderer =>
meshRenderer.sharedMaterials = meshRenderer.sharedMaterials
.Where(material => !HighlightManager.current.shaders.Contains(material.shader))
.ToArray());
var draggingVisualizer = go.AddComponent<DraggingVisualizer>();
draggingVisualizer._transformStart = transformStart;
draggingVisualizer._transformEnd = transformEnd;
// Nice trajectory how item move
draggingVisualizer._lineRenderer = go.AddComponent<LineRenderer>();
draggingVisualizer._lineRenderer.startWidth = 0.1f;
draggingVisualizer._lineRenderer.endWidth = 0.1f;
draggingVisualizer._lineRenderer.shadowCastingMode = ShadowCastingMode.Off;
draggingVisualizer._trajectory.height = 1f;
return draggingVisualizer;
}
private void FixedUpdate()
{
if (!_transformStart || !_transformEnd) return;
_positionStart = _transformStart.position;
_positionEnd = _transformEnd.position;
if (_positionStart == _lastPositionStart && _positionEnd == _lastPositionEnd) return;
_lastPositionStart = _positionStart;
_lastPositionEnd = _positionEnd;
transform.position = _positionEnd;
if (gameObject.activeSelf) UpdateTrajectory();
}
private void UpdateTrajectory()
{
_trajectory.Init(_positionStart, _positionEnd);
var pointsNeeded = Mathf.Max(1, Mathf.FloorToInt(_trajectory.trajectoryDistance)) * 10;
var points = _trajectory.GetPositions(pointsNeeded);
_lineRenderer.positionCount = points.Length;
_lineRenderer.SetPositions(points);
}
public void Show()
{
gameObject.SetActive(true);
}
public void Hide()
{
gameObject.SetActive(false);
}
}
}