LunarInfantry/Assets/Scripts/Entity.cs
2026-01-20 01:52:57 -08:00

99 lines
3.1 KiB
C#

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;
}
}
}