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
211 lines
7.0 KiB
3 years ago
|
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);
|
||
|
}
|
||
|
}
|