using System;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
[ExecuteAlways]
public class HealthRSUV : MonoBehaviour
{
public bool randomizeOnStart = true;
public bool showHealthBar = true;
public float healthBarOpacity = 1;
public float health = 1;
public MeshRenderer meshRenderer = null;
uint data = 0x00000000; // All bits set to 0
void Start()
{
if (randomizeOnStart)
Randomize();
UpdateData();
}
void OnEnable()
{
Start();
}
void OnValidate()
{
UpdateData();
}
void UpdateData()
{
health = Mathf.Clamp01(health);
float stepHealth = Mathf.CeilToInt(7*(health + 0.001f * health)) / 8f;
int health07 = Mathf.RoundToInt(stepHealth * 7);
healthBarOpacity = Mathf.Clamp01(healthBarOpacity);
float stepHealthBarOpacity = Mathf.CeilToInt(7 * (healthBarOpacity + 0.001f * healthBarOpacity)) / 8f;
int healthBarOpacity07 = Mathf.RoundToInt(stepHealthBarOpacity * 7);
data = HelpersRSUV.EncodeData(data, health07, 0, 3);
data = HelpersRSUV.SetBit(data, 3, showHealthBar);
data = HelpersRSUV.EncodeData(data, healthBarOpacity07, 4, 3);
UpdateRenderers();
}
private void UpdateRenderers()
{
if (meshRenderer == null)
throw new NullReferenceException("The variable meshRenderer has not been set properly.");
meshRenderer.SetShaderUserValue(data);
}
public void Randomize()
{
health = UnityEngine.Random.Range(0.1f, 1f);
UpdateData();
}
public void SetHealth(float health)
{
this.health = health;
}
public void TakeDamage(float damage)
{
health -= damage;
health = Mathf.Clamp01(health);
UpdateData();
}
}