using System; using System.Collections; using UnityEngine; public class Entity : MonoBehaviour { [Header("Health")] public float health; public float maxHealth; [Header("Movement")] public int maxMovement; public TileObject currentTile; [SerializeField] private float moveAnimSpeed; [Header("Flags")] public bool canMove = true; public bool invincible; [Header("Animation (assume sprites face right)")] private bool isFacingRight; [SerializeField] private SpriteRenderer[] spriteRenderers; [SerializeField] private float damageColorChangeSpeed; public virtual void TakeDamage(float damage, Entity attacker) { health -= damage; StartCoroutine(DamageAnimation()); if (health <= 0) { OnKillEffects(attacker); } Debug.Log($"{name} took {damage} damage"); } public void Heal(float healing) { health += healing; health = Mathf.Clamp(health, 0, maxHealth); } protected virtual void OnKillEffects(Entity attacker) { } protected virtual void FinishedMovement() { currentTile.hasUnit = this; } public virtual IEnumerator MoveToLocation(TileObject[] pathToMove) { float currentState = 0; int currentTileList = 0; while (currentTileList < pathToMove.Length) { currentState += Time.deltaTime * moveAnimSpeed; transform.position = Vector2.Lerp(currentTile.transform.position, pathToMove[currentTileList].transform.position, currentState); if (currentState > 1) { currentTile = pathToMove[currentTileList]; currentState = 0; currentTileList++; if (currentTileList < pathToMove.Length) { float dotProduct = Vector3.Dot((pathToMove[currentTileList].transform.position - currentTile.transform.position), Vector3.right); if (dotProduct < 0 && !isFacingRight || dotProduct > 0 && isFacingRight) { isFacingRight = !isFacingRight; foreach (SpriteRenderer spriteRenderer in spriteRenderers) { spriteRenderer.gameObject.transform.eulerAngles = new Vector3(0, 0, -spriteRenderer.gameObject.transform.eulerAngles.z); spriteRenderer.flipX = !spriteRenderer.flipX; //quite the jank rotation code } } } } yield return null; } FinishedMovement(); } private IEnumerator DamageAnimation() { float currentState = 0; while (currentState < 1) { currentState += Time.deltaTime * damageColorChangeSpeed; foreach (SpriteRenderer spritepart in spriteRenderers) { if (spritepart) { spritepart.color = Color.Lerp(Color.gray, Color.white, currentState); } } yield return null; } } }