From c0fde7a8d295e9976c2b03a798b8d4d58f8bc4b0 Mon Sep 17 00:00:00 2001 From: fiore Date: Tue, 22 Apr 2025 14:24:03 +0900 Subject: [PATCH] =?UTF-8?q?DEG-41=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80?= =?UTF-8?q?=20=EC=95=8A=EB=8A=94=20=ED=8C=A8=ED=84=B4=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Editor/EnemyControllerEditor.cs | 10 +-- Assets/JYY/Prefabs/AOEIndicatorChariot.prefab | 3 - Assets/JYY/Prefabs/AOEIndicatorDynamo.prefab | 4 +- .../JYY/Prefabs/AOEIndicatorHorizontal.prefab | 2 +- .../JYY/Prefabs/AOEIndicatorVertical.prefab | 2 +- .../JYY/Prefabs/AoE Indicator Chariot.prefab | 3 + ...meta => AoE Indicator Chariot.prefab.meta} | 2 +- .../JYY/Prefabs/AoE Slash Blue Chariot.prefab | 3 + .../AoE Slash Blue Chariot.prefab.meta | 7 ++ Assets/JYY/Prefabs/[Enemy] PldDog.prefab | 4 +- Assets/JYY/Scenes/MonsterTest.unity | 4 +- .../Character/Enemy/ChariotAoeController.cs | 81 ++++++++++++++++++ ...r.cs.meta => ChariotAoeController.cs.meta} | 0 .../Enemy/EnemyAnimatorStateAttack.cs | 14 ---- .../Enemy/EnemyAnimatorStateAttack.cs.meta | 11 --- .../Character/Enemy/EnemyAttackController.cs | 42 ---------- .../Character/Enemy/EnemyController.cs | 44 ++++++---- .../Character/Enemy/EnemyDemageField.cs | 7 -- .../Character/Enemy/EnemyDemageField.cs.meta | 3 - .../Enemy/EnemyState/EnemyStateAttack.cs | 53 +++++------- .../Enemy/EnemyState/EnemyStateDead.cs | 1 + .../Enemy/EnemyState/EnemyStateGetHit.cs | 19 ----- .../Enemy/EnemyState/EnemyStateGetHit.cs.meta | 3 - .../Enemy/EnemyState/EnemyStateIdle.cs | 6 +- .../Enemy/EnemyState/EnemyStateMove.cs | 19 ----- .../Enemy/EnemyState/EnemyStateMove.cs.meta | 3 - .../Enemy/EnemyState/EnemyStateTrace.cs | 1 + .../Character/Enemy/PldDogController.cs | 83 +++++++++++++++++++ 28 files changed, 243 insertions(+), 191 deletions(-) delete mode 100644 Assets/JYY/Prefabs/AOEIndicatorChariot.prefab create mode 100644 Assets/JYY/Prefabs/AoE Indicator Chariot.prefab rename Assets/JYY/Prefabs/{AOEIndicatorChariot.prefab.meta => AoE Indicator Chariot.prefab.meta} (74%) create mode 100644 Assets/JYY/Prefabs/AoE Slash Blue Chariot.prefab create mode 100644 Assets/JYY/Prefabs/AoE Slash Blue Chariot.prefab.meta create mode 100644 Assets/Scripts/Character/Enemy/ChariotAoeController.cs rename Assets/Scripts/Character/Enemy/{EnemyAttackController.cs.meta => ChariotAoeController.cs.meta} (100%) delete mode 100644 Assets/Scripts/Character/Enemy/EnemyAnimatorStateAttack.cs delete mode 100644 Assets/Scripts/Character/Enemy/EnemyAnimatorStateAttack.cs.meta delete mode 100644 Assets/Scripts/Character/Enemy/EnemyAttackController.cs delete mode 100644 Assets/Scripts/Character/Enemy/EnemyDemageField.cs delete mode 100644 Assets/Scripts/Character/Enemy/EnemyDemageField.cs.meta delete mode 100644 Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs delete mode 100644 Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs.meta delete mode 100644 Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs delete mode 100644 Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs.meta diff --git a/Assets/Editor/EnemyControllerEditor.cs b/Assets/Editor/EnemyControllerEditor.cs index 23ac07cc..82dc98de 100644 --- a/Assets/Editor/EnemyControllerEditor.cs +++ b/Assets/Editor/EnemyControllerEditor.cs @@ -30,12 +30,6 @@ public class EnemyControllerEditor : Editor case EnemyState.Attack: GUI.backgroundColor = new Color(1, 1, 0, 1f); break; - case EnemyState.Move: - GUI.backgroundColor = new Color(0, 1, 1, 1f); - break; - case EnemyState.GetHit: - GUI.backgroundColor = new Color(0.1f, 0.1f, 0.1f, 1f); - break; case EnemyState.Dead: GUI.backgroundColor = new Color(1, 0, 0, 1f); break; @@ -55,12 +49,10 @@ public class EnemyControllerEditor : Editor EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Idle")) enemyController.SetState(EnemyState.Idle); if (GUILayout.Button("Trace")) enemyController.SetState(EnemyState.Trace); - if (GUILayout.Button("Attack")) enemyController.SetState(EnemyState.Attack); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); - if (GUILayout.Button("Move")) enemyController.SetState(EnemyState.Move); - if (GUILayout.Button("GetHit")) enemyController.SetState(EnemyState.GetHit); + if (GUILayout.Button("Attack")) enemyController.SetState(EnemyState.Attack); if (GUILayout.Button("Dead")) enemyController.SetState(EnemyState.Dead); EditorGUILayout.EndHorizontal(); } diff --git a/Assets/JYY/Prefabs/AOEIndicatorChariot.prefab b/Assets/JYY/Prefabs/AOEIndicatorChariot.prefab deleted file mode 100644 index 6991ab32..00000000 --- a/Assets/JYY/Prefabs/AOEIndicatorChariot.prefab +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4487834d50c67ef719d45ea081a895bebc943de247d782072226e7c6b7dc6d5a -size 4703 diff --git a/Assets/JYY/Prefabs/AOEIndicatorDynamo.prefab b/Assets/JYY/Prefabs/AOEIndicatorDynamo.prefab index 72d92b28..10a01d7f 100644 --- a/Assets/JYY/Prefabs/AOEIndicatorDynamo.prefab +++ b/Assets/JYY/Prefabs/AOEIndicatorDynamo.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bf0fd0659c187d35c8492ff925145c94fc5cac08dead6b13188f3f4cbb2f3052 -size 3988 +oid sha256:5fd0a892305c7a4c4e18543cf88703c940210e639e0a0a94aba30f0fe7fb4a2d +size 3986 diff --git a/Assets/JYY/Prefabs/AOEIndicatorHorizontal.prefab b/Assets/JYY/Prefabs/AOEIndicatorHorizontal.prefab index d6ba9554..2617bea6 100644 --- a/Assets/JYY/Prefabs/AOEIndicatorHorizontal.prefab +++ b/Assets/JYY/Prefabs/AOEIndicatorHorizontal.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e5dfaa59aeffa4e948edd40e96f05e2c708e491bb80c2a3446d9d1335b05adf0 +oid sha256:a8dcf363afeb774bbc49dde7a349e233c2ff8531d33694113013455fc7a4c7ca size 3995 diff --git a/Assets/JYY/Prefabs/AOEIndicatorVertical.prefab b/Assets/JYY/Prefabs/AOEIndicatorVertical.prefab index 28217b13..7acabcd4 100644 --- a/Assets/JYY/Prefabs/AOEIndicatorVertical.prefab +++ b/Assets/JYY/Prefabs/AOEIndicatorVertical.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:02ada0ed142206f604609397dd5b6a2349df7db879e9ab1cb7bdfc1fca8e6f75 +oid sha256:e8da3f157ed92e5524a0fb90cbd4335a8b757a2ef2889f00ae2e66bd704017e6 size 3985 diff --git a/Assets/JYY/Prefabs/AoE Indicator Chariot.prefab b/Assets/JYY/Prefabs/AoE Indicator Chariot.prefab new file mode 100644 index 00000000..36214cb6 --- /dev/null +++ b/Assets/JYY/Prefabs/AoE Indicator Chariot.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acaadac3ed9caf040e05fc0f05648346d053813c3be9a3062dd7eeed0a8730b6 +size 4760 diff --git a/Assets/JYY/Prefabs/AOEIndicatorChariot.prefab.meta b/Assets/JYY/Prefabs/AoE Indicator Chariot.prefab.meta similarity index 74% rename from Assets/JYY/Prefabs/AOEIndicatorChariot.prefab.meta rename to Assets/JYY/Prefabs/AoE Indicator Chariot.prefab.meta index 1d15c4e7..0035b785 100644 --- a/Assets/JYY/Prefabs/AOEIndicatorChariot.prefab.meta +++ b/Assets/JYY/Prefabs/AoE Indicator Chariot.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e9e020ef2784edf4ca2a83ae9e1edefd +guid: 36d2fcfec062c074ba2dad3a0b0116be PrefabImporter: externalObjects: {} userData: diff --git a/Assets/JYY/Prefabs/AoE Slash Blue Chariot.prefab b/Assets/JYY/Prefabs/AoE Slash Blue Chariot.prefab new file mode 100644 index 00000000..995bcd81 --- /dev/null +++ b/Assets/JYY/Prefabs/AoE Slash Blue Chariot.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d42386e12ec2eec2385f13fdcd2558718c9150245a834d5a667060f750b1ced +size 3100 diff --git a/Assets/JYY/Prefabs/AoE Slash Blue Chariot.prefab.meta b/Assets/JYY/Prefabs/AoE Slash Blue Chariot.prefab.meta new file mode 100644 index 00000000..5ba3ecc5 --- /dev/null +++ b/Assets/JYY/Prefabs/AoE Slash Blue Chariot.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3f431e991bd65014c833e89305ddd5e3 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JYY/Prefabs/[Enemy] PldDog.prefab b/Assets/JYY/Prefabs/[Enemy] PldDog.prefab index f383c5f8..8b998d43 100644 --- a/Assets/JYY/Prefabs/[Enemy] PldDog.prefab +++ b/Assets/JYY/Prefabs/[Enemy] PldDog.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c7b23e4a2f6475f6cfe0641a03fd4415fe2b732fe649a14f93b72ea104f250f3 -size 80026 +oid sha256:a4cedd199100ba2d66a0dfe22b6ab902677fcc6485b02d0553115d0e012b3c97 +size 79510 diff --git a/Assets/JYY/Scenes/MonsterTest.unity b/Assets/JYY/Scenes/MonsterTest.unity index a2f28549..471eda89 100644 --- a/Assets/JYY/Scenes/MonsterTest.unity +++ b/Assets/JYY/Scenes/MonsterTest.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec97ec66df4283ed273c243f4aa1642c492661d1163184ce650d833e5a36bd87 -size 19269 +oid sha256:ccea4dffb67fe759672ab88a8aae903251498785bbe1d83673c2e0a7a89ace8f +size 19724 diff --git a/Assets/Scripts/Character/Enemy/ChariotAoeController.cs b/Assets/Scripts/Character/Enemy/ChariotAoeController.cs new file mode 100644 index 00000000..f38a905f --- /dev/null +++ b/Assets/Scripts/Character/Enemy/ChariotAoeController.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Serialization; + + +[System.Serializable] +public struct DamageEffectData +{ + public int damage; + public float radius; + public float delay; + public LayerMask targetLayer; + + public GameObject explosionEffectPrefab; +} + +public class ChariotAoeController : MonoBehaviour +{ + private DamageEffectData _data; + [SerializeField] private GameObject warningEffectInstance; + + private EnemyController _enemyController; + + public void SetEffect(DamageEffectData data, EnemyController enemyController) + { + _data = data; + _enemyController = enemyController; + + ShowWarningEffect(); + Invoke(nameof(Explode), _data.delay); + } + + private void ShowWarningEffect() + { + warningEffectInstance.SetActive(true); + float diameter = _data.radius * 2f; + gameObject.transform.localScale = new Vector3(diameter, 1f, diameter); + } + + private void Explode() + { + var effect = Instantiate(_data.explosionEffectPrefab, transform.position, Quaternion.identity); + + // 공격 전조 제거 + warningEffectInstance.SetActive(false); + + effect.transform.localScale = new Vector3(_data.radius, _data.radius, _data.radius); + _enemyController.SetAttackTrigger(true); + // 폭발 반경 내의 모든 콜라이더 가져오기 + Collider[] hitColliders = Physics.OverlapSphere(transform.position, _data.radius, _data.targetLayer); + foreach (Collider hit in hitColliders) + { + if (hit.CompareTag("Player")) + { + // TODO : 데미지 부여 + Debug.Log(hit.name +"에게 공격 적중"); + } + } + + Exit(effect); + } + + private void Exit(GameObject effect) + { + Destroy(effect, 2f); + Destroy(gameObject, 2f); + } + + private void OnDestroy() + { + _enemyController.SetAttackTrigger(false); + _enemyController = null; + } + + private void OnDrawGizmosSelected() + { + Gizmos.color = Color.red; + Gizmos.DrawWireSphere(transform.position, _data.radius); + } +} \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyAttackController.cs.meta b/Assets/Scripts/Character/Enemy/ChariotAoeController.cs.meta similarity index 100% rename from Assets/Scripts/Character/Enemy/EnemyAttackController.cs.meta rename to Assets/Scripts/Character/Enemy/ChariotAoeController.cs.meta diff --git a/Assets/Scripts/Character/Enemy/EnemyAnimatorStateAttack.cs b/Assets/Scripts/Character/Enemy/EnemyAnimatorStateAttack.cs deleted file mode 100644 index 91bdc4a1..00000000 --- a/Assets/Scripts/Character/Enemy/EnemyAnimatorStateAttack.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -public class EnemyAnimatorStateAttack : StateMachineBehaviour -{ - // OnStateExit is called when a transition ends and the state machine finishes evaluating this state - // override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) - // { - // animator.gameObject.GetComponent().SetState(EnemyState.Trace); - // } - - -} diff --git a/Assets/Scripts/Character/Enemy/EnemyAnimatorStateAttack.cs.meta b/Assets/Scripts/Character/Enemy/EnemyAnimatorStateAttack.cs.meta deleted file mode 100644 index 032dac99..00000000 --- a/Assets/Scripts/Character/Enemy/EnemyAnimatorStateAttack.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a5765847dbef51e4f9bccde712eeda30 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Character/Enemy/EnemyAttackController.cs b/Assets/Scripts/Character/Enemy/EnemyAttackController.cs deleted file mode 100644 index 543db2f9..00000000 --- a/Assets/Scripts/Character/Enemy/EnemyAttackController.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -public class EnemyAttackController : MonoBehaviour -{ - [Header("각종 전조 오브젝트")] - [SerializeField] private GameObject verticalWarningArea; - [SerializeField] private GameObject horizontalWarningArea; - [SerializeField] private GameObject chariotWarningArea; - [SerializeField] private GameObject dynamoWarningArea; - - // 배열에 담아서 관리 - private List warningAreas; - private GameObject _activeArea; - - private void Awake() - { - warningAreas = new List() - { - verticalWarningArea, - horizontalWarningArea, - chariotWarningArea, - dynamoWarningArea - }; - } - - // 랜덤 전조 호출 - public void TriggerRandomWarning(Vector3 spawnPosition, Quaternion spawnRotation) - { - // 0 ~ Count-1 사이 랜덤 인덱스 - int idx = Random.Range(0, warningAreas.Count); - GameObject selected = warningAreas[idx]; - - // 예시: Instantiate 방식으로 화면에 띄우기 - _activeArea = Instantiate(selected, spawnPosition, spawnRotation); - } - - public void DestroyWarningArea() - { - Destroy(_activeArea); - } -} \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyController.cs b/Assets/Scripts/Character/Enemy/EnemyController.cs index 58534e20..d93966fa 100644 --- a/Assets/Scripts/Character/Enemy/EnemyController.cs +++ b/Assets/Scripts/Character/Enemy/EnemyController.cs @@ -2,11 +2,10 @@ using UnityEngine; using UnityEngine.AI; -public enum EnemyState { None, Idle, Trace, Attack, GetHit, Move, Dead } +public enum EnemyState { None, Idle, Trace, Attack, Dead } [RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(Animator))] -[RequireComponent(typeof(EnemyAttackController))] public abstract class EnemyController : CharacterBase { [Header("AI")] @@ -15,36 +14,39 @@ public abstract class EnemyController : CharacterBase public NavMeshAgent Agent { get; private set; } public Animator EnemyAnimator { get; private set; } - public EnemyState CurrentState {get; private set;} + public LayerMask TargetLayerMask => targetLayerMask; + public bool AttackTrigger { get; protected set; } - public EnemyAttackController EnemyAttackController { get; private set; } + public bool IsInBattle { get => _isInBattle; protected set=> _isInBattle = value; } + private bool _isInBattle = false; + + public bool IsBoss { get => _isBoss; protected set => _isBoss = value; } + private bool _isBoss = false; public float WalkSpeed => walkSpeed; public float RunSpeed => runSpeed; public Transform TraceTargetTransform { get; private set; } + [Header("이동 능력")] [SerializeField] private float walkSpeed = 5; [SerializeField] private float runSpeed = 8; - // ----- // 상태 변수 private EnemyStateIdle _enemyStateIdle; private EnemyStateTrace _enemyStateTrace; private EnemyStateAttack _enemyStateAttack; - private EnemyStateGetHit _enemyStateGetHit; private EnemyStateDead _enemyStateDead; - private EnemyStateMove _enemyStateMove; + private Dictionary _enemyStates; - private void Awake() + protected virtual void Awake() { EnemyAnimator = GetComponent(); Agent = GetComponent(); - EnemyAttackController = GetComponent(); } protected override void Start() @@ -55,24 +57,20 @@ public abstract class EnemyController : CharacterBase _enemyStateIdle = new EnemyStateIdle(); _enemyStateTrace = new EnemyStateTrace(); _enemyStateAttack = new EnemyStateAttack(); - _enemyStateGetHit = new EnemyStateGetHit(); _enemyStateDead = new EnemyStateDead(); - _enemyStateMove = new EnemyStateMove(); _enemyStates = new Dictionary { { EnemyState.Idle, _enemyStateIdle }, { EnemyState.Trace, _enemyStateTrace }, { EnemyState.Attack, _enemyStateAttack }, - { EnemyState.GetHit, _enemyStateGetHit }, { EnemyState.Dead, _enemyStateDead }, - { EnemyState.Move, _enemyStateMove} }; SetState(EnemyState.Idle); } - private void Update() + protected void Update() { if (CurrentState != EnemyState.None) { @@ -90,6 +88,24 @@ public abstract class EnemyController : CharacterBase _enemyStates[CurrentState].Enter(this); } + public void SetInBattle(bool battle) + { + _isInBattle = battle; + } + + + public override void Die() + { + base.Die(); + // TODO : 사망 후 동작 + + } + + public void SetAttackTrigger(bool value) + { + AttackTrigger = value; + } + #region 적 탐지 // 일정 반경에 플레이어가 진입하면 플레이어 소리를 감지했다고 판단 diff --git a/Assets/Scripts/Character/Enemy/EnemyDemageField.cs b/Assets/Scripts/Character/Enemy/EnemyDemageField.cs deleted file mode 100644 index 4b22b760..00000000 --- a/Assets/Scripts/Character/Enemy/EnemyDemageField.cs +++ /dev/null @@ -1,7 +0,0 @@ -using UnityEngine; - -public class EnemyDemageField : MonoBehaviour -{ - private float damage; - -} \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyDemageField.cs.meta b/Assets/Scripts/Character/Enemy/EnemyDemageField.cs.meta deleted file mode 100644 index 7afc07ba..00000000 --- a/Assets/Scripts/Character/Enemy/EnemyDemageField.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 8ac23a14eeef4226962782ab20ec78e0 -timeCreated: 1745219566 \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateAttack.cs b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateAttack.cs index 6a35e710..1442509b 100644 --- a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateAttack.cs +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateAttack.cs @@ -10,58 +10,47 @@ public class EnemyStateAttack : IEnemyState private EnemyController _enemyController; private Animator _animator; private Coroutine _attackRoutine; - private EnemyAttackController _enemyAttackController; - private enum AttackType - { - VerticalAttack, // 위에서 아래로 베는 것 - HorizontalAttack, // 옆으로 베는 것 - ChariotAttack, // 원형 - DynamoAttack, // 도넛 - }; - private AttackType _currentAttackType; + private const float AttackInterval = 2f; + private float _attackTimer = 0f; public void Enter(EnemyController enemyController) { _enemyController = enemyController; _animator = _enemyController.EnemyAnimator; - _enemyAttackController = _enemyController.EnemyAttackController; - _animator.SetBool(VertiAttack, true); - _attackRoutine = _enemyController.StartCoroutine(VerticalAttackSequence()); + } public void Update() { + if (!_enemyController.IsBoss) + NonBossSequence(); + + if (_enemyController.AttackTrigger) + { + _animator.SetTrigger(VertiSlash); + _enemyController.SetState(EnemyState.Trace); + } } - private IEnumerator VerticalAttackSequence() + private void NonBossSequence() { - yield return new WaitForSeconds(0.1f); - // 1. 전조 이펙트 생성, 검을 들어올림 - _enemyAttackController.TriggerRandomWarning(_enemyController.transform.position, _enemyController.transform.rotation); - // 2. 대기(전조와 검 들어올리는 애니메이션을 위함) - yield return new WaitForSeconds(2f); + _animator.SetBool(VertiAttack, true); + _attackTimer += Time.deltaTime; - // 3. 검 휘두르기 - _animator.SetTrigger(VertiSlash); - _enemyAttackController.DestroyWarningArea(); - // TODO : 4. 공격 판정 발생 - - yield return new WaitForSeconds(1f); - // 5. 애니메이션 트리거 종료 -> 애니메이터 상태 머신으로 처리 - _enemyController.SetState(EnemyState.Trace); + if (_attackTimer >= AttackInterval) + { + _animator.SetTrigger(VertiSlash); + _attackTimer = 0f; + _enemyController.SetState(EnemyState.Trace); + } } public void Exit() { - if (_attackRoutine != null) - { - _enemyController.StopCoroutine(_attackRoutine); - _attackRoutine = null; - } + _enemyController.SetAttackTrigger(false); _animator.SetBool(VertiAttack, false); _animator = null; - _enemyAttackController = null; _enemyController = null; } } \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateDead.cs b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateDead.cs index 158b9eab..7ded15d5 100644 --- a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateDead.cs +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateDead.cs @@ -6,6 +6,7 @@ { _enemyController = enemyController; _enemyController.EnemyAnimator.SetTrigger("Dead"); + _enemyController.SetInBattle(false); } public void Update() diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs deleted file mode 100644 index b4c44e8a..00000000 --- a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs +++ /dev/null @@ -1,19 +0,0 @@ -public class EnemyStateGetHit: IEnemyState -{ - private EnemyController _enemyController; - - public void Enter(EnemyController enemyController) - { - _enemyController = enemyController; - } - - public void Update() - { - - } - - public void Exit() - { - _enemyController = null; - } -} \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs.meta b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs.meta deleted file mode 100644 index e0212137..00000000 --- a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 7067b1b0eacf490c863a4cb68c290d3a -timeCreated: 1744799049 \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateIdle.cs b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateIdle.cs index b8714ef6..587c91a5 100644 --- a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateIdle.cs +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateIdle.cs @@ -2,13 +2,13 @@ public class EnemyStateIdle: IEnemyState { - private static readonly int Idle = Animator.StringToHash("Idle"); private EnemyController _enemyController; public void Enter(EnemyController enemyController) { _enemyController = enemyController; - _enemyController.EnemyAnimator.SetBool(Idle, true); + _enemyController.EnemyAnimator.SetBool("Idle", true); + _enemyController.SetInBattle(false); } public void Update() @@ -22,7 +22,7 @@ public class EnemyStateIdle: IEnemyState public void Exit() { - _enemyController.EnemyAnimator.SetBool(Idle, false); + _enemyController.EnemyAnimator.SetBool("Idle", false); _enemyController = null; } } \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs deleted file mode 100644 index e68bdcd3..00000000 --- a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs +++ /dev/null @@ -1,19 +0,0 @@ -public class EnemyStateMove : IEnemyState -{ - private EnemyController _enemyController; - - public void Enter(EnemyController enemyController) - { - _enemyController = enemyController; - } - - public void Update() - { - - } - - public void Exit() - { - _enemyController = null; - } -} \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs.meta b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs.meta deleted file mode 100644 index 05ec512c..00000000 --- a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 5abb29c9137942fe95bc66670d8ef521 -timeCreated: 1744799142 \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateTrace.cs b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateTrace.cs index ae814987..e69433c5 100644 --- a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateTrace.cs +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateTrace.cs @@ -29,6 +29,7 @@ public class EnemyStateTrace : IEnemyState } _enemyController.EnemyAnimator.SetBool(Trace, true); + _enemyController.SetInBattle(true); } public void Update() diff --git a/Assets/Scripts/Character/Enemy/PldDogController.cs b/Assets/Scripts/Character/Enemy/PldDogController.cs index 1a9eb28d..41b26f51 100644 --- a/Assets/Scripts/Character/Enemy/PldDogController.cs +++ b/Assets/Scripts/Character/Enemy/PldDogController.cs @@ -1,7 +1,90 @@ using System; +using System.Collections; +using Unity.VisualScripting; using UnityEngine; public class PldDogController : EnemyController { + [Header("공격 패턴 관련")] + [SerializeField] private float patternInterval = 3f; + private float _patternTimer = 0f; + private int _currentPatternIndex = 0; + private bool _isPatternRunning = false; + + + [Header("각종 데미지 이펙트 세트")] + [SerializeField] private GameObject chariotSlashWarning; + [SerializeField] private GameObject chariotSlash; + + [Space(10)] + [SerializeField] private GameObject verticalWarning; + [SerializeField] private GameObject verticalSlash; + + [Space(10)] + [SerializeField] private GameObject horizontalWarning; + [SerializeField] private GameObject horizontalSlash; + + // 몬스터의 행동 스크립트 + // IsBoos = 보스몬스터 여부 + // IsInBattle = 전투중인지 여부 + protected override void Awake() + { + base.Awake(); + IsBoss = true; + } + + private void Update() + { + base.Update(); + + if (IsInBattle && !_isPatternRunning && CurrentState == EnemyState.Attack) + { + _patternTimer += Time.deltaTime; + if (_patternTimer >= patternInterval) + { + ExecutePattern(0); + } + } + } + + private void ExecutePattern(int patternIndex) + { + _isPatternRunning = true; + + switch (patternIndex) + { + case 0: + { + ChariotSlashPattern(); + break; + } + case 1: + { + break; + } + case 2: + { + break; + } + } + } + + private void ChariotSlashPattern() + { + Debug.Log("ChariotSlashPattern: 보스가 차지 슬래시를 사용합니다."); + EnemyAnimator.SetBool("VertiAttack", true); + var warning = Instantiate(chariotSlashWarning, transform.position, Quaternion.identity) + .GetComponent(); + + DamageEffectData effectData = new DamageEffectData() + { + damage = (int)attackPower, + radius = 7.5f, + delay = 2.5f, + targetLayer = TargetLayerMask, + explosionEffectPrefab = chariotSlash + }; + warning.SetEffect(effectData, this); + } }