We have that in our code so each time the character gets hit, it flashes.
With all these strings it just seems to be so inefficient so I was wondering if there is a better way to do this?
code
internal void UpdateHealthMaterial()
{
float damagePulseDuration = 0.25f;
float f = health / maxHealth;
float commandVal = 0;
if (lastCommandTime != 0 && (NetworkManager.time - lastCommandTime < damagePulseDuration))
{
commandVal = Mathf.Sin(NetworkManager.time - lastCommandTime) * Mathf.PI / (2 * damagePulseDuration);
}
float damagePulseVal = 0.3f * (1 - f);
float healPulseVal = 0;
/* if(lastDamageTime!=0 && f<1 && NetworkManager.time-lastDamageTime<damagePulseDuration){
damagePulseVal = 0.25f+0.7f*(1-f)*Mathf.Sin(NetworkManager.time-lastDamageTime)*Mathf.PI/(2*damagePulseDuration);
}
*/
float damageFlashDuration = 0.1f;
float damageFlashVal = 0;
if (lastDamageTime != 0 && (NetworkManager.time - lastDamageTime) < damageFlashDuration)
{
damageFlashVal = 1;
}
if (lastHealTime != 0 && f < 1 && NetworkManager.time - lastHealTime < damagePulseDuration)
{
healPulseVal = 0.25f + 0.5f * (1 - f) * Mathf.Sin(NetworkManager.time - lastHealTime) * Mathf.PI / (2 * damagePulseDuration);
}
if (healPulseVal < 0) healPulseVal = 0;
if (damagePulseVal < 0) damagePulseVal = 0;
if (commandVal != lastCommandVal || healPulseVal != lastHealVal || damagePulseVal != lastDamageVal || damageFlashVal != lastFlashVal)
{
if (materialBlock == null) materialBlock = new MaterialPropertyBlock();
materialBlock.Clear();
materialBlock.SetFloat("_CommandPulseVal", commandVal);
materialBlock.SetFloat("_DamagePulseVal", damagePulseVal);
materialBlock.SetFloat("_HealPulseVal", healPulseVal);
materialBlock.SetFloat("_DamageFlashVal", damageFlashVal);
for (int i = 0; i < renderers.Length; i++)
{
Renderer r = renderers[i];
if (r) r.SetPropertyBlock(materialBlock);
}
lastCommandVal = commandVal;
lastHealVal = healPulseVal;
lastDamageVal = damagePulseVal;
lastFlashVal = damageFlashVal;
}
}