diff --git a/Assets/JYY/Animation.meta b/Assets/JYY/Animation.meta new file mode 100644 index 00000000..e344f4a8 --- /dev/null +++ b/Assets/JYY/Animation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 705f5cc824e16644497801b43f81b1c1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JYY/Animator.meta b/Assets/JYY/Animator.meta new file mode 100644 index 00000000..0cefafe5 --- /dev/null +++ b/Assets/JYY/Animator.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 47617fd7d9aae9841b8df03a9c71aab2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JYY/Animator/PldDogControl.controller b/Assets/JYY/Animator/PldDogControl.controller new file mode 100644 index 00000000..d7a7001a --- /dev/null +++ b/Assets/JYY/Animator/PldDogControl.controller @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ae32e910b172b4f7b04fbf91607ef7d871adec9ee0233990fd3b38d3be5a807 +size 10132 diff --git a/Assets/JYY/Animator/PldDogControl.controller.meta b/Assets/JYY/Animator/PldDogControl.controller.meta new file mode 100644 index 00000000..977de011 --- /dev/null +++ b/Assets/JYY/Animator/PldDogControl.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0a0b0196c516e454bbdb102f6dba08cf +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JYY/Prefabs.meta b/Assets/JYY/Prefabs.meta new file mode 100644 index 00000000..78fe849f --- /dev/null +++ b/Assets/JYY/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 622537ed9949f364799229e66b81e7e0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JYY/Scenes/MonsterTest.unity b/Assets/JYY/Scenes/MonsterTest.unity index b6f2774e..6b890b52 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:e5c3fd6cb0241bd3da476e5c911552fc2fe06e6e12775af7da0145389a8ab1f2 -size 89686 +oid sha256:4f8245853d24341e4dd4aca4c679c085f651439fed1342163e04143f6b274425 +size 90314 diff --git a/Assets/Scripts/Character/CharacterBase.cs b/Assets/Scripts/Character/CharacterBase.cs index d2a3932f..b4368c66 100644 --- a/Assets/Scripts/Character/CharacterBase.cs +++ b/Assets/Scripts/Character/CharacterBase.cs @@ -11,7 +11,8 @@ public abstract class CharacterBase : MonoBehaviour public float attackPower = 10f; // 공격력 public float defensePower = 5f; // 방어력 public float moveSpeed = 5f; // 이동 속도 - public float gravity = -9.81f; // 중력 + + protected readonly float gravity = -9.81f; // 중력 [Header("상태 이상")] public List statusEffects = new List(); diff --git a/Assets/Scripts/Character/Enemy.meta b/Assets/Scripts/Character/Enemy.meta new file mode 100644 index 00000000..1f327021 --- /dev/null +++ b/Assets/Scripts/Character/Enemy.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5665d6cc085acce42bfd3d0c921f7718 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Character/Enemy/EnemyController.cs b/Assets/Scripts/Character/Enemy/EnemyController.cs new file mode 100644 index 00000000..93ef90a0 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyController.cs @@ -0,0 +1,96 @@ +using System.Collections.Generic; +using UnityEngine; + +public enum EnemyState { None, Idle, Trace, Attack, GetHit, Move, Dead } + +[RequireComponent(typeof(Animator))] +public class EnemyController : CharacterBase +{ + [Header("AI")] + [SerializeField] private float detectCircleRadius = 10f; // 플레이어 탐지 범위 + [SerializeField] private LayerMask targetLayerMask; // 플레이어 레이어 마스크 + + + public Animator EnemyAnimator { get; private set; } + public EnemyState CurrentState { get; private set; } + private EnemyState _currentState = EnemyState.Idle; + + + + + // ----- + // 상태 변수 + private EnemyStateIdle _enemyStateIdle; + private EnemyStateTrace _enemyStateTrace; + private EnemyStateAttack _enemyStateAttack; + private EnemyStateGetHit _enemyStateGetHit; + private EnemyStateDead _enemyStateDead; + private EnemyStateMove _enemyStateMove; + + private Dictionary _enemyStates; + + protected override void Start() + { + base.Start(); + EnemyAnimator = GetComponent(); + + // 상태 객체 생성 + _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() + { + if (CurrentState != EnemyState.None) + { + _enemyStates[CurrentState].Update(); + } + } + + public void SetState(EnemyState newState) + { + if (CurrentState != EnemyState.None) + { + _enemyStates[CurrentState].Exit(); + } + CurrentState = newState; + _enemyStates[CurrentState].Enter(this); + } + + #region 적 탐지 + + // 일정 반경에 플레이어가 진입하면 플레이어 소리를 감지했다고 판단 + public Transform DetectPlayerInCircle() + { + var hitColliders = Physics.OverlapSphere(transform.position, + detectCircleRadius, targetLayerMask); + if (hitColliders.Length > 0) + { + return hitColliders[0].transform; + } + else + { + return null; + } + } + + #endregion + +} + diff --git a/Assets/Scripts/Character/Enemy/EnemyController.cs.meta b/Assets/Scripts/Character/Enemy/EnemyController.cs.meta new file mode 100644 index 00000000..66b734b1 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyController.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 137423ca7381405581ab4e95d0e272da +timeCreated: 1744796946 \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState.meta b/Assets/Scripts/Character/Enemy/EnemyState.meta new file mode 100644 index 00000000..2ee337cc --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63a5cd5bb2e90b54192be930aad261db +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateAttack.cs b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateAttack.cs new file mode 100644 index 00000000..965068e7 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateAttack.cs @@ -0,0 +1,18 @@ +public class EnemyStateAttack : 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/EnemyStateAttack.cs.meta b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateAttack.cs.meta new file mode 100644 index 00000000..6116ce6e --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateAttack.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 29b87c92807e4f6b94c8a08ccc510321 +timeCreated: 1744799701 \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateDead.cs b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateDead.cs new file mode 100644 index 00000000..f044f730 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateDead.cs @@ -0,0 +1,19 @@ +public class EnemyStateDead : 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/EnemyStateDead.cs.meta b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateDead.cs.meta new file mode 100644 index 00000000..417777ab --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateDead.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4846f061be91409096d5517aa2c692fa +timeCreated: 1744799618 \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs new file mode 100644 index 00000000..b4c44e8a --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs @@ -0,0 +1,19 @@ +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 new file mode 100644 index 00000000..e0212137 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateGetHit.cs.meta @@ -0,0 +1,3 @@ +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 new file mode 100644 index 00000000..b8714ef6 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateIdle.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +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); + } + + public void Update() + { + var detectPlayerTransform = _enemyController.DetectPlayerInCircle(); + if (detectPlayerTransform) + { + _enemyController.SetState(EnemyState.Trace); + } + } + + public void Exit() + { + _enemyController.EnemyAnimator.SetBool(Idle, false); + _enemyController = null; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateIdle.cs.meta b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateIdle.cs.meta new file mode 100644 index 00000000..3769cc1e --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateIdle.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: df3f42dea99a423b8e2ec18e07e58767 +timeCreated: 1744799656 \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs new file mode 100644 index 00000000..e68bdcd3 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs @@ -0,0 +1,19 @@ +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 new file mode 100644 index 00000000..05ec512c --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateMove.cs.meta @@ -0,0 +1,3 @@ +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 new file mode 100644 index 00000000..f75d5ab7 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateTrace.cs @@ -0,0 +1,18 @@ +public class EnemyStateTrace : 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/EnemyStateTrace.cs.meta b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateTrace.cs.meta new file mode 100644 index 00000000..48083fc5 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/EnemyStateTrace.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d49fe89f824544eebeb0ad8e364e33d4 +timeCreated: 1744797593 \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/EnemyState/IEnemyState.cs b/Assets/Scripts/Character/Enemy/EnemyState/IEnemyState.cs new file mode 100644 index 00000000..036a3de3 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/IEnemyState.cs @@ -0,0 +1,6 @@ +public interface IEnemyState +{ + void Enter(EnemyController enemyController); + void Update(); + void Exit(); +} diff --git a/Assets/Scripts/Character/Enemy/EnemyState/IEnemyState.cs.meta b/Assets/Scripts/Character/Enemy/EnemyState/IEnemyState.cs.meta new file mode 100644 index 00000000..452112a0 --- /dev/null +++ b/Assets/Scripts/Character/Enemy/EnemyState/IEnemyState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 418026380ec247acaf9ff06190d2fbf2 +timeCreated: 1744796715 \ No newline at end of file diff --git a/Assets/Scripts/Character/Enemy/PldDogController.cs b/Assets/Scripts/Character/Enemy/PldDogController.cs new file mode 100644 index 00000000..f35e059b --- /dev/null +++ b/Assets/Scripts/Character/Enemy/PldDogController.cs @@ -0,0 +1,19 @@ +using System; +using UnityEngine; + +public class PldDogController : EnemyController +{ + + + + private void Awake() + { + + } + + private void Update() + { + + } + +} diff --git a/Assets/Scripts/Character/Enemy/PldDogController.cs.meta b/Assets/Scripts/Character/Enemy/PldDogController.cs.meta new file mode 100644 index 00000000..6ba942ce --- /dev/null +++ b/Assets/Scripts/Character/Enemy/PldDogController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 10f85207f9bd92647b5c38d8a408f024 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/StoreAssets/DogKnight/Animator/DogControl 1.controller b/Assets/StoreAssets/DogKnight/Animator/DogControl 1.controller new file mode 100644 index 00000000..1f882091 --- /dev/null +++ b/Assets/StoreAssets/DogKnight/Animator/DogControl 1.controller @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82b4d8a01d89f6246d28b194926a7c6994b6f8c4a51553944f7aa798bf3ab25c +size 9326 diff --git a/Assets/StoreAssets/DogKnight/Animator/DogControl 1.controller.meta b/Assets/StoreAssets/DogKnight/Animator/DogControl 1.controller.meta new file mode 100644 index 00000000..b349b46b --- /dev/null +++ b/Assets/StoreAssets/DogKnight/Animator/DogControl 1.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ae2ce41b02d61d247b6857c4cec7151c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/StoreAssets/DogKnight/Animator/DogControl.controller b/Assets/StoreAssets/DogKnight/Animator/DogControl.controller index 8b175879..3dc34680 100644 --- a/Assets/StoreAssets/DogKnight/Animator/DogControl.controller +++ b/Assets/StoreAssets/DogKnight/Animator/DogControl.controller @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47307ab6d36849a6cf611ad9757b3a0ffffbefcb412847607c12a85f4126d93a -size 14957 +oid sha256:d958fe887aee47a4b898cb54ba451dc9c86a22f8c0454f0dfb18010210b0f29c +size 9324