OldBlueWater/BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros/EarthquakeWave.cs
NTG 5f99f52b4b #165 전투 플레이어 및 보스 보완 작업
+ 전투 플레이어도 피격시 FlashWhite 기능이 추가되었습니다.
+ 전투 플레이어의 기본 속도 10 -> 7로 변경했습니다.

+ 보스 및 잡몹의 Collider를 통과할 수 있게 변경했습니다.
+ 보스의 스킬에 피격되면 튕겨내는 기능을 추가했습니다.
+ 코뿔소 스킬(EarthquakeWave)가 표시하는 것과 다르게 공격하는 오류를 수정했습니다.
2024-02-19 08:27:10 +09:00

104 lines
3.5 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;
Gizmos.matrix = Matrix4x4.TRS(startPosition, transform.rotation, Vector3.one);
Gizmos.DrawWireCube(Vector3.zero, halfScale * 2f);
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;
transform.position = SkillInputData.PlayerRb.position;
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);
var myLocalScale = transform.localScale;
halfScale = new Vector3(myLocalScale.x * 0.5f, myLocalScale.y * 0.5f, myLocalScale.z * 0.25f);
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;
}
startPosition = transform.position + transform.forward * halfScale.z;
var maxSize = Physics.BoxCastNonAlloc(startPosition, halfScale, transform.forward,
hits, transform.rotation, 0f, SkillInputData.TargetLayer, QueryTriggerInteraction.Ignore);
for (var i = 0; i < maxSize; i++)
{
var iDamageable = hits[i].transform.GetComponent<IDamageable>();
iDamageable?.TakeDamage(Damage);
var iCombatable = hits[i].transform.GetComponent<ICombatable>();
if (iCombatable != null)
{
iCombatable.DisableMove(0.2f);
iCombatable.AddForceToDirection(transform.forward, 10f);
}
}
HideIndicator();
actions[0].Invoke();
isUsingSkill = false;
}
}
}