Files
DTrierFlood_New/Assets/Scripts/Drone/DroneHudController.cs

186 lines
5.3 KiB
C#

using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace FloodSWE.Drone
{
/// <summary>
/// Binds HUD sliders and text readouts to the SimpleXrDroneController.
/// </summary>
public sealed class DroneHudController : MonoBehaviour
{
[Header("References")]
[SerializeField] private SimpleXrDroneController drone;
[Header("Sliders")]
[SerializeField] private Slider moveSpeedSlider;
[SerializeField] private Slider liftSpeedSlider;
[SerializeField] private Slider boostMultiplierSlider;
[SerializeField] private Vector2 moveSpeedRange = new Vector2(0.0f, 25.0f);
[SerializeField] private Vector2 liftSpeedRange = new Vector2(0.0f, 20.0f);
[SerializeField] private Vector2 boostRange = new Vector2(1.0f, 4.0f);
[Header("Readouts")]
[SerializeField] private TMP_Text currentSpeedText;
[SerializeField] private TMP_Text currentMaxSpeedText;
[SerializeField] private TMP_Text moveSpeedText;
[SerializeField] private TMP_Text liftSpeedText;
[SerializeField] private TMP_Text boostMultiplierText;
[SerializeField] private string numberFormat = "0.00";
private bool suppressSliderCallbacks;
private void OnEnable()
{
if (drone == null)
{
drone = FindFirstObjectByType<SimpleXrDroneController>();
}
HookSliderEvents(false);
ConfigureSliderRanges();
RefreshSlidersFromDrone();
HookSliderEvents(true);
UpdateReadouts();
}
private void OnDisable()
{
HookSliderEvents(false);
}
private void Update()
{
UpdateReadouts();
}
private void ConfigureSliderRanges()
{
ConfigureRange(moveSpeedSlider, moveSpeedRange);
ConfigureRange(liftSpeedSlider, liftSpeedRange);
ConfigureRange(boostMultiplierSlider, boostRange);
}
private static void ConfigureRange(Slider slider, Vector2 range)
{
if (slider == null)
{
return;
}
float min = Mathf.Min(range.x, range.y);
float max = Mathf.Max(range.x, range.y);
slider.minValue = min;
slider.maxValue = max;
slider.wholeNumbers = false;
}
private void HookSliderEvents(bool hook)
{
Hook(moveSpeedSlider, OnMoveSpeedSliderChanged, hook);
Hook(liftSpeedSlider, OnLiftSpeedSliderChanged, hook);
Hook(boostMultiplierSlider, OnBoostMultiplierSliderChanged, hook);
}
private static void Hook(Slider slider, UnityEngine.Events.UnityAction<float> callback, bool hook)
{
if (slider == null)
{
return;
}
if (hook)
{
slider.onValueChanged.AddListener(callback);
}
else
{
slider.onValueChanged.RemoveListener(callback);
}
}
private void RefreshSlidersFromDrone()
{
if (drone == null)
{
return;
}
suppressSliderCallbacks = true;
if (moveSpeedSlider != null)
{
moveSpeedSlider.value = drone.MoveSpeedMps;
}
if (liftSpeedSlider != null)
{
liftSpeedSlider.value = drone.LiftSpeedMps;
}
if (boostMultiplierSlider != null)
{
boostMultiplierSlider.value = drone.BoostMultiplier;
}
suppressSliderCallbacks = false;
}
private void OnMoveSpeedSliderChanged(float value)
{
if (suppressSliderCallbacks || drone == null)
{
return;
}
drone.SetMoveSpeed(value);
UpdateReadouts();
}
private void OnLiftSpeedSliderChanged(float value)
{
if (suppressSliderCallbacks || drone == null)
{
return;
}
drone.SetLiftSpeed(value);
UpdateReadouts();
}
private void OnBoostMultiplierSliderChanged(float value)
{
if (suppressSliderCallbacks || drone == null)
{
return;
}
drone.SetBoostMultiplier(value);
UpdateReadouts();
}
private void UpdateReadouts()
{
if (drone == null)
{
return;
}
SetText(currentSpeedText, $"{drone.CurrentCombinedSpeedMps.ToString(numberFormat)} m/s");
SetText(currentMaxSpeedText, $"{drone.CurrentMaxSpeedMps.ToString(numberFormat)} m/s");
SetText(moveSpeedText, $"{drone.MoveSpeedMps.ToString(numberFormat)} m/s");
SetText(liftSpeedText, $"{drone.LiftSpeedMps.ToString(numberFormat)} m/s");
SetText(boostMultiplierText, $"{drone.BoostMultiplier.ToString(numberFormat)}x");
}
private static void SetText(TMP_Text target, string value)
{
if (target == null || target.text == value)
{
return;
}
target.text = value;
}
}
}