CapersProject/Assets/02.Scripts/Skill/Enemy/Boss/SandMole/MultiThrowSpikes.cs
Nam Tae Gun cc382747f0 #17 모래두더지 가시 연발 스킬(MultiThrowSpikes) 추가
+ ParticleWeapon class -> ProjectileController 변경
+ SandMole 스킬관련 Enum, 애니메이션 변경
+ 가시 연발 관련 Spike 파티클 추가
2024-06-15 05:36:32 +09:00

98 lines
4.0 KiB
C#

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<SandMole>();
_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<ProjectileController>();
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));
}
}
}