using com.jbrettob.core; using UnityEngine; using System.Collections; namespace com.jbrettob { public class Actor:AbstractMonoBehaviour, IActor { public int healthPoints = 1; [SerializeField] private Material _baseMaterial; private float _timeLasting = .25f; private float _timeSwap = .1f; private float _timeLastingTimer = 0f; private bool _isDead; void Start() { if (_baseMaterial != null) { onHitReset(); } _isDead = false; } #region IActor implementation public virtual void attack() { } public virtual void hit(int damage) { if (_isDead) return; healthPoints -= damage; if (_baseMaterial != null) { StopCoroutine("onHit"); _timeLastingTimer = _timeLasting; StartCoroutine("onHit"); } if (healthPoints <= 0) { die(); } } public virtual void die() { if (_isDead) return; _isDead = true; destruct(); } public bool isDead { get { return _isDead; } set { _isDead = value; } } #endregion private IEnumerator onHit() { while (_timeLastingTimer >= 0f) { MeshRenderer[] meshRenders = gameObject.GetComponentsInChildren(); SkinnedMeshRenderer[] skinnedMeshRenders = gameObject.GetComponentsInChildren(); for (int i = 0 ; i < meshRenders.Length; i++) { meshRenders[i].sharedMaterial = ResourceManager.getInstance().matHit; } for (int i = 0 ; i < skinnedMeshRenders.Length; i++) { skinnedMeshRenders[i].sharedMaterial = ResourceManager.getInstance().matHit; } yield return new WaitForSeconds(_timeSwap); onHitReset(); yield return new WaitForSeconds(_timeSwap); _timeLastingTimer -= _timeSwap; } } private void onHitReset() { MeshRenderer[] meshRenders = gameObject.GetComponentsInChildren(); SkinnedMeshRenderer[] skinnedMeshRenders = gameObject.GetComponentsInChildren(); for (int i = 0 ; i < meshRenders.Length; i++) { meshRenders[i].sharedMaterial = _baseMaterial; } for (int i = 0 ; i < skinnedMeshRenders.Length; i++) { skinnedMeshRenders[i].sharedMaterial = _baseMaterial; } } } }