using System; using System.Collections; using BlueWater.Maps; using BlueWater.Utility; using UnityEngine; namespace BlueWater.Enemies.Bosses.SandMole.Skills { public class MultiThrowSpikes : BaseSkill { private MultiThrowSpikesData _multiThrowSpikesData; private SandMole _sandMole; private AnimationController _animationController; private Collider _targetCollider; private float _colliderRadius; private float _attackRadius; private Transform _particleInstantiateLocation; protected override void BasicSetting() { if (!_sandMole) { _sandMole = SkillUser.GetComponent(); _animationController = _sandMole.AnimationController; _targetCollider = _sandMole.Target; _particleInstantiateLocation = MapManager.Instance.SandMoleMapController.ParticleInstantiateLocation; } _multiThrowSpikesData = (MultiThrowSpikesData)SkillData; base.BasicSetting(); } public override void ActivateSkill(params Action[] actions) { Utils.StartUniqueCoroutine(this, ref SkillCoroutineInstance, SkillCoroutine(actions)); } private IEnumerator SkillCoroutine(params Action[] actions) { EnableSkill = false; _sandMole.StopMove(); _animationController.SetAnimationParameter("skillIndex", (int)SandMoleSkill.MultiThrowSpikes); var animationStarted = false; yield return StartCoroutine(_animationController.WaitForAnimationToRun("MultiThrowSpikes", success => animationStarted = success)); print("1"); if (!animationStarted || !SkillUser) { print("2"); EndSkill(0, actions[0]); yield break; } IsUsingSkill = true; _animationController.ResetAnimationSpeed(); var startPosition = SkillUser.transform.position; var waitForSeconds = new WaitForSeconds(_multiThrowSpikesData.SpikeInterval); for (var i = 0; i < _multiThrowSpikesData.SpikeCount; i++) { print("3"); if (!SkillUser || !_targetCollider) { print("4"); EndSkill(SkillData.Cooldown, actions[0]); yield break; } // 실시간으로 일정 간격으로 Target의 위치를 받아와서 방향을 맞춰서 발사한다. var targetCenterPosition = _targetCollider.bounds.center; startPosition.y = targetCenterPosition.y; var targetVector = targetCenterPosition - startPosition; var targetDirection = targetVector.normalized; _sandMole.CurrentDirection = targetDirection; var rotation = Quaternion.LookRotation(targetDirection); var projectile = Instantiate(_multiThrowSpikesData.SpikePrefab, startPosition, rotation, _particleInstantiateLocation).GetComponent(); projectile.Initialize(_multiThrowSpikesData.Damage, _multiThrowSpikesData.TargetLayer); projectile.AddForce(projectile.transform.forward * _multiThrowSpikesData.ProjectileSpeed, ForceMode.Impulse); yield return waitForSeconds; } EndSkill(SkillData.Cooldown, actions[0]); } private void EndSkill(float cooldown, Action action) { Utils.EndUniqueCoroutine(this, ref SkillCoroutineInstance); _animationController.SetAnimationParameter("skillIndex", (int)SandMoleSkill.None); action?.Invoke(); Utils.StartUniqueCoroutine(this, ref CooldownCoroutineInstance,Utils.CoolDownCoroutine(cooldown, EndCooldown)); } } }