protected override IEnumerator Run(MainSystem sys) { // 攻撃キャラを、ターゲットとの中間に移動させる(攻撃アニメーションの代替) var src = Actor.Position; var dst = src; dst.x = (src.x + _target.Position.x) / 2; dst.y = (src.y + _target.Position.y) / 2; Actor.Position = dst; // ターゲットの方を向く Actor.ChangeDir(Actor.Loc.Toward(_target.Loc)); _target.HideDirection(); // ターゲットは攻撃者の方を向く。ただし以下の場合は振り向かない // - 目の前に敵が存在する // - 攻撃者が透明状態 if (!sys.ExistsEnemy(_target.Front()) && !Actor.IsInvisible()) { _target.ChangeDir(_target.Loc.Toward(Actor.Loc)); } _target.RemoveStatus(StatusType.Sleep); var dmg = 16 + new System.Random().Next(30); yield return(Anim.Par(sys, () => _target.DamageAnim(dmg), () => EffectAnim.PopupWhiteDigits(_target, dmg))); _target.DamageHp(dmg); Actor.Position = src; }
public override IEnumerator Use(CharacterBase sender, MainSystem sys) { var src = sender.Position; float duration = 0.5f; float elapsed = 0; while (elapsed <= duration) { float y = UTween.Ease(EaseType.InCubic, src.y, src.y + 6, elapsed / duration); sender.Position = new Vector3(src.x, y, 0); elapsed += Time.deltaTime; yield return(null); } yield return(new WaitForSeconds(0.36f)); var loc = sys.Warp(sender.Loc, true); sender.Position = loc.ToPosition(); sender.ChangeDir(Dir.S); sender.UpdateLoc(loc); yield return(new WaitForSeconds(0.4f)); }