OldBlueWater/BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros/EarthquakeWave.cs

97 lines
3.3 KiB
C#

using System;
using System.Collections;
using BlueWaterProject;
using Sirenix.OdinInspector;
using UnityEngine;
// ReSharper disable once CheckNamespace
namespace RhinocerosSkill
{
public class EarthquakeWave : SkillBase
{
[Title("추가 옵션")]
[SerializeField] private bool isDrawingGizmo = true;
[SerializeField] private float width = 3f;
private Vector3 startPosition;
private Vector3 halfScale;
private RaycastHit[] hits;
private bool isUsingSkill;
private void OnDrawGizmos()
{
if (!isDrawingGizmo || !isUsingSkill) return;
Gizmos.color = Color.red;
var rotation = Quaternion.LookRotation(new Vector3(SkillInputData.PreviousDirection.x, 0, SkillInputData.PreviousDirection.z));
Gizmos.matrix = Matrix4x4.TRS(startPosition + SkillInputData.PreviousDirection * Range * 0.5f, rotation, Vector3.one);
Gizmos.DrawWireCube(Vector3.zero, new Vector3(halfScale.x * 2, halfScale.y * 2, Range));
Gizmos.matrix = Matrix4x4.identity;
}
public override void ActivateSkill(params Action[] actions)
{
ReadySkill = false;
CoolDown(Cooldown, () => ReadySkill = true);
StartCoroutine(SkillCoroutine(actions));
}
public override bool EnableSkill()
{
if (!ReadySkill) return false;
return true;
}
protected override void BasicSetting()
{
base.BasicSetting();
hits = new RaycastHit[5];
}
private IEnumerator SkillCoroutine(params Action[] actions)
{
isUsingSkill = true;
startPosition = SkillInputData.PlayerRb.position;
halfScale = transform.localScale * 0.5f;
transform.position = startPosition;
var angle = Mathf.Atan2(SkillInputData.PreviousDirection.x, SkillInputData.PreviousDirection.z) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0, angle, 0);
transform.localScale = new Vector3(width, 6f, Range * 2);
ShowIndicator();
var elapsedTime = 0f;
var fill = 1 / CastingTime;
while (elapsedTime < CastingTime)
{
elapsedTime += Time.deltaTime;
if (isUsingIndicator && indicator)
{
var fillValue = indicator.material.GetFloat(FillHash) + Time.deltaTime * fill;
indicator.material.SetFloat(FillHash, fillValue);
}
yield return null;
}
var maxSize = Physics.BoxCastNonAlloc(startPosition, halfScale, SkillInputData.PreviousDirection,
hits, Quaternion.identity, 0f, SkillInputData.TargetLayer, QueryTriggerInteraction.Ignore);
for (var i = 0; i < maxSize; i++)
{
var iDamageable = hits[i].transform.GetComponent<IDamageable>();
iDamageable?.TakeDamage(Damage);
}
HideIndicator();
actions[0].Invoke();
isUsingSkill = false;
}
}
}