From a7133a4abae19dfba484eb728c9bf64ccffb193d Mon Sep 17 00:00:00 2001 From: Mingu Kim Date: Wed, 3 Sep 2025 21:16:42 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B3=B4=EC=8A=A4=20=EB=AA=AC=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=20Ai=20=EA=B4=80=EB=A0=A8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=ED=8B=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scenes/SampleScene.unity | 13 +++++++++++ Assets/Scripts/AI.meta | 8 +++++++ Assets/Scripts/AI/EnemyStateManager.cs | 24 ++++++++++++++++++++ Assets/Scripts/AI/EnemyStateManager.cs.meta | 2 ++ Assets/Scripts/AI/IEnemyuState.cs | 9 ++++++++ Assets/Scripts/AI/IEnemyuState.cs.meta | 2 ++ Assets/Scripts/AI/State.meta | 8 +++++++ Assets/Scripts/AI/State/EAttackState.cs | 22 ++++++++++++++++++ Assets/Scripts/AI/State/EAttackState.cs.meta | 2 ++ Assets/Scripts/AI/State/EChaseState.cs | 22 ++++++++++++++++++ Assets/Scripts/AI/State/EChaseState.cs.meta | 2 ++ Assets/Scripts/AI/State/EIdleState.cs | 22 ++++++++++++++++++ Assets/Scripts/AI/State/EIdleState.cs.meta | 2 ++ Assets/Scripts/AI/State/EPatrolState.cs | 22 ++++++++++++++++++ Assets/Scripts/AI/State/EPatrolState.cs.meta | 2 ++ 15 files changed, 162 insertions(+) create mode 100644 Assets/Scripts/AI.meta create mode 100644 Assets/Scripts/AI/EnemyStateManager.cs create mode 100644 Assets/Scripts/AI/EnemyStateManager.cs.meta create mode 100644 Assets/Scripts/AI/IEnemyuState.cs create mode 100644 Assets/Scripts/AI/IEnemyuState.cs.meta create mode 100644 Assets/Scripts/AI/State.meta create mode 100644 Assets/Scripts/AI/State/EAttackState.cs create mode 100644 Assets/Scripts/AI/State/EAttackState.cs.meta create mode 100644 Assets/Scripts/AI/State/EChaseState.cs create mode 100644 Assets/Scripts/AI/State/EChaseState.cs.meta create mode 100644 Assets/Scripts/AI/State/EIdleState.cs create mode 100644 Assets/Scripts/AI/State/EIdleState.cs.meta create mode 100644 Assets/Scripts/AI/State/EPatrolState.cs create mode 100644 Assets/Scripts/AI/State/EPatrolState.cs.meta diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 2bf73222..90c9e738 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -646,6 +646,7 @@ GameObject: - component: {fileID: 114042778} - component: {fileID: 114042777} - component: {fileID: 114042780} + - component: {fileID: 114042781} m_Layer: 9 m_Name: False Knight m_TagString: Enemy @@ -746,6 +747,18 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: nextMove: 0 +--- !u!114 &114042781 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114042775} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 39a88fe79855e244ea5a0692e248e48e, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &119726257 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/AI.meta b/Assets/Scripts/AI.meta new file mode 100644 index 00000000..08f5527d --- /dev/null +++ b/Assets/Scripts/AI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 19a8dafa2c009e14bb05f829de83171e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/AI/EnemyStateManager.cs b/Assets/Scripts/AI/EnemyStateManager.cs new file mode 100644 index 00000000..96ea3370 --- /dev/null +++ b/Assets/Scripts/AI/EnemyStateManager.cs @@ -0,0 +1,24 @@ +using UnityEngine; + +public class EnemyStateManager : MonoBehaviour +{ + public IEnemyState CurrentState; + + void Start() + { + TransitionToState(new EIdleState()); + } + + void Update() + { + CurrentState?.UpdateState(this); // ? = CurrentState가 null이 아닐때만 실행되는 null 조건 연산자 + } + + public void TransitionToState(IEnemyState newState) + { + CurrentState?.ExitState(this); + CurrentState = newState; + CurrentState.EnterState(this); + print($"[TransitionToState]에서 상태 변경 -> {newState}"); + } +} diff --git a/Assets/Scripts/AI/EnemyStateManager.cs.meta b/Assets/Scripts/AI/EnemyStateManager.cs.meta new file mode 100644 index 00000000..7c15c109 --- /dev/null +++ b/Assets/Scripts/AI/EnemyStateManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 39a88fe79855e244ea5a0692e248e48e \ No newline at end of file diff --git a/Assets/Scripts/AI/IEnemyuState.cs b/Assets/Scripts/AI/IEnemyuState.cs new file mode 100644 index 00000000..3b35640d --- /dev/null +++ b/Assets/Scripts/AI/IEnemyuState.cs @@ -0,0 +1,9 @@ +public interface IEnemyState +{ + // 상태에 들어갈때 실행할 함수 + void EnterState(EnemyStateManager enemy); + // 상태가 유지될때 실행되는 함수 + void UpdateState(EnemyStateManager enemy); + // 상태에서 나올때 실행되는 함수 + void ExitState(EnemyStateManager enemy); +} \ No newline at end of file diff --git a/Assets/Scripts/AI/IEnemyuState.cs.meta b/Assets/Scripts/AI/IEnemyuState.cs.meta new file mode 100644 index 00000000..42ffa676 --- /dev/null +++ b/Assets/Scripts/AI/IEnemyuState.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0911e8eea571dfa4fa92f80429dbf6df \ No newline at end of file diff --git a/Assets/Scripts/AI/State.meta b/Assets/Scripts/AI/State.meta new file mode 100644 index 00000000..568fb84a --- /dev/null +++ b/Assets/Scripts/AI/State.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2c6d5b1456feb84098929adaa216fdd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/AI/State/EAttackState.cs b/Assets/Scripts/AI/State/EAttackState.cs new file mode 100644 index 00000000..acd78542 --- /dev/null +++ b/Assets/Scripts/AI/State/EAttackState.cs @@ -0,0 +1,22 @@ +using UnityEngine; + +public class EAttackState : IEnemyState +{ + public void EnterState(EnemyStateManager enemy) + { + Debug.Log("EAttackState에서 EnterState 실행"); + } + + public void UpdateState(EnemyStateManager enemy) + { + if (Input.GetKeyDown(KeyCode.Tab)) + { + enemy.TransitionToState(new EIdleState()); + } + } + + public void ExitState(EnemyStateManager enemy) + { + Debug.Log("EAttackState에서 ExitState 실행"); + } +} diff --git a/Assets/Scripts/AI/State/EAttackState.cs.meta b/Assets/Scripts/AI/State/EAttackState.cs.meta new file mode 100644 index 00000000..e292cd6e --- /dev/null +++ b/Assets/Scripts/AI/State/EAttackState.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e8e7338261caaf747acc655ddc6600c0 \ No newline at end of file diff --git a/Assets/Scripts/AI/State/EChaseState.cs b/Assets/Scripts/AI/State/EChaseState.cs new file mode 100644 index 00000000..58494c09 --- /dev/null +++ b/Assets/Scripts/AI/State/EChaseState.cs @@ -0,0 +1,22 @@ +using UnityEngine; + +public class EChaseState : IEnemyState +{ + public void EnterState(EnemyStateManager enemy) + { + Debug.Log("EChaseState에서 EnterState 실행"); + } + + public void UpdateState(EnemyStateManager enemy) + { + if (Input.GetKeyDown(KeyCode.Tab)) + { + enemy.TransitionToState(new EAttackState()); + } + } + + public void ExitState(EnemyStateManager enemy) + { + Debug.Log("EChaseState에서 ExitState 실행"); + } +} diff --git a/Assets/Scripts/AI/State/EChaseState.cs.meta b/Assets/Scripts/AI/State/EChaseState.cs.meta new file mode 100644 index 00000000..ff30214d --- /dev/null +++ b/Assets/Scripts/AI/State/EChaseState.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5cf86eba8a247ce44aab23fb33a3c799 \ No newline at end of file diff --git a/Assets/Scripts/AI/State/EIdleState.cs b/Assets/Scripts/AI/State/EIdleState.cs new file mode 100644 index 00000000..230fc62a --- /dev/null +++ b/Assets/Scripts/AI/State/EIdleState.cs @@ -0,0 +1,22 @@ +using UnityEngine; + +public class EIdleState : IEnemyState +{ + public void EnterState(EnemyStateManager enemy) + { + Debug.Log("EIdleState에서 EnterState 실행"); + } + + public void UpdateState(EnemyStateManager enemy) + { + if (Input.GetKeyDown(KeyCode.Tab)) + { + enemy.TransitionToState(new EPatrolState()); + } + } + + public void ExitState(EnemyStateManager enemy) + { + Debug.Log("EIdleState에서 ExitState 실행"); + } +} diff --git a/Assets/Scripts/AI/State/EIdleState.cs.meta b/Assets/Scripts/AI/State/EIdleState.cs.meta new file mode 100644 index 00000000..46b5ecbd --- /dev/null +++ b/Assets/Scripts/AI/State/EIdleState.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bf2076e239e13174599ab45c0c843ecb \ No newline at end of file diff --git a/Assets/Scripts/AI/State/EPatrolState.cs b/Assets/Scripts/AI/State/EPatrolState.cs new file mode 100644 index 00000000..a4392219 --- /dev/null +++ b/Assets/Scripts/AI/State/EPatrolState.cs @@ -0,0 +1,22 @@ +using UnityEngine; + +public class EPatrolState : IEnemyState +{ + public void EnterState(EnemyStateManager enemy) + { + Debug.Log("EPatrolState에서 EnterState 실행"); + } + + public void UpdateState(EnemyStateManager enemy) + { + if (Input.GetKeyDown(KeyCode.Tab)) + { + enemy.TransitionToState(new EChaseState()); + } + } + + public void ExitState(EnemyStateManager enemy) + { + Debug.Log("EPatrolState에서 ExitState 실행"); + } +} diff --git a/Assets/Scripts/AI/State/EPatrolState.cs.meta b/Assets/Scripts/AI/State/EPatrolState.cs.meta new file mode 100644 index 00000000..20ca1e8c --- /dev/null +++ b/Assets/Scripts/AI/State/EPatrolState.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1999129bffd0d544bba613cfcc014cdd \ No newline at end of file