99 lines
3.1 KiB
C#
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)
|
|
{
|
|
health -= damage;
|
|
StartCoroutine(DamageAnimation());
|
|
if (health <= 0)
|
|
{
|
|
OnKillEffects();
|
|
}
|
|
Debug.Log($"{name} took {damage} damage");
|
|
}
|
|
|
|
public void Heal(float healing)
|
|
{
|
|
health += healing;
|
|
health = Mathf.Clamp(health, 0, maxHealth);
|
|
}
|
|
|
|
protected virtual void OnKillEffects()
|
|
{
|
|
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|