using UnityEngine; using Gyvr.Mythril2D; using System.Collections; using System.Collections.Generic; public class Fire : MonoBehaviour { [SerializeField] private int m_damageAmount = 1; [SerializeField] private EDamageType m_damageType = EDamageType.Physical; [SerializeField] private float m_damageInterval = 1.0f; // Time in seconds between each damage application private HashSet m_collidersInTrigger = new HashSet(); // Track colliders in trigger private Coroutine m_damageCoroutine; private void OnTriggerEnter2D(Collider2D other) { var character = other.gameObject.GetComponent(); if (character != null) { m_collidersInTrigger.Add(other); // Start the damage coroutine if it's not already running if (m_damageCoroutine == null) { m_damageCoroutine = StartCoroutine(ApplyDamage()); } } } private void OnTriggerExit2D(Collider2D other) { var character = other.gameObject.GetComponent(); if (character != null) { m_collidersInTrigger.Remove(other); // Stop the coroutine if no colliders are left in the trigger if (m_collidersInTrigger.Count == 0) { if (m_damageCoroutine != null) { StopCoroutine(m_damageCoroutine); m_damageCoroutine = null; } } } } private IEnumerator ApplyDamage() { while (true) { foreach (var collider in m_collidersInTrigger) { var character = collider.gameObject.GetComponent(); if (character != null) { character.Damage(new DamageOutputDescriptor { source = EDamageSource.Unknown, attacker = this, damage = m_damageAmount, type = m_damageType, flags = EDamageFlag.None }); } } yield return new WaitForSeconds(m_damageInterval); } } }