CapersProject/Assets/02.Scripts/Skill/Enemy/Boss/Rhinoceros/SeismicThrust.cs
Nam Tae Gun 7fb0da5888 #25, #26 아이템 직접 획득 방식 추가 및 선형적인 맵 구조 변경
+ Item관련 Excel, Json, So 수정
+ DropItemTable 로직 수정
+ 아이템 프리팹에서 Enable Interaction 체크하면 직접 룻팅, 해제하면 자동 룻팅
+ 체력회복 아이템 추가
+ 개발자 메뉴 상호작용 "F1" 키를 통해 접근 가능
+ 보스 맵은 마법진을 상호작용하면 보스전 시작
+ 맵 안에서 교전 중일 때, 투명 벽 쉐이더 추가
+ 맵 마다의 통로를 통해서 이동 가능
+ 선형적인 맵 구조에 맞게 리소스 및 위치 수정
+ 타이틀 화면으로 이동할 때 나타나는 오류 수정(CombatUiManager OnDisable 싱글톤 문제)

Closes #25, #26
2024-06-22 07:11:53 +09:00

133 lines
5.3 KiB
C#

using System;
using System.Collections;
using BlueWater.Interfaces;
using BlueWater.Utility;
using Sirenix.OdinInspector;
using UnityEngine;
namespace BlueWater.Enemies.Bosses.Rhinoceros.Skills
{
public class SeismicThrust : BaseSkill
{
[Title("추가 옵션")]
[SerializeField]
private bool _isDrawingGizmo = true;
private SeismicThrustData _seismicThrustData;
private Rhinoceros _rhinoceros;
private Collider _targetCollider;
private Transform _particleInstantiateLocation;
private GameObject _seismicThrustParticle;
private Vector3 _startPosition;
private Vector3 _halfScale;
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;
}
private void OnDestroy()
{
if (_seismicThrustParticle)
{
Destroy(gameObject);
}
}
protected override void BasicSetting()
{
if (!_rhinoceros)
{
_rhinoceros = SkillUser.GetComponent<Rhinoceros>();
_targetCollider = _rhinoceros.Target;
_particleInstantiateLocation = _rhinoceros.BossMapController.ParticleInstanceLocation;
}
_seismicThrustData = (SeismicThrustData)SkillData;
RaycastHits = new RaycastHit[4];
base.BasicSetting();
}
public override bool CanSkill()
{
if (!EnableSkill) return false;
var targetDistance = Vector3.Distance(SkillUser.transform.position,_targetCollider.transform.position);
return targetDistance <= SkillData.Radius;
}
public override void ActivateSkill(params Action[] actions)
{
Utils.StartUniqueCoroutine(this, ref SkillCoroutineInstance, SkillCoroutine(actions));
}
private IEnumerator SkillCoroutine(params Action[] actions)
{
EnableSkill = false;
IsUsingSkill = true;
transform.position = SkillUser.transform.position + Vector3.up * 3f;
var angle = Mathf.Atan2(_rhinoceros.CurrentDirection.x, _rhinoceros.CurrentDirection.z) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0, angle, 0);
transform.localScale = new Vector3(_seismicThrustData.HorizontalRange, 6f, SkillData.Radius * 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 / SkillData.CastingTime;
while (elapsedTime <= SkillData.CastingTime)
{
elapsedTime += Time.deltaTime;
if (IsUsingIndicator && Indicator)
{
var fillValue = Indicator.material.GetFloat(_fillHash) + Time.deltaTime * fill;
Indicator.material.SetFloat(_fillHash, fillValue);
}
yield return null;
}
_seismicThrustParticle = Instantiate(_seismicThrustData.SeismicThrustParticle,
SkillUser.transform.position + transform.forward * 4f, transform.rotation, _particleInstantiateLocation);
_startPosition = SkillUser.transform.position + transform.forward * _halfScale.z;
var maxSize = Physics.BoxCastNonAlloc(_startPosition, _halfScale, transform.forward,
RaycastHits, transform.rotation, 0f, _seismicThrustData.TargetLayer, QueryTriggerInteraction.Collide);
for (var i = 0; i < maxSize; i++)
{
var raycastHit = RaycastHits[i];
var iDamageable = raycastHit.transform.GetComponentInParent<IDamageable>();
if (iDamageable == null || !iDamageable.CanDamage()) continue;
iDamageable.TakeDamage(SkillData.Damage);
var iStunnable = raycastHit.transform.GetComponentInParent<IStunnable>();
iStunnable?.Stun(_seismicThrustData.StunDuration);
var iSlowable = raycastHit.transform.GetComponentInParent<ISlowable>();
iSlowable?.SlowMoveSpeed(_seismicThrustData.SlowDuration, _seismicThrustData.SlowCoefficient);
var iPhysicMovable = raycastHit.transform.GetComponentInParent<IPhysicMovable>();
iPhysicMovable?.AddForce(transform.forward * _seismicThrustData.PushPower, ForceMode.Impulse);
}
HideIndicator();
EndSkill(SkillData.Cooldown, actions[0]);
}
private void EndSkill(float cooldown, Action action)
{
Utils.EndUniqueCoroutine(this, ref SkillCoroutineInstance);
action?.Invoke();
Utils.StartUniqueCoroutine(this, ref CooldownCoroutineInstance,Utils.CoolDownCoroutine(cooldown, EndCooldown));
}
}
}