142 lines
5.3 KiB
C#
142 lines
5.3 KiB
C#
using System;
|
|
using System.Collections;
|
|
using BlueWaterProject;
|
|
using Sirenix.OdinInspector;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering.Universal;
|
|
|
|
// ReSharper disable once CheckNamespace
|
|
namespace RhinocerosSkill
|
|
{
|
|
public class HammerSwing : SkillBase
|
|
{
|
|
[Title("추가 옵션")]
|
|
[SerializeField] private bool isDrawingGizmo = true;
|
|
[SerializeField] private float angle = 180f;
|
|
|
|
[Title("발사체 옵션")]
|
|
[SerializeField] private GameObject projectilePrefab;
|
|
[SerializeField] private int projectileNumber = 5;
|
|
[SerializeField] private float projectileDamage = 10f;
|
|
[SerializeField] private float projectileAngle = 90f;
|
|
[SerializeField] private float projectileSpeed = 500f;
|
|
|
|
private Collider[] hitColliders;
|
|
private bool isUsingSkill;
|
|
|
|
private void OnDrawGizmos()
|
|
{
|
|
if (!isDrawingGizmo || !isUsingSkill) return;
|
|
|
|
Gizmos.color = Color.red;
|
|
var skillPosition = transform.position;
|
|
Gizmos.DrawWireSphere(skillPosition, Range);
|
|
|
|
if (SkillInputData != null && SkillInputData.TargetCollider != null)
|
|
{
|
|
var skillPlayerPosition = SkillInputData.PlayerRb.position;
|
|
var forward = transform.forward;
|
|
var leftBoundary = Quaternion.Euler(0, -angle / 2, 0) * forward;
|
|
var rightBoundary = Quaternion.Euler(0, angle / 2, 0) * forward;
|
|
|
|
Gizmos.color = Color.yellow;
|
|
Gizmos.DrawLine(skillPlayerPosition, skillPlayerPosition + leftBoundary * Range);
|
|
Gizmos.DrawLine(skillPlayerPosition, skillPlayerPosition + rightBoundary * Range);
|
|
}
|
|
}
|
|
|
|
public override void ActivateSkill(params Action[] actions)
|
|
{
|
|
ReadySkill = false;
|
|
SkillInputData.PlayerAnimator.SetTrigger("isHammerSwing");
|
|
CoolDown(Cooldown, () => ReadySkill = true);
|
|
StartCoroutine(SkillCoroutine(actions));
|
|
}
|
|
|
|
public override bool EnableSkill()
|
|
{
|
|
if (!ReadySkill) return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
protected override void BasicSetting()
|
|
{
|
|
if (isUsingIndicator && indicator)
|
|
{
|
|
indicator.scaleMode = DecalScaleMode.InheritFromHierarchy;
|
|
indicator.material = new Material(indicator.material);
|
|
indicator.material.SetFloat(FillHash, 0f);
|
|
indicator.material.SetFloat("Angle", angle);
|
|
}
|
|
|
|
hitColliders = new Collider[5];
|
|
}
|
|
|
|
private IEnumerator SkillCoroutine(params Action[] actions)
|
|
{
|
|
while (!SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).IsName("HammerSwing"))
|
|
{
|
|
yield return null;
|
|
}
|
|
|
|
isUsingSkill = true;
|
|
var skillPlayerPosition = SkillInputData.PlayerRb.position;
|
|
var targetPosition = SkillInputData.TargetCollider.transform.position;
|
|
var targetToDirection = (targetPosition - skillPlayerPosition).normalized;
|
|
transform.position = skillPlayerPosition;
|
|
var yAngle = Mathf.Atan2(targetToDirection.x, targetToDirection.z) * Mathf.Rad2Deg;
|
|
transform.rotation = Quaternion.Euler(0, yAngle, 0);
|
|
transform.localScale = Vector3.one * (Range * 2);
|
|
|
|
actions[1].Invoke();
|
|
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.OverlapSphereNonAlloc(transform.position, Range, hitColliders, SkillInputData.TargetLayer);
|
|
for (var i = 0; i < maxSize; i++)
|
|
{
|
|
var angleToTarget = Vector3.Angle(skillPlayerPosition, transform.forward);
|
|
|
|
if (angleToTarget <= angle * 0.5f)
|
|
{
|
|
var iDamageable = hitColliders[i].GetComponent<IDamageable>();
|
|
iDamageable?.TakeDamage(Damage);
|
|
}
|
|
}
|
|
|
|
HideIndicator();
|
|
|
|
var startAngle = yAngle - projectileAngle * 0.5f;
|
|
var angleStep = projectileAngle / (projectileNumber - 1);
|
|
|
|
for (var i = 0; i < projectileNumber; i++)
|
|
{
|
|
var currentAngle = startAngle + angleStep * i;
|
|
var rotation = Quaternion.Euler(0, currentAngle, 0);
|
|
var projectile = Instantiate(projectilePrefab, transform.position + Vector3.up, rotation);
|
|
var particleWeapon = projectile.GetComponent<ParticleWeapon>();
|
|
particleWeapon.SetPower(projectileDamage);
|
|
particleWeapon.Rb.AddForce(particleWeapon.transform.forward * projectileSpeed);
|
|
}
|
|
|
|
actions[0].Invoke();
|
|
|
|
isUsingSkill = false;
|
|
}
|
|
}
|
|
} |