128 lines
3.9 KiB
C#
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
|
|
};
|
|
}
|
|
}
|
|
}
|