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()); } 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 }; } } }