Super Knight : Enter the Dungeon
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
7.0 KiB

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<Character>();
renderer = character.skeletonAnimation.GetComponent<MeshRenderer>();
}
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<Data> activates = new List<Data>();
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<HitCheck>();
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<HitCheck>();
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);
}
}