IEnumerator Move2Position(BaseCharacter owner, AbilityInfo info, Vector3 position) { owner.OrderPosition = position; if (owner.Order == order) { yield break; } owner.Order = order; float distance = Vector2.Distance(owner.Position, owner.OrderPosition); while (owner.Radius < distance) { if (owner.Order != order) { break; } Vector3 dir = owner.OrderPosition - owner.Position; owner.SetAction(Move, dir); distance = Vector2.Distance(owner.Position, owner.OrderPosition); yield return(new WaitForFixedUpdate()); } info.isUse = false; if (owner.Order == order || owner.Order == AbilityOrder.Idle) { owner.Order = AbilityOrder.Idle; owner.AddAnim( ); } }
IEnumerator Spell(BaseCharacter owner, AbilityInfo info, Vector3 position) { owner.Audio.play(LoadManager.Instance.GetSFXData(SFXType.BossSkill).clip, 1F, 0F, 1F); owner.caster.abilityCast = true; info.isUse = true; owner.Order = order; owner.SetAnim( ); owner.Anim_Event = false; while (owner.Anim_Event == false) { if (owner.Order != order || owner.IsDeath) { break; } yield return(null); } int cnt = info.amount[0]; LayerMask layerMask = GameLayerHelper.Layer(GameLayer.Actor); var col = new Collider2D[MAX_COUNT]; var actors = Physics2D.OverlapCircleNonAlloc(position, Range, col, layerMask); List <BaseCharacter> targets = new List <BaseCharacter> ( ); for (int i = 0; i < actors; ++i) { BaseCharacter character = col[i].GetComponentInParent <BaseCharacter> ( ); if (character == null || character.Equals(owner) || owner.Owner.IsAlliance(character.Owner) || character.IsDeath) { continue; } targets.Insert(Random.Range(0, targets.Count + 1), character); } GameObject vfx = LoadManager.Instance.GetVFX(VFXType.BossSkill); foreach (var t in targets) { Instantiate(vfx, t.Position, Quaternion.identity); DamageCalculator.DamageInfo damageInfo = new DamageCalculator.DamageInfo(DamageCalculator.DamageType.Magic); damageInfo.damage = 99999999; owner.damageCalculator.Damaged(t, damageInfo); if (--cnt == 0) { break; } } if (owner.Order == order || owner.Order == AbilityOrder.Idle) { owner.Order = AbilityOrder.Idle; owner.AddAnim( ); } info.isUse = false; owner.caster.abilityCast = false; }
IEnumerator Attack(BaseCharacter owner, AbilityInfo info, IActor target) { BaseCharacter targetCharacter = target as BaseCharacter; info.cooltime = owner.status.Get(ActorStatus.AtkCoolTime, true, true, true); owner.Order = order; owner.SetAnim( ); owner.OnAttack(targetCharacter); owner.Anim_Event = false; while (owner.Anim_Event == false) { if (owner.Order != order || owner.IsDeath) { break; } yield return(null); } if (targetCharacter == null || targetCharacter.IsDeath) { owner.StartCoroutine(info.UpdateCoolTime( )); yield break; } Vector2 forward = new Vector3(owner.Forward, 0F); float delta = Mathf.Cos(90F * Mathf.Deg2Rad); Vector2 dir = targetCharacter.Center - owner.Center; float dot = Vector2.Dot(forward, dir.normalized); if (dot > delta) { DamageCalculator.DamageInfo damageInfo = new DamageCalculator.DamageInfo(DamageCalculator.DamageType.Normal); damageInfo.damage = (int)owner.status.Get(ActorStatus.Atk, true, true, true); owner.damageCalculator.Damaged(targetCharacter, damageInfo); } if (owner.Order == order || owner.Order == AbilityOrder.Idle) { owner.Order = AbilityOrder.Idle; owner.AddAnim( ); } owner.StartCoroutine(info.UpdateCoolTime( )); }