[refact] 변수 정리 및 가독성 정리
- 안쓰는 유징문 제거 - 넉백과 슬로우 이펙트 프리팹 분리 - 데미지 이펙트 캐싱처리 - 패턴 실행 유틸리티 합침 Work in JIRA ISSUE DEG-100
This commit is contained in:
parent
64bccf2a3b
commit
2b0502775c
@ -1,9 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
|
||||||
using Unity.VisualScripting;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.AI;
|
|
||||||
using Random = UnityEngine.Random;
|
using Random = UnityEngine.Random;
|
||||||
|
|
||||||
public class CasterDemonController : EnemyController
|
public class CasterDemonController : EnemyController
|
||||||
@ -15,15 +12,12 @@ public class CasterDemonController : EnemyController
|
|||||||
public static readonly int Telepo = Animator.StringToHash("Telepo");
|
public static readonly int Telepo = Animator.StringToHash("Telepo");
|
||||||
public static readonly int Spin = Animator.StringToHash("Spin");
|
public static readonly int Spin = Animator.StringToHash("Spin");
|
||||||
|
|
||||||
private bool _doneBattleSequence = true;
|
|
||||||
|
|
||||||
private Coroutine _currentSequence;
|
|
||||||
|
|
||||||
[SerializeField] private Transform teleportTransform;
|
[SerializeField] private Transform teleportTransform;
|
||||||
[SerializeField] private Transform bulletShotPosition;
|
[SerializeField] private Transform bulletShotPosition;
|
||||||
[SerializeField] private GameObject magicMissilePrefab;
|
[SerializeField] private GameObject magicMissilePrefab;
|
||||||
[SerializeField] private GameObject teleportEffectPrefab;
|
[SerializeField] private GameObject teleportEffectPrefab;
|
||||||
[SerializeField] private Vector3 teleportTargetPosition = Vector3.zero;
|
[SerializeField] private Vector3 teleportTargetPosition = Vector3.zero;
|
||||||
|
|
||||||
[Header("각종 데미지 이펙트 세트")]
|
[Header("각종 데미지 이펙트 세트")]
|
||||||
[SerializeField] private GameObject chariotWarning;
|
[SerializeField] private GameObject chariotWarning;
|
||||||
[SerializeField] private GameObject chariotEffect;
|
[SerializeField] private GameObject chariotEffect;
|
||||||
@ -31,6 +25,9 @@ public class CasterDemonController : EnemyController
|
|||||||
[Space(10)]
|
[Space(10)]
|
||||||
[SerializeField] private GameObject slowFieldWarning;
|
[SerializeField] private GameObject slowFieldWarning;
|
||||||
[SerializeField] private GameObject slowFieldEffect;
|
[SerializeField] private GameObject slowFieldEffect;
|
||||||
|
[SerializeField] private GameObject knockbackEffect;
|
||||||
|
private float _knockbackTimer = 10f;
|
||||||
|
private const float KnockBackThresholdTime = 10f;
|
||||||
|
|
||||||
// 텔레포트 쿨타임 처음엔 빨리 사용 가능함
|
// 텔레포트 쿨타임 처음엔 빨리 사용 가능함
|
||||||
private float _teleportTimer = 10f;
|
private float _teleportTimer = 10f;
|
||||||
@ -40,16 +37,84 @@ public class CasterDemonController : EnemyController
|
|||||||
private float _tinkingTimer = 3f;
|
private float _tinkingTimer = 3f;
|
||||||
private float _thinkingThresholdTime = 3f;
|
private float _thinkingThresholdTime = 3f;
|
||||||
|
|
||||||
// 프로퍼티
|
private bool _doneBattleSequence = true;
|
||||||
|
private Coroutine _currentSequence;
|
||||||
|
|
||||||
|
|
||||||
|
private DamageEffectData? _knockbackData;
|
||||||
|
private DamageEffectData KnockbackData
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_knockbackData == null)
|
||||||
|
{
|
||||||
|
_knockbackData = new DamageEffectData
|
||||||
|
{
|
||||||
|
damage = 0,
|
||||||
|
radius = 7.5f,
|
||||||
|
delay = 0.5f,
|
||||||
|
targetLayer = TargetLayerMask,
|
||||||
|
explosionEffectPrefab = knockbackEffect
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return _knockbackData.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private DamageEffectData? _slowFieldEffectData;
|
||||||
|
private DamageEffectData SlowFieldEffectData
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_slowFieldEffectData == null)
|
||||||
|
{
|
||||||
|
_slowFieldEffectData = new DamageEffectData
|
||||||
|
{
|
||||||
|
damage = 0,
|
||||||
|
radius = 7.5f,
|
||||||
|
delay = 2.5f,
|
||||||
|
targetLayer = TargetLayerMask,
|
||||||
|
explosionEffectPrefab = slowFieldEffect
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return _slowFieldEffectData.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private DamageEffectData? _teleportEffectData;
|
||||||
|
private DamageEffectData TeleportEffectData
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_teleportEffectData == null)
|
||||||
|
{
|
||||||
|
_teleportEffectData = new DamageEffectData
|
||||||
|
{
|
||||||
|
damage = (int)attackPower,
|
||||||
|
radius = 10,
|
||||||
|
delay = 1.5f,
|
||||||
|
targetLayer = TargetLayerMask,
|
||||||
|
explosionEffectPrefab = chariotEffect
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return _teleportEffectData.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 특수 스킬 사용 가능 여부
|
||||||
|
private bool CanKnockback
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!(_knockbackTimer >= KnockBackThresholdTime)) return false;
|
||||||
|
_knockbackTimer = 0f;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
private bool CanTeleport {
|
private bool CanTeleport {
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (_teleportTimer >= TeleportThresholdTime )
|
if (!(_teleportTimer >= TeleportThresholdTime)) return false;
|
||||||
{
|
_teleportTimer = 0;
|
||||||
_teleportTimer = 0;
|
return true;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private bool CanBattleSequence
|
private bool CanBattleSequence
|
||||||
@ -70,6 +135,7 @@ public class CasterDemonController : EnemyController
|
|||||||
{
|
{
|
||||||
_teleportTimer += Time.deltaTime;
|
_teleportTimer += Time.deltaTime;
|
||||||
_tinkingTimer += Time.deltaTime;
|
_tinkingTimer += Time.deltaTime;
|
||||||
|
_knockbackTimer += Time.deltaTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void BattleSequence()
|
public override void BattleSequence()
|
||||||
@ -96,14 +162,14 @@ public class CasterDemonController : EnemyController
|
|||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
case 4:
|
case 4:
|
||||||
SetSequence(RunPattern(ShotMagicMissile));
|
SetSequence(ShotMagicMissile);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
case 6:
|
case 6:
|
||||||
case 7:
|
case 7:
|
||||||
case 8:
|
case 8:
|
||||||
case 9:
|
case 9:
|
||||||
SetSequence(RunPattern(SlowFieldSpell));
|
SetSequence(SlowFieldSpell);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,7 +183,10 @@ public class CasterDemonController : EnemyController
|
|||||||
Teleport();
|
Teleport();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SetSequence(RunPattern(KnockbackSpell));
|
if (CanKnockback)
|
||||||
|
{
|
||||||
|
SetSequence(KnockbackSpell);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerator ShotMagicMissile()
|
private IEnumerator ShotMagicMissile()
|
||||||
@ -176,23 +245,16 @@ public class CasterDemonController : EnemyController
|
|||||||
// 텔레포트와 함께 시전하는 범위 공격
|
// 텔레포트와 함께 시전하는 범위 공격
|
||||||
var aoe = Instantiate(chariotWarning, startPos, Quaternion.identity).GetComponent<ChariotAoeController>();
|
var aoe = Instantiate(chariotWarning, startPos, Quaternion.identity).GetComponent<ChariotAoeController>();
|
||||||
|
|
||||||
var effectData = new DamageEffectData
|
|
||||||
{
|
|
||||||
damage = (int)attackPower,
|
|
||||||
radius = 10,
|
|
||||||
delay = 1.5f,
|
|
||||||
targetLayer = TargetLayerMask,
|
|
||||||
explosionEffectPrefab = chariotEffect
|
|
||||||
};
|
|
||||||
|
|
||||||
aoe.SetEffect(effectData, null, null);
|
|
||||||
|
aoe.SetEffect(TeleportEffectData, null, null);
|
||||||
|
|
||||||
// 텔레포트 타겟 위치로 이동
|
// 텔레포트 타겟 위치로 이동
|
||||||
Agent.Warp(teleportTargetPosition);
|
Agent.Warp(teleportTargetPosition);
|
||||||
SetAnimation(Telepo);
|
SetAnimation(Telepo);
|
||||||
|
|
||||||
if (teleportEffectPrefab != null)
|
if (teleportEffectPrefab != null)
|
||||||
Instantiate(teleportEffectPrefab, Vector3.zero, Quaternion.identity);
|
Instantiate(teleportEffectPrefab, teleportTargetPosition, Quaternion.identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerator SlowFieldSpell()
|
private IEnumerator SlowFieldSpell()
|
||||||
@ -201,21 +263,12 @@ public class CasterDemonController : EnemyController
|
|||||||
// 1. 시전 애니메이션
|
// 1. 시전 애니메이션
|
||||||
transform.LookAt(aimPosition);
|
transform.LookAt(aimPosition);
|
||||||
SetAnimation(Cast);
|
SetAnimation(Cast);
|
||||||
|
|
||||||
// 2. 장판 생성과 세팅
|
// 2. 장판 생성과 세팅
|
||||||
|
|
||||||
var effectData = new DamageEffectData
|
|
||||||
{
|
|
||||||
damage = 0,
|
|
||||||
radius = 7.5f,
|
|
||||||
delay = 2.5f,
|
|
||||||
targetLayer = TargetLayerMask,
|
|
||||||
explosionEffectPrefab = slowFieldEffect
|
|
||||||
};
|
|
||||||
|
|
||||||
var fixedPos = new Vector3(aimPosition.x, 0, aimPosition.z);
|
var fixedPos = new Vector3(aimPosition.x, 0, aimPosition.z);
|
||||||
var warning = Instantiate(chariotWarning, fixedPos, Quaternion.identity).GetComponent<MagicAoEField>();
|
var warning = Instantiate(chariotWarning, fixedPos, Quaternion.identity).GetComponent<MagicAoEField>();
|
||||||
|
|
||||||
warning.SetEffect(effectData, null, null);
|
warning.SetEffect(SlowFieldEffectData, null, null);
|
||||||
|
|
||||||
// 3. 짧은 텀 후 끝내기
|
// 3. 짧은 텀 후 끝내기
|
||||||
yield return Wait.For(1f);
|
yield return Wait.For(1f);
|
||||||
@ -226,29 +279,20 @@ public class CasterDemonController : EnemyController
|
|||||||
// 시전 애니메이션
|
// 시전 애니메이션
|
||||||
SetAnimation(Spin);
|
SetAnimation(Spin);
|
||||||
|
|
||||||
var effectData = new DamageEffectData
|
|
||||||
{
|
|
||||||
damage = 0,
|
|
||||||
radius = 7.5f,
|
|
||||||
delay = 0.5f,
|
|
||||||
targetLayer = TargetLayerMask,
|
|
||||||
explosionEffectPrefab = slowFieldEffect
|
|
||||||
};
|
|
||||||
|
|
||||||
// 넉백 발생
|
// 넉백 발생
|
||||||
var knockback = Instantiate(chariotWarning, transform).GetComponent<MagicAoEField>();
|
var knockback = Instantiate(chariotWarning, transform).GetComponent<MagicAoEField>();
|
||||||
knockback.SetEffect(effectData, null, null, DebuffType.Knockback.ToString());
|
knockback.SetEffect(KnockbackData, null, null, DebuffType.Knockback.ToString());
|
||||||
|
|
||||||
yield return Wait.For(1f);
|
yield return Wait.For(1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetSequence(IEnumerator newSequence)
|
#region 유틸리티
|
||||||
|
private void SetSequence(Func<IEnumerator> newSequence)
|
||||||
{
|
{
|
||||||
if (_currentSequence != null)
|
if (_currentSequence != null)
|
||||||
{
|
|
||||||
StopCoroutine(_currentSequence);
|
StopCoroutine(_currentSequence);
|
||||||
}
|
|
||||||
_currentSequence = StartCoroutine(newSequence);
|
_currentSequence = StartCoroutine(RunPattern(newSequence));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerator RunPattern(Func<IEnumerator> pattern)
|
private IEnumerator RunPattern(Func<IEnumerator> pattern)
|
||||||
@ -256,4 +300,5 @@ public class CasterDemonController : EnemyController
|
|||||||
yield return StartCoroutine(pattern());
|
yield return StartCoroutine(pattern());
|
||||||
_doneBattleSequence = true;
|
_doneBattleSequence = true;
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user