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.
210 lines
7.0 KiB
210 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); |
|
} |
|
}
|
|
|