2017-04-12 01:23:07 +09:00

155 lines
3.0 KiB
C#

using UnityEngine;
using System.Collections.Generic;
[ExecuteInEditMode]
[AddComponentMenu("Destructible 2D/D2D Damageable Sprite")]
[RequireComponent(typeof(SpriteRenderer))]
public class D2D_DamageableSprite : MonoBehaviour
{
[System.Serializable]
public class DamageLevel
{
public Sprite Sprite;
public float DamageRequired;
}
public float Damage;
public bool AllowDestruction;
public float DamageLimit;
public GameObject ReplaceWith;
public List<DamageLevel> DamageLevels = new List<DamageLevel>();
private SpriteRenderer spriteRenderer;
public DamageLevel AddDamageLevel(Sprite sprite = null, float damageRequired = 0.0f)
{
if (DamageLevels == null)
{
DamageLevels = new List<DamageLevel>();
}
var newDamageLevel = new DamageLevel(); DamageLevels.Add(newDamageLevel);
newDamageLevel.Sprite = sprite;
newDamageLevel.DamageRequired = damageRequired;
return newDamageLevel;
}
public void InflictDamage(float amount)
{
Damage += amount;
UpdateSprite();
}
public void UpdateSprite()
{
var bestDamageLevel = default(DamageLevel);
if (DamageLevels != null)
{
foreach (var damageLevel in DamageLevels)
{
if (damageLevel != null)
{
if (bestDamageLevel == null || Damage >= damageLevel.DamageRequired)
{
// Skip if this is below the best
if (bestDamageLevel != null && damageLevel.DamageRequired < bestDamageLevel.DamageRequired)
{
continue;
}
bestDamageLevel = damageLevel;
}
}
}
}
// Replace sprite?
if (bestDamageLevel != null)
{
if (spriteRenderer == null) spriteRenderer = GetComponent<SpriteRenderer>();
if (spriteRenderer.sprite != bestDamageLevel.Sprite)
{
if (bestDamageLevel.Sprite != null)
{
spriteRenderer.sprite = bestDamageLevel.Sprite;
}
else
{
spriteRenderer.sprite = null;
}
}
}
UpdateDestruction();
}
protected virtual void Awake()
{
UpdateDamageLevels();
}
#if UNITY_EDITOR
protected virtual void Reset()
{
UpdateDamageLevels();
}
protected virtual void OnValidate()
{
UpdateSprite();
}
#endif
private void UpdateDamageLevels()
{
if (DamageLevels == null)
{
DamageLevels = new List<DamageLevel>();
}
// Copy default damage level from SpriteRenderer?
if (DamageLevels.Count == 0)
{
if (spriteRenderer == null) spriteRenderer = GetComponent<SpriteRenderer>();
if (spriteRenderer.sprite != null)
{
var newDamageLevel = new DamageLevel(); DamageLevels.Add(newDamageLevel);
newDamageLevel.Sprite = spriteRenderer.sprite;
}
}
}
private void UpdateDestruction()
{
if (AllowDestruction == true)
{
#if UNITY_EDITOR
if (Application.isPlaying == false)
{
return;
}
#endif
if (Damage >= DamageLimit)
{
if (ReplaceWith != null)
{
D2D_Helper.CloneGameObject(ReplaceWith, transform.parent, transform.position, transform.rotation);
}
D2D_Helper.Destroy(gameObject);
}
}
}
}