Race_fields/Assets/_Project/Scripts/UI/HUD/VehicleDamageHud.cs
2026-08-12 12:11:13 +03:00

128 lines
3.9 KiB
C#

using RaceFields.Damage;
using RaceFields.Damage.VehicleDamage;
using UnityEngine;
using UnityEngine.UI;
namespace RaceFields.UI.HUD
{
public sealed class VehicleDamageHud : MonoBehaviour
{
[System.Serializable]
public sealed class ModuleImage
{
public VehicleModuleType moduleType;
public Image image;
}
[SerializeField] private VehicleDamageController target;
[SerializeField] private bool autoFindTarget = true;
[SerializeField] private float targetSearchInterval = 0.35f;
[SerializeField] private Image fullVehicleImage;
[SerializeField] private ModuleImage[] moduleImages;
[SerializeField] private Color healthyColor = new Color(1f, 1f, 1f, 0f);
[SerializeField] private Color damagedColor = new Color(1f, 0f, 0f, 0.7f);
[SerializeField] private Color destroyedColor = new Color(0f, 0f, 0f, 0.85f);
private VehicleDamageController boundTarget;
private float nextTargetSearchTime;
private void OnEnable()
{
Bind(target);
}
private void OnDisable()
{
Unbind();
}
private void Update()
{
if (target != null || !autoFindTarget)
return;
if (Time.unscaledTime < nextTargetSearchTime)
return;
nextTargetSearchTime = Time.unscaledTime + targetSearchInterval;
Bind(Object.FindAnyObjectByType<VehicleDamageController>());
}
public void Bind(VehicleDamageController newTarget)
{
if (boundTarget == newTarget)
{
target = newTarget;
RefreshAll();
return;
}
Unbind();
target = newTarget;
boundTarget = newTarget;
if (boundTarget != null)
boundTarget.ModuleStateChanged += HandleModuleStateChanged;
RefreshAll();
}
private void Unbind()
{
if (boundTarget != null)
boundTarget.ModuleStateChanged -= HandleModuleStateChanged;
boundTarget = null;
}
private void HandleModuleStateChanged(VehicleDamageController.VehicleModule module)
{
RefreshModule(module);
}
private void RefreshAll()
{
if (fullVehicleImage != null)
{
fullVehicleImage.enabled = true;
fullVehicleImage.color = Color.white;
}
if (moduleImages == null)
return;
for (int i = 0; i < moduleImages.Length; i++)
{
VehicleDamageController.VehicleModule module = target != null ? target.GetModule(moduleImages[i].moduleType) : null;
SetModuleImage(moduleImages[i], module != null ? module.State : VehicleModuleState.Healthy);
}
}
private void RefreshModule(VehicleDamageController.VehicleModule module)
{
if (moduleImages == null || module == null)
return;
for (int i = 0; i < moduleImages.Length; i++)
{
if (moduleImages[i].moduleType == module.ModuleType)
SetModuleImage(moduleImages[i], module.State);
}
}
private void SetModuleImage(ModuleImage moduleImage, VehicleModuleState state)
{
if (moduleImage == null || moduleImage.image == null)
return;
moduleImage.image.enabled = true;
moduleImage.image.color = state switch
{
VehicleModuleState.Damaged => damagedColor,
VehicleModuleState.Destroyed => destroyedColor,
VehicleModuleState.Detached => destroyedColor,
_ => healthyColor
};
}
}
}