using System.Collections; using System.Collections.Generic; using UnityEngine; public class StatusEffect : MonoBehaviour { [System.Serializable] public class Data { public SkillData skill; public GameObject effect; [Space(10)] public float timeSum = 0; public float duration = 0; public Data(SkillData skill, GameObject effect, float duration) { this.skill = skill; this.effect = effect; this.duration = duration; } } Character character; void Awake() { character = GetComponent(); renderer = character.skeletonAnimation.GetComponent(); } public void OnInitialized() { for (int i = 0; i < activates.Count; i++) Deactivate(activates[i]); activates.Clear(); StopAllCoroutines(); character.STUN = false; } MeshRenderer renderer; EventManager.ObjectCreate objectCreate = new EventManager.ObjectCreate(); public List activates = new List(); public Data Check(string name) { return activates.Find(a => a.skill.work2.Equals(name)); } public bool Add(SkillData skill) { if (skill == null) return false; Data data = Check(skill.work2); if (data == null) { objectCreate.prefab = PrefabManager.Instance.PrefabGet($"Effect/StatusEffect {skill.work2}"); objectCreate.target = renderer.transform; objectCreate.scale = Vector3.one; objectCreate.pos = Vector3.zero; objectCreate.pos.y = renderer.bounds.size.y; EventManager.Instance.Invoke("PrefabCreateLocal", objectCreate); objectCreate.create.transform.localEulerAngles = new Vector3(90, 0, 0); StartCoroutine(Activating(new Data(skill, objectCreate.create, skill.duration))); return true; } else { data.duration += data.skill.duration;//이미 걸린 상태이상의 경우 지속시간 연장 } return false; } IEnumerator Activating(Data data) { activates.Add(data); Activate(data.skill); float timeRepeat = data.skill.timeRepeat == 0 ? 0.1f : data.skill.timeRepeat; WaitForSeconds wait = new WaitForSeconds(timeRepeat); while ((data.timeSum += timeRepeat) < data.duration) { yield return wait; if (0 < data.skill.timeRepeat) Activate(data.skill); if (character.DieCheck()) yield break; } activates.Remove(data); Deactivate(data); } public void Activate(SkillData skill) { switch (skill.work2) { case "Stun": { character.STUN = true; character.OnLocked(true); } break; case "Slow": { character.SpeedAttackChanged(skill.value, true); character.SpeedMoveChanged(skill.value); } break; case "Freeze": { } break; case "Ignition": { switch(character.iff) { case IFF.Our: { } break; case IFF.Enemy: { objectCreate.prefab = PrefabManager.Instance.PrefabGet($"Effect/StatusEffect {skill.work2} Activate"); objectCreate.target = renderer.transform; objectCreate.scale = Vector3.one; objectCreate.pos = Vector3.zero; objectCreate.pos.y = renderer.bounds.size.y / 2; EventManager.Instance.Invoke("PrefabCreateLocal", objectCreate); objectCreate.create.transform.SetParent(null); HitCheck hit = objectCreate.create.GetComponent(); hit.damageType = DamageType.RateHP; hit.damageValue = skill.value; hit.Initialized(character, LayerMask.NameToLayer($"Hit{character.iff}"), 20, null); } break; } } break; case "Poison": { switch (character.iff) { case IFF.Our: { } break; case IFF.Enemy: { float damage = character.HP * skill.value; character.Damage_Apply((int)damage, null, Vector3.zero, 0, true, null); objectCreate.prefab = PrefabManager.Instance.PrefabGet($"Effect/StatusEffect {skill.work2} Activate"); objectCreate.target = renderer.transform; objectCreate.scale = Vector3.one; objectCreate.pos = Vector3.zero; EventManager.Instance.Invoke("PrefabCreateLocal", objectCreate); objectCreate.create.transform.SetParent(null); objectCreate.create.transform.eulerAngles = Vector3.zero; Vector3 pos = objectCreate.create.transform.position; pos.y = 1; objectCreate.create.transform.position = pos; HitCheck hit = objectCreate.create.GetComponent(); hit.damageType = DamageType.RateHP; hit.damageValue = skill.value; hit.Initialized(character, LayerMask.NameToLayer($"HitAll"), 9999, null); } break; } } break; } } public void Deactivate(Data data) { switch (data.skill.work2) { case "Stun": { character.STUN = false; character.OnLocked(false); } break; case "Slow": { character.SpeedAttackChanged(-data.skill.value, true); character.SpeedMoveChanged(-data.skill.value); } break; case "Freeze": { } break; case "Ignition": { } break; } data.effect.gameObject.SetActive(false); } }