186 lines
5.3 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|