From 8271ce523ac77fc63dd49dcefb1db9323aabfca5 Mon Sep 17 00:00:00 2001 From: Vikas Singh Date: Sat, 28 Aug 2021 16:53:16 +0530 Subject: [PATCH 1/4] Enemy Script created with Inheritance, ScipatableObjects and Finite State Machine. So we can add different types of Enemies with different behaviour with different States (move, idle, attack, jump and so on). --- .../BasicEnemyAc.controller | 111 +++++- .../Animations/Enemy/Enemy1_Idle.anim | 85 +++++ .../Animations/Enemy/Enemy1_Idle.anim.meta | 8 + .../Animations/Enemy/Enemy1_walk.anim | 34 +- .../Materials/EnemyMaterial.physicsMaterial2D | 11 + .../EnemyMaterial.physicsMaterial2D.meta | 8 + Assets/Scenes/Main.unity | 44 +-- Assets/Scripts/Enemy/EnemySpecific.meta | 8 + .../Scripts/Enemy/EnemySpecific/Enemy1.meta | 8 + .../Enemy/EnemySpecific/Enemy1/Data.meta | 8 + .../Enemy1/Data/E1_BaseData.asset | 19 ++ .../Enemy1/Data/E1_BaseData.asset.meta | 8 + .../Enemy1/Data/E1_IdleStateData.asset | 16 + .../Enemy1/Data/E1_IdleStateData.asset.meta | 8 + .../Enemy1/Data/E1_MoveStateData.asset | 15 + .../Enemy1/Data/E1_MoveStateData.asset.meta | 8 + .../EnemySpecific/Enemy1/E1_IdleState.cs | 37 ++ .../EnemySpecific/Enemy1/E1_IdleState.cs.meta | 11 + .../EnemySpecific/Enemy1/E1_MoveState.cs | 38 +++ .../EnemySpecific/Enemy1/E1_MoveState.cs.meta | 11 + .../Enemy/EnemySpecific/Enemy1/Enemy1.cs | 22 ++ .../Enemy/EnemySpecific/Enemy1/Enemy1.cs.meta | 11 + Assets/Scripts/Enemy/StateMachine.meta | 8 + Assets/Scripts/Enemy/StateMachine/Entity.cs | 72 ++++ .../Scripts/Enemy/StateMachine/Entity.cs.meta | 11 + .../Enemy/StateMachine/FiniteStateMachine.cs | 22 ++ .../StateMachine/FiniteStateMachine.cs.meta | 11 + Assets/Scripts/Enemy/StateMachine/State.cs | 43 +++ .../Scripts/Enemy/StateMachine/State.cs.meta | 11 + Assets/Scripts/Enemy/States.meta | 8 + Assets/Scripts/Enemy/States/Data.meta | 8 + Assets/Scripts/Enemy/States/Data/D_Entity.cs | 13 + .../Enemy/States/Data/D_Entity.cs.meta | 11 + .../Scripts/Enemy/States/Data/D_IdleState.cs | 12 + .../Enemy/States/Data/D_IdleState.cs.meta | 11 + .../Scripts/Enemy/States/Data/D_MoveState.cs | 12 + .../Enemy/States/Data/D_MoveState.cs.meta | 11 + Assets/Scripts/Enemy/States/IdleState.cs | 58 ++++ Assets/Scripts/Enemy/States/IdleState.cs.meta | 11 + Assets/Scripts/Enemy/States/MoveState.cs | 42 +++ Assets/Scripts/Enemy/States/MoveState.cs.meta | 11 + Assets/Sprites/Enemy/Enemy 1.2.png | Bin 6002 -> 0 bytes Assets/Sprites/Enemy/Enemy 1.png | Bin 0 -> 6807 bytes .../{Enemy 1.2.png.meta => Enemy 1.png.meta} | 320 +++++++++++------- 44 files changed, 1058 insertions(+), 177 deletions(-) create mode 100644 Assets/Animation/Animations/Enemy/Enemy1_Idle.anim create mode 100644 Assets/Animation/Animations/Enemy/Enemy1_Idle.anim.meta create mode 100644 Assets/Materials/EnemyMaterial.physicsMaterial2D create mode 100644 Assets/Materials/EnemyMaterial.physicsMaterial2D.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_IdleStateData.asset create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_IdleStateData.asset.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MoveStateData.asset create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MoveStateData.asset.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs.meta create mode 100644 Assets/Scripts/Enemy/StateMachine.meta create mode 100644 Assets/Scripts/Enemy/StateMachine/Entity.cs create mode 100644 Assets/Scripts/Enemy/StateMachine/Entity.cs.meta create mode 100644 Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs create mode 100644 Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs.meta create mode 100644 Assets/Scripts/Enemy/StateMachine/State.cs create mode 100644 Assets/Scripts/Enemy/StateMachine/State.cs.meta create mode 100644 Assets/Scripts/Enemy/States.meta create mode 100644 Assets/Scripts/Enemy/States/Data.meta create mode 100644 Assets/Scripts/Enemy/States/Data/D_Entity.cs create mode 100644 Assets/Scripts/Enemy/States/Data/D_Entity.cs.meta create mode 100644 Assets/Scripts/Enemy/States/Data/D_IdleState.cs create mode 100644 Assets/Scripts/Enemy/States/Data/D_IdleState.cs.meta create mode 100644 Assets/Scripts/Enemy/States/Data/D_MoveState.cs create mode 100644 Assets/Scripts/Enemy/States/Data/D_MoveState.cs.meta create mode 100644 Assets/Scripts/Enemy/States/IdleState.cs create mode 100644 Assets/Scripts/Enemy/States/IdleState.cs.meta create mode 100644 Assets/Scripts/Enemy/States/MoveState.cs create mode 100644 Assets/Scripts/Enemy/States/MoveState.cs.meta delete mode 100644 Assets/Sprites/Enemy/Enemy 1.2.png create mode 100644 Assets/Sprites/Enemy/Enemy 1.png rename Assets/Sprites/Enemy/{Enemy 1.2.png.meta => Enemy 1.png.meta} (64%) diff --git a/Assets/Animation/AnimationControllers/BasicEnemyAc.controller b/Assets/Animation/AnimationControllers/BasicEnemyAc.controller index 7aee554..06dcd2b 100644 --- a/Assets/Animation/AnimationControllers/BasicEnemyAc.controller +++ b/Assets/Animation/AnimationControllers/BasicEnemyAc.controller @@ -10,7 +10,8 @@ AnimatorState: m_Name: Enemy1_walk m_Speed: 1 m_CycleOffset: 0 - m_Transitions: [] + m_Transitions: + - {fileID: -6959489070667304808} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -26,6 +27,62 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1101 &-6959489070667304808 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: Move + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: Idle + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 8206254002601701628} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.48275864 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-3526955028126852807 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: Move + m_EventTreshold: 0 + - m_ConditionMode: 2 + m_ConditionEvent: Idle + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -9190944687798816731} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.9958878 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1101 &-620458994428194117 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -60,12 +117,18 @@ AnimatorController: m_Name: BasicEnemyAc serializedVersion: 5 m_AnimatorParameters: - - m_Name: Knockback + - m_Name: Move m_Type: 4 m_DefaultFloat: 0 m_DefaultInt: 0 m_DefaultBool: 0 - m_Controller: {fileID: 9100000} + m_Controller: {fileID: 0} + - m_Name: Idle + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} m_AnimatorLayers: - serializedVersion: 5 m_Name: Base Layer @@ -89,8 +152,7 @@ AnimatorState: m_Name: Enemy1_Hurt m_Speed: 1 m_CycleOffset: 0 - m_Transitions: - - {fileID: 5795875195906319899} + m_Transitions: [] m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -142,18 +204,47 @@ AnimatorStateMachine: m_ChildStates: - serializedVersion: 1 m_State: {fileID: -9190944687798816731} - m_Position: {x: 240, y: 80, z: 0} + m_Position: {x: 290, y: -20, z: 0} - serializedVersion: 1 m_State: {fileID: 2331468422103063953} - m_Position: {x: 240, y: 20, z: 0} + m_Position: {x: 50, y: -20, z: 0} + - serializedVersion: 1 + m_State: {fileID: 8206254002601701628} + m_Position: {x: 290, y: 140, z: 0} m_ChildStateMachines: [] - m_AnyStateTransitions: - - {fileID: -620458994428194117} + m_AnyStateTransitions: [] m_EntryTransitions: [] m_StateMachineTransitions: {} m_StateMachineBehaviours: [] - m_AnyStatePosition: {x: 260, y: -30, z: 0} + m_AnyStatePosition: {x: 50, y: 30, z: 0} m_EntryPosition: {x: 50, y: 90, z: 0} m_ExitPosition: {x: 50, y: 140, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_DefaultState: {fileID: -9190944687798816731} +--- !u!1102 &8206254002601701628 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Enemy1_Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -3526955028126852807} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 5d963416a087ce848be82e3a39b8fdf0, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: diff --git a/Assets/Animation/Animations/Enemy/Enemy1_Idle.anim b/Assets/Animation/Animations/Enemy/Enemy1_Idle.anim new file mode 100644 index 0000000..b8c525b --- /dev/null +++ b/Assets/Animation/Animations/Enemy/Enemy1_Idle.anim @@ -0,0 +1,85 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Enemy1_Idle + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: 6469914809321751411, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.083333336 + value: {fileID: -2540635606737711782, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.16666667 + value: {fileID: 8571016785330678217, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.25 + value: {fileID: -6999863032711394166, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.28333333 + value: {fileID: -6999863032711394166, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + attribute: m_Sprite + path: + classID: 212 + script: {fileID: 0} + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 0 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + pptrCurveMapping: + - {fileID: 6469914809321751411, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -2540635606737711782, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: 8571016785330678217, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -6999863032711394166, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -6999863032711394166, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.3 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Assets/Animation/Animations/Enemy/Enemy1_Idle.anim.meta b/Assets/Animation/Animations/Enemy/Enemy1_Idle.anim.meta new file mode 100644 index 0000000..0a1c9d5 --- /dev/null +++ b/Assets/Animation/Animations/Enemy/Enemy1_Idle.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5d963416a087ce848be82e3a39b8fdf0 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Animation/Animations/Enemy/Enemy1_walk.anim b/Assets/Animation/Animations/Enemy/Enemy1_walk.anim index 20e4e6a..228693d 100644 --- a/Assets/Animation/Animations/Enemy/Enemy1_walk.anim +++ b/Assets/Animation/Animations/Enemy/Enemy1_walk.anim @@ -6,7 +6,7 @@ AnimationClip: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: Enemy1_walk + m_Name: Enemy1_Walk serializedVersion: 6 m_Legacy: 0 m_Compressed: 0 @@ -20,28 +20,28 @@ AnimationClip: m_PPtrCurves: - curve: - time: 0 - value: {fileID: 6369384564468328029, guid: 3bb687d3e4e625245b3d010df27f3a6d, + value: {fileID: 7942249098920568159, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - time: 0.06666667 - value: {fileID: 6138185936412383962, guid: 3bb687d3e4e625245b3d010df27f3a6d, + value: {fileID: 6294125324160034484, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - time: 0.13333334 - value: {fileID: -275327403722753088, guid: 3bb687d3e4e625245b3d010df27f3a6d, + value: {fileID: 5845606359538220865, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - time: 0.2 - value: {fileID: 850753403565259673, guid: 3bb687d3e4e625245b3d010df27f3a6d, + value: {fileID: 7559897690265657476, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - time: 0.26666668 - value: {fileID: 3471711084143634667, guid: 3bb687d3e4e625245b3d010df27f3a6d, + value: {fileID: -4821758819355737828, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - time: 0.33333334 - value: {fileID: -3991021883962996350, guid: 3bb687d3e4e625245b3d010df27f3a6d, + value: {fileID: 4027105108782761397, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - time: 0.4 - value: {fileID: -5760543911693439659, guid: 3bb687d3e4e625245b3d010df27f3a6d, + value: {fileID: -4356277145322495249, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - time: 0.46666667 - value: {fileID: -3974637543865793226, guid: 3bb687d3e4e625245b3d010df27f3a6d, + value: {fileID: -4536786074267818148, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} attribute: m_Sprite path: @@ -62,14 +62,14 @@ AnimationClip: customType: 23 isPPtrCurve: 1 pptrCurveMapping: - - {fileID: 6369384564468328029, guid: 3bb687d3e4e625245b3d010df27f3a6d, type: 3} - - {fileID: 6138185936412383962, guid: 3bb687d3e4e625245b3d010df27f3a6d, type: 3} - - {fileID: -275327403722753088, guid: 3bb687d3e4e625245b3d010df27f3a6d, type: 3} - - {fileID: 850753403565259673, guid: 3bb687d3e4e625245b3d010df27f3a6d, type: 3} - - {fileID: 3471711084143634667, guid: 3bb687d3e4e625245b3d010df27f3a6d, type: 3} - - {fileID: -3991021883962996350, guid: 3bb687d3e4e625245b3d010df27f3a6d, type: 3} - - {fileID: -5760543911693439659, guid: 3bb687d3e4e625245b3d010df27f3a6d, type: 3} - - {fileID: -3974637543865793226, guid: 3bb687d3e4e625245b3d010df27f3a6d, type: 3} + - {fileID: 7942249098920568159, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: 6294125324160034484, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: 5845606359538220865, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: 7559897690265657476, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -4821758819355737828, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: 4027105108782761397, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -4356277145322495249, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -4536786074267818148, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} m_AnimationClipSettings: serializedVersion: 2 m_AdditiveReferencePoseClip: {fileID: 0} diff --git a/Assets/Materials/EnemyMaterial.physicsMaterial2D b/Assets/Materials/EnemyMaterial.physicsMaterial2D new file mode 100644 index 0000000..9b050ba --- /dev/null +++ b/Assets/Materials/EnemyMaterial.physicsMaterial2D @@ -0,0 +1,11 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!62 &6200000 +PhysicsMaterial2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: EnemyMaterial + friction: 0 + bounciness: 0 diff --git a/Assets/Materials/EnemyMaterial.physicsMaterial2D.meta b/Assets/Materials/EnemyMaterial.physicsMaterial2D.meta new file mode 100644 index 0000000..866c0e5 --- /dev/null +++ b/Assets/Materials/EnemyMaterial.physicsMaterial2D.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a56be316809bfb04b9619281395b55bb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 6200000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index f3d0837..2cbeeef 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -26976,7 +26976,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 556279999} - m_Layer: 9 + m_Layer: 0 m_Name: WallCheck m_TagString: Untagged m_Icon: {fileID: 0} @@ -27061,7 +27061,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 892116532} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalPosition: {x: 3.18, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 2138779603} @@ -27131,7 +27131,7 @@ Rigidbody2D: m_LinearDrag: 0 m_AngularDrag: 0.05 m_GravityScale: 8 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: a56be316809bfb04b9619281395b55bb, type: 2} m_Interpolate: 0 m_SleepingMode: 1 m_CollisionDetection: 1 @@ -27175,7 +27175,7 @@ SpriteRenderer: m_SortingLayerID: -1031487247 m_SortingLayer: 4 m_SortingOrder: 0 - m_Sprite: {fileID: 6369384564468328029, guid: 3bb687d3e4e625245b3d010df27f3a6d, + m_Sprite: {fileID: 7942249098920568159, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 @@ -35970,7 +35970,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 1881142531} - - component: {fileID: 1881142532} + - component: {fileID: 1881142533} m_Layer: 0 m_Name: Enemy1 m_TagString: Untagged @@ -35993,7 +35993,7 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1881142532 +--- !u!114 &1881142533 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -36002,34 +36002,14 @@ MonoBehaviour: m_GameObject: {fileID: 1881142530} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a6cdb301218e5c14bbfd54d736f699ff, type: 3} + m_Script: {fileID: 11500000, guid: a1fcba6b1a5db63439c38a820a941109, type: 3} m_Name: m_EditorClassIdentifier: - groundCheck: {fileID: 2138779603} + entityData: {fileID: 11400000, guid: b722b6081dff5fc48a07f50f3b391492, type: 2} wallCheck: {fileID: 556279999} - touchDamageCheck: {fileID: 1280154865} - whatIsGround: - serializedVersion: 2 - m_Bits: 256 - whatIsPlayer: - serializedVersion: 2 - m_Bits: 2048 - groundCheckDistance: 0.5 - wallCheckDistance: 0.1 - movementSpeed: 3 - maxHealth: 30 - knockbackDuration: 0.1 - touchDamageCooldown: 0.2 - touchDamage: 10 - touchDamageWidth: 1.97 - touchDamageHeight: 0.98 - knockbackSpeed: {x: 10, y: 5} - hitParticle: {fileID: 1607698850734752776, guid: a75fed3be19fd4e43a0ae215689d76a8, - type: 3} - deathChunkParticle: {fileID: 1482411589124549042, guid: 11ab0c1767df18c47a4ecc7832d158ab, - type: 3} - deathBloodParticle: {fileID: 6973840520826084357, guid: 123a8f48fb319724799ad291fbf131c8, - type: 3} + ledgeCheck: {fileID: 2138779603} + idleStateData: {fileID: 11400000, guid: c1afee4bde01d524a8780ceb0e2942cf, type: 2} + moveStateData: {fileID: 11400000, guid: 8d3710213c08b1c4cb0429ae94a8a87a, type: 2} --- !u!1 &2086072978 GameObject: m_ObjectHideFlags: 0 @@ -36256,7 +36236,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 2138779603} - m_Layer: 9 + m_Layer: 0 m_Name: GroundCheck m_TagString: Untagged m_Icon: {fileID: 0} diff --git a/Assets/Scripts/Enemy/EnemySpecific.meta b/Assets/Scripts/Enemy/EnemySpecific.meta new file mode 100644 index 0000000..f98823d --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1de8f1dbab8eabf41aa3b7e715871aed +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1.meta new file mode 100644 index 0000000..bcacdbf --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d001eeb6f74f3874ebb876483fecc815 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data.meta new file mode 100644 index 0000000..7d11a81 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b7ae57f8dc35f104caf468cb80f75ba9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset new file mode 100644 index 0000000..5bff30e --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 57df72b3fdb53634da7bfbc546142b09, type: 3} + m_Name: E1_BaseData + m_EditorClassIdentifier: + wallCheckDistance: 0.2 + ledgeCheckDistance: 0.45 + whatIsGround: + serializedVersion: 2 + m_Bits: 256 diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset.meta new file mode 100644 index 0000000..c9b4efa --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b722b6081dff5fc48a07f50f3b391492 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_IdleStateData.asset b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_IdleStateData.asset new file mode 100644 index 0000000..a1cc2c1 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_IdleStateData.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: aaab811baedddc44f882613071bf592f, type: 3} + m_Name: E1_IdleStateData + m_EditorClassIdentifier: + minIdleTime: 1 + maxIdleTime: 2 diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_IdleStateData.asset.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_IdleStateData.asset.meta new file mode 100644 index 0000000..e4bfb96 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_IdleStateData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c1afee4bde01d524a8780ceb0e2942cf +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MoveStateData.asset b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MoveStateData.asset new file mode 100644 index 0000000..265469b --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MoveStateData.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 29d0f54a61c9b044fa3173897f9af062, type: 3} + m_Name: E1_MoveStateData + m_EditorClassIdentifier: + movementSpeed: 3 diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MoveStateData.asset.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MoveStateData.asset.meta new file mode 100644 index 0000000..6ed603b --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MoveStateData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8d3710213c08b1c4cb0429ae94a8a87a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs new file mode 100644 index 0000000..1d7ee2a --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs @@ -0,0 +1,37 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class E1_IdleState : IdleState +{ + private Enemy1 enemy; + public E1_IdleState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_IdleState _stateData, Enemy1 _enemy) : base(_entity, _stateMachine, _animBoolName, _stateData) + { + this.enemy = _enemy; + } + + public override void Enter() + { + base.Enter(); + } + + public override void Exit() + { + base.Exit(); + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + + if (isIdleTimeOver) + { + stateMachine.ChangeState(enemy.moveState); + } + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + } +} diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs.meta new file mode 100644 index 0000000..a950de5 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 243dc99a0a87b7e438eb681f6ab90d73 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs new file mode 100644 index 0000000..bb035d6 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs @@ -0,0 +1,38 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class E1_MoveState : MoveState +{ + private Enemy1 enemy; + public E1_MoveState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_MoveState _stateData, Enemy1 _enemy) : base(_entity, _stateMachine, _animBoolName, _stateData) + { + this.enemy = _enemy; + } + + public override void Enter() + { + base.Enter(); + } + + public override void Exit() + { + base.Exit(); + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + + if (!isDetectingLedge || isTouchingWall) + { + enemy.idleState.SetFlipAfterIdle(true); + stateMachine.ChangeState(enemy.idleState); + } + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + } +} diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs.meta new file mode 100644 index 0000000..37b6831 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 05d7271c523296b4cb78d520c44292a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs new file mode 100644 index 0000000..586a908 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs @@ -0,0 +1,22 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Enemy1 : Entity +{ + public E1_IdleState idleState { get; private set; } + public E1_MoveState moveState { get; private set; } + + [SerializeField] private D_IdleState idleStateData; + [SerializeField] private D_MoveState moveStateData; + + public override void Start() + { + base.Start(); + + moveState = new E1_MoveState(this, stateMachine, "Move", moveStateData, this); + idleState = new E1_IdleState(this, stateMachine, "Idle", idleStateData, this); + + stateMachine.Initialize(moveState); + } +} diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs.meta new file mode 100644 index 0000000..427b808 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a1fcba6b1a5db63439c38a820a941109 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/StateMachine.meta b/Assets/Scripts/Enemy/StateMachine.meta new file mode 100644 index 0000000..82215be --- /dev/null +++ b/Assets/Scripts/Enemy/StateMachine.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dafc2e0c6c27ab647b6b7a4cd2536504 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/StateMachine/Entity.cs b/Assets/Scripts/Enemy/StateMachine/Entity.cs new file mode 100644 index 0000000..0f6469d --- /dev/null +++ b/Assets/Scripts/Enemy/StateMachine/Entity.cs @@ -0,0 +1,72 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// Entity Class is the Base Class for Enemies so all Enemies are going to Inherit Entity class + +public class Entity : MonoBehaviour +{ + public FiniteStateMachine stateMachine; + + public D_Entity entityData; + + public int facingDirection { get; private set; } + public Rigidbody2D rb { get; private set; } + public Animator anim { get; private set; } + public GameObject aliveGO { get; private set; } + + [SerializeField] private Transform wallCheck; + [SerializeField] private Transform ledgeCheck; + + private Vector2 velocityWorkspace; + + public virtual void Start() + { + facingDirection = 1; + aliveGO = transform.Find("Alive").gameObject; + rb = aliveGO.GetComponent(); + anim = aliveGO.GetComponent(); + stateMachine = new FiniteStateMachine(); + } + + public virtual void Update() + { + stateMachine.currentState.LogicUpdate(); + } + + public virtual void FixedUpdate() + { + stateMachine.currentState.PhysicsUpdate(); + } + + public virtual void SetVelocity(float _velocity) + { + velocityWorkspace.Set(_velocity * facingDirection, rb.velocity.y); + rb.velocity = velocityWorkspace; + } + + public virtual bool CheckWall() + { + return Physics2D.Raycast(wallCheck.position, aliveGO.transform.right, entityData.wallCheckDistance, entityData.whatIsGround); + } + + public virtual bool CheckLedge() + { + return Physics2D.Raycast(ledgeCheck.position, Vector2.down, entityData.ledgeCheckDistance, entityData.whatIsGround); + } + + public virtual void Flip() + { + facingDirection *= -1; + //Vector2 scale = aliveGO.transform.localScale; + //scale.x *= -1.0f; + //aliveGO.transform.localScale = scale; + aliveGO.transform.Rotate(0.0f, -180.0f, 0.0f); + } + + public virtual void OnDrawGizmos() + { + Gizmos.DrawLine(wallCheck.position, wallCheck.position + (Vector3)(Vector2.right * facingDirection * entityData.wallCheckDistance)); + Gizmos.DrawLine(ledgeCheck.position, ledgeCheck.position + (Vector3)(Vector2.down * facingDirection * entityData.ledgeCheckDistance)); + } +} diff --git a/Assets/Scripts/Enemy/StateMachine/Entity.cs.meta b/Assets/Scripts/Enemy/StateMachine/Entity.cs.meta new file mode 100644 index 0000000..a70a6d9 --- /dev/null +++ b/Assets/Scripts/Enemy/StateMachine/Entity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e39299202f543944a9f6ed30d6eb253a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs b/Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs new file mode 100644 index 0000000..1e0dc80 --- /dev/null +++ b/Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs @@ -0,0 +1,22 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// FiniteStateMachine class is going to keep track of what State the Enemy is currently in & run the correct code from that State. Keep track of current State. +public class FiniteStateMachine +{ + public State currentState { get; private set; } // Keep track of current state which has public getter and private setter + + public void Initialize(State _startingState) + { + currentState = _startingState; + currentState.Enter(); + } + + public void ChangeState(State _newState) + { + currentState.Exit(); + currentState = _newState; + currentState.Enter(); + } +} diff --git a/Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs.meta b/Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs.meta new file mode 100644 index 0000000..e743535 --- /dev/null +++ b/Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 650104a22a3dbdf45922f9964004652e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/StateMachine/State.cs b/Assets/Scripts/Enemy/StateMachine/State.cs new file mode 100644 index 0000000..d69c15e --- /dev/null +++ b/Assets/Scripts/Enemy/StateMachine/State.cs @@ -0,0 +1,43 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/* State class has the every function that all the States should have so Enter, Exit, Normal Update function and Physics Update state. + * So when we create a state like Idle or Move then those are going to be inherited from State class. In our Enemy class we are going to create object of the State */ +public class State +{ + protected FiniteStateMachine stateMachine; // keep track of FiniteStateMachine that it belongs to + protected Entity entity; // keep track of which entity it belongs to + + protected float startTime; + + protected string animBoolName; + + public State(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName) // since we need to create Objects out of these States we need to create Constructor + { + this.entity = _entity; + this.stateMachine = _stateMachine; + this.animBoolName = _animBoolName; + } + + public virtual void Enter() // virtual means thats this function can be redefine in the Derived class + { + startTime = Time.time; + entity.anim.SetBool(animBoolName, true); + } + + public virtual void Exit() + { + entity.anim.SetBool(animBoolName, false); + } + + public virtual void LogicUpdate() + { + + } + + public virtual void PhysicsUpdate() + { + + } +} diff --git a/Assets/Scripts/Enemy/StateMachine/State.cs.meta b/Assets/Scripts/Enemy/StateMachine/State.cs.meta new file mode 100644 index 0000000..d31df04 --- /dev/null +++ b/Assets/Scripts/Enemy/StateMachine/State.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f5f45f11a7820cc4e986237e2cdb6afc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States.meta b/Assets/Scripts/Enemy/States.meta new file mode 100644 index 0000000..99d5ccc --- /dev/null +++ b/Assets/Scripts/Enemy/States.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5837aa1820f50c44da8a9cd131d47e3a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/Data.meta b/Assets/Scripts/Enemy/States/Data.meta new file mode 100644 index 0000000..5585e6a --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6be2f227dccaa054fbfb0749db6d5cf4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/Data/D_Entity.cs b/Assets/Scripts/Enemy/States/Data/D_Entity.cs new file mode 100644 index 0000000..806c2be --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_Entity.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[CreateAssetMenu(fileName = "newEntityData", menuName = "Data/EntityData/BaseData")] + +public class D_Entity : ScriptableObject // we need to create Data objects in Unity & this is something ScriptableObject allows us to do +{ + public float wallCheckDistance = 0.2f; + public float ledgeCheckDistance = 0.45f; + + public LayerMask whatIsGround; +} diff --git a/Assets/Scripts/Enemy/States/Data/D_Entity.cs.meta b/Assets/Scripts/Enemy/States/Data/D_Entity.cs.meta new file mode 100644 index 0000000..3b1cb0f --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_Entity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 57df72b3fdb53634da7bfbc546142b09 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/Data/D_IdleState.cs b/Assets/Scripts/Enemy/States/Data/D_IdleState.cs new file mode 100644 index 0000000..f855048 --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_IdleState.cs @@ -0,0 +1,12 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[CreateAssetMenu(fileName = "newIdleStateData", menuName = "Data/State Data/Idle State")] + + +public class D_IdleState : ScriptableObject +{ + public float minIdleTime = 0.5f; + public float maxIdleTime = 1.5f; +} diff --git a/Assets/Scripts/Enemy/States/Data/D_IdleState.cs.meta b/Assets/Scripts/Enemy/States/Data/D_IdleState.cs.meta new file mode 100644 index 0000000..93f7578 --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_IdleState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aaab811baedddc44f882613071bf592f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/Data/D_MoveState.cs b/Assets/Scripts/Enemy/States/Data/D_MoveState.cs new file mode 100644 index 0000000..da6f224 --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_MoveState.cs @@ -0,0 +1,12 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[CreateAssetMenu(fileName = "newMoveStateData", menuName = "Data/State Data/Move State")] + + +public class D_MoveState : ScriptableObject // Scriptable object is a Data Container to save large amount of data independent of Class Intances +{ + public float movementSpeed = 3f; + +} diff --git a/Assets/Scripts/Enemy/States/Data/D_MoveState.cs.meta b/Assets/Scripts/Enemy/States/Data/D_MoveState.cs.meta new file mode 100644 index 0000000..9c558f1 --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_MoveState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 29d0f54a61c9b044fa3173897f9af062 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/IdleState.cs b/Assets/Scripts/Enemy/States/IdleState.cs new file mode 100644 index 0000000..db096dd --- /dev/null +++ b/Assets/Scripts/Enemy/States/IdleState.cs @@ -0,0 +1,58 @@ +using UnityEngine; + +public class IdleState : State +{ + protected D_IdleState stateData; + + protected bool flipAfterIdle; + protected bool isIdleTimeOver; + + protected float idleTime; + public IdleState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_IdleState _stateData) : base(_entity, _stateMachine, _animBoolName) + { + this.stateData = _stateData; + } + + public override void Enter() + { + base.Enter(); + entity.SetVelocity(0f); + isIdleTimeOver = false; + SetRandomIdleTime(); + } + + public override void Exit() + { + base.Exit(); + + if (flipAfterIdle) + { + entity.Flip(); + } + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + + if (Time.time >= startTime + idleTime) + { + isIdleTimeOver = true; + } + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + } + + public void SetFlipAfterIdle(bool _flip) // Setter for flipAfterIdle + { + flipAfterIdle = _flip; + } + + private void SetRandomIdleTime() + { + idleTime = Random.Range(stateData.minIdleTime, stateData.maxIdleTime); + } +} diff --git a/Assets/Scripts/Enemy/States/IdleState.cs.meta b/Assets/Scripts/Enemy/States/IdleState.cs.meta new file mode 100644 index 0000000..90a0a3b --- /dev/null +++ b/Assets/Scripts/Enemy/States/IdleState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93e820c7c1bd8a247a1c90e9d591e4a9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/MoveState.cs b/Assets/Scripts/Enemy/States/MoveState.cs new file mode 100644 index 0000000..bc724d6 --- /dev/null +++ b/Assets/Scripts/Enemy/States/MoveState.cs @@ -0,0 +1,42 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class MoveState : State +{ + protected D_MoveState stateData; + + protected bool isTouchingWall; + protected bool isDetectingLedge; + public MoveState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_MoveState _stateData) : base(_entity, _stateMachine, _animBoolName) + { + this.stateData = _stateData; + } + + public override void Enter() + { + base.Enter(); + entity.SetVelocity(stateData.movementSpeed); + + isDetectingLedge = entity.CheckLedge(); + isTouchingWall = entity.CheckWall(); + } + + public override void Exit() + { + base.Exit(); + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + + isDetectingLedge = entity.CheckLedge(); + isTouchingWall = entity.CheckWall(); + } +} diff --git a/Assets/Scripts/Enemy/States/MoveState.cs.meta b/Assets/Scripts/Enemy/States/MoveState.cs.meta new file mode 100644 index 0000000..347f194 --- /dev/null +++ b/Assets/Scripts/Enemy/States/MoveState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9abc71b4ae025ab4c9df4152edb86378 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Sprites/Enemy/Enemy 1.2.png b/Assets/Sprites/Enemy/Enemy 1.2.png deleted file mode 100644 index a2b808b933627f440209a79ef71cabc0267ca3ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6002 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 MvcFhq?)C6L0bkBP3;+NC literal 0 HcmV?d00001 diff --git a/Assets/Sprites/Enemy/Enemy 1.2.png.meta b/Assets/Sprites/Enemy/Enemy 1.png.meta similarity index 64% rename from Assets/Sprites/Enemy/Enemy 1.2.png.meta rename to Assets/Sprites/Enemy/Enemy 1.png.meta index bd64e55..5c6d5cb 100644 --- a/Assets/Sprites/Enemy/Enemy 1.2.png.meta +++ b/Assets/Sprites/Enemy/Enemy 1.png.meta @@ -1,61 +1,73 @@ fileFormatVersion: 2 -guid: 3bb687d3e4e625245b3d010df27f3a6d +guid: e77d92723044c9d4f8e8a7c82573d073 TextureImporter: internalIDToNameTable: - first: - 213: 6369384564468328029 - second: Enemy 1.2_0 + 213: 7942249098920568159 + second: Enemy 1_0 - first: - 213: 6138185936412383962 - second: Enemy 1.2_1 + 213: 6294125324160034484 + second: Enemy 1_1 - first: - 213: -275327403722753088 - second: Enemy 1.2_2 + 213: 5845606359538220865 + second: Enemy 1_2 - first: - 213: 850753403565259673 - second: Enemy 1.2_3 + 213: 7559897690265657476 + second: Enemy 1_3 - first: - 213: 3471711084143634667 - second: Enemy 1.2_4 + 213: -4821758819355737828 + second: Enemy 1_4 - first: - 213: -3991021883962996350 - second: Enemy 1.2_5 + 213: 4027105108782761397 + second: Enemy 1_5 - first: - 213: -5760543911693439659 - second: Enemy 1.2_6 + 213: -4356277145322495249 + second: Enemy 1_6 - first: - 213: -3974637543865793226 - second: Enemy 1.2_7 + 213: -4536786074267818148 + second: Enemy 1_7 - first: - 213: -5594722903381117994 - second: Enemy 1.2_8 + 213: 6469914809321751411 + second: Enemy 1_8 - first: - 213: 6200630191683923526 - second: Enemy 1.2_9 + 213: -2540635606737711782 + second: Enemy 1_9 - first: - 213: -3627136891024772522 - second: Enemy 1.2_10 + 213: 8571016785330678217 + second: Enemy 1_10 - first: - 213: 8363528568878816504 - second: Enemy 1.2_11 + 213: -6999863032711394166 + second: Enemy 1_11 - first: - 213: -1198644127468891106 - second: Enemy 1.2_12 + 213: -7306169539634696901 + second: Enemy 1_12 - first: - 213: 3094342574952375879 - second: Enemy 1.2_13 + 213: -1145555792994578308 + second: Enemy 1_13 - first: - 213: 7492954755084660316 - second: Enemy 1.2_14 + 213: -5680426439555403407 + second: Enemy 1_14 - first: - 213: -2871824185258403877 - second: Enemy 1.2_15 + 213: 2624123026477953508 + second: Enemy 1_15 - first: - 213: -4890390274435696291 - second: Enemy 1.2_16 + 213: -4634043128709410468 + second: Enemy 1_16 - first: - 213: -3698650164525975811 - second: Enemy 1.2_17 + 213: -6204320956982381673 + second: Enemy 1_17 + - first: + 213: 4182601990571434440 + second: Enemy 1_18 + - first: + 213: -3033029466344800901 + second: Enemy 1_19 + - first: + 213: -4838196666909180953 + second: Enemy 1_20 + - first: + 213: 3542500663635982729 + second: Enemy 1_21 externalObjects: {} serializedVersion: 11 mipmaps: @@ -137,18 +149,6 @@ TextureImporter: overridden: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 3 - buildTarget: Windows Store Apps - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 0 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - serializedVersion: 3 buildTarget: Android maxTextureSize: 2048 @@ -165,11 +165,11 @@ TextureImporter: serializedVersion: 2 sprites: - serializedVersion: 2 - name: Enemy 1.2_0 + name: Enemy 1_0 rect: serializedVersion: 2 x: 0 - y: 128 + y: 192 width: 64 height: 64 alignment: 0 @@ -179,18 +179,18 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: d56adf2d389946850800000000000000 - internalID: 6369384564468328029 + spriteID: f55a3d2c979883e60800000000000000 + internalID: 7942249098920568159 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_1 + name: Enemy 1_1 rect: serializedVersion: 2 x: 64 - y: 128 + y: 192 width: 64 height: 64 alignment: 0 @@ -200,18 +200,18 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: ada982176973f2550800000000000000 - internalID: 6138185936412383962 + spriteID: 4b6695672a9395750800000000000000 + internalID: 6294125324160034484 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_2 + name: Enemy 1_2 rect: serializedVersion: 2 x: 128 - y: 128 + y: 192 width: 64 height: 64 alignment: 0 @@ -221,18 +221,18 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: 0cbbc206f27dd2cf0800000000000000 - internalID: -275327403722753088 + spriteID: 14f3a0d3304cf1150800000000000000 + internalID: 5845606359538220865 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_3 + name: Enemy 1_3 rect: serializedVersion: 2 x: 192 - y: 128 + y: 192 width: 64 height: 64 alignment: 0 @@ -242,18 +242,18 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: 99b36fa86bb7ecb00800000000000000 - internalID: 850753403565259673 + spriteID: 480a49e25e62ae860800000000000000 + internalID: 7559897690265657476 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_4 + name: Enemy 1_4 rect: serializedVersion: 2 x: 256 - y: 128 + y: 192 width: 64 height: 64 alignment: 0 @@ -263,18 +263,18 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: be8ea2d46defd2030800000000000000 - internalID: 3471711084143634667 + spriteID: c11c1bb86eba51db0800000000000000 + internalID: -4821758819355737828 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_5 + name: Enemy 1_5 rect: serializedVersion: 2 x: 320 - y: 128 + y: 192 width: 64 height: 64 alignment: 0 @@ -284,18 +284,18 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: 289439bedba0d98c0800000000000000 - internalID: -3991021883962996350 + spriteID: 5b5482a82c623e730800000000000000 + internalID: 4027105108782761397 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_6 + name: Enemy 1_6 rect: serializedVersion: 2 x: 384 - y: 128 + y: 192 width: 64 height: 64 alignment: 0 @@ -305,17 +305,38 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: 55d297e35df6e00b0800000000000000 - internalID: -5760543911693439659 + spriteID: fe266e154056b83c0800000000000000 + internalID: -4356277145322495249 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_7 + name: Enemy 1_7 rect: serializedVersion: 2 x: 448 + y: 192 + width: 64 + height: 64 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c57e3553a191a01c0800000000000000 + internalID: -4536786074267818148 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Enemy 1_8 + rect: + serializedVersion: 2 + x: 0 y: 128 width: 64 height: 64 @@ -326,14 +347,77 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: 635c2fe563047d8c0800000000000000 - internalID: -3974637543865793226 + spriteID: 37389a07d31c9c950800000000000000 + internalID: 6469914809321751411 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_8 + name: Enemy 1_9 + rect: + serializedVersion: 2 + x: 64 + y: 128 + width: 64 + height: 64 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a5d80b46069ddbcd0800000000000000 + internalID: -2540635606737711782 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Enemy 1_10 + rect: + serializedVersion: 2 + x: 128 + y: 128 + width: 64 + height: 64 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9c9ab85ea5e52f670800000000000000 + internalID: 8571016785330678217 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Enemy 1_11 + rect: + serializedVersion: 2 + x: 192 + y: 128 + width: 64 + height: 64 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: a8c49da98ad7bde90800000000000000 + internalID: -6999863032711394166 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Enemy 1_12 rect: serializedVersion: 2 x: 0 @@ -347,14 +431,14 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: 6d3f937592d8b52b0800000000000000 - internalID: -5594722903381117994 + spriteID: b3d6b4173854b9a90800000000000000 + internalID: -7306169539634696901 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_9 + name: Enemy 1_13 rect: serializedVersion: 2 x: 64 @@ -368,14 +452,14 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: 64ee1e69e401d0650800000000000000 - internalID: 6200630191683923526 + spriteID: c70da20631b2a10f0800000000000000 + internalID: -1145555792994578308 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_10 + name: Enemy 1_14 rect: serializedVersion: 2 x: 128 @@ -389,14 +473,14 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: 652f0ca0732d9adc0800000000000000 - internalID: -3627136891024772522 + spriteID: 1713099df321b21b0800000000000000 + internalID: -5680426439555403407 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_11 + name: Enemy 1_15 rect: serializedVersion: 2 x: 192 @@ -410,18 +494,18 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: 8fc5ad8ebe8311470800000000000000 - internalID: 8363528568878816504 + spriteID: 4e134284df1ca6420800000000000000 + internalID: 2624123026477953508 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_12 + name: Enemy 1_16 rect: serializedVersion: 2 - x: 0 - y: 0 + x: 256 + y: 64 width: 64 height: 64 alignment: 0 @@ -431,18 +515,18 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: e14db1a448f8d5fe0800000000000000 - internalID: -1198644127468891106 + spriteID: c519f6f935290bfb0800000000000000 + internalID: -4634043128709410468 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_13 + name: Enemy 1_17 rect: serializedVersion: 2 - x: 64 - y: 0 + x: 320 + y: 64 width: 64 height: 64 alignment: 0 @@ -452,17 +536,17 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: 74667696d2051fa20800000000000000 - internalID: 3094342574952375879 + spriteID: 793bd8626f2d5e9a0800000000000000 + internalID: -6204320956982381673 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_14 + name: Enemy 1_18 rect: serializedVersion: 2 - x: 128 + x: 0 y: 0 width: 64 height: 64 @@ -473,17 +557,17 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: c5e25ee76a25cf760800000000000000 - internalID: 7492954755084660316 + spriteID: 8c12adc99569b0a30800000000000000 + internalID: 4182601990571434440 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_15 + name: Enemy 1_19 rect: serializedVersion: 2 - x: 192 + x: 64 y: 0 width: 64 height: 64 @@ -494,17 +578,17 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: bd71c4c7e1b3528d0800000000000000 - internalID: -2871824185258403877 + spriteID: b7db93125c388e5d0800000000000000 + internalID: -3033029466344800901 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_16 + name: Enemy 1_20 rect: serializedVersion: 2 - x: 256 + x: 128 y: 0 width: 64 height: 64 @@ -515,17 +599,17 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: d593c3fa4f7d12cb0800000000000000 - internalID: -4890390274435696291 + spriteID: 7eb366be3c54bdcb0800000000000000 + internalID: -4838196666909180953 vertices: [] indices: edges: [] weights: [] - serializedVersion: 2 - name: Enemy 1.2_17 + name: Enemy 1_21 rect: serializedVersion: 2 - x: 320 + x: 192 y: 0 width: 64 height: 64 @@ -536,8 +620,8 @@ TextureImporter: physicsShape: [] tessellationDetail: 0 bones: [] - spriteID: df63dfa8541cbacc0800000000000000 - internalID: -3698650164525975811 + spriteID: 989bb98a59d792130800000000000000 + internalID: 3542500663635982729 vertices: [] indices: edges: [] From a978ff1570ac62fe6a7b2b73b25cdfe73ee34ba2 Mon Sep 17 00:00:00 2001 From: Vikas Singh Date: Sun, 29 Aug 2021 22:38:59 +0530 Subject: [PATCH 2/4] Created a new State named PlayerDetectedState using Finite State Machine which detects the Player when he is in certain range and stops the Enemy from Move State to Player Detected State & when Player goes out of range of the Enemy Then Enemy changes State from Player Detected to Idle State without Flipping. --- .../BasicEnemyAc.controller | 134 +++++++++++++++++- .../Animations/Enemy/E1_PlayerDetected.anim | 69 +++++++++ .../Enemy/E1_PlayerDetected.anim.meta | 8 ++ Assets/Scenes/Main.unity | 35 ++++- .../Enemy1/Data/E1_BaseData.asset | 5 + .../Enemy1/Data/E1_PlayerDetectedData.asset | 14 ++ .../Data/E1_PlayerDetectedData.asset.meta | 8 ++ .../EnemySpecific/Enemy1/E1_IdleState.cs | 10 +- .../EnemySpecific/Enemy1/E1_MoveState.cs | 6 +- .../Enemy1/E1_PlayerDetectedState.cs | 39 +++++ .../Enemy1/E1_PlayerDetectedState.cs.meta | 11 ++ .../Enemy/EnemySpecific/Enemy1/Enemy1.cs | 7 +- Assets/Scripts/Enemy/StateMachine/Entity.cs | 16 ++- Assets/Scripts/Enemy/States/Data/D_Entity.cs | 6 +- .../States/Data/D_PlayerDetectedState.cs | 10 ++ .../States/Data/D_PlayerDetectedState.cs.meta | 11 ++ Assets/Scripts/Enemy/States/IdleState.cs | 5 +- Assets/Scripts/Enemy/States/MoveState.cs | 6 +- .../Enemy/States/PlayerDetectedState.cs | 43 ++++++ .../Enemy/States/PlayerDetectedState.cs.meta | 11 ++ 20 files changed, 437 insertions(+), 17 deletions(-) create mode 100644 Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim create mode 100644 Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_PlayerDetectedData.asset create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_PlayerDetectedData.asset.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs.meta create mode 100644 Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs create mode 100644 Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs.meta create mode 100644 Assets/Scripts/Enemy/States/PlayerDetectedState.cs create mode 100644 Assets/Scripts/Enemy/States/PlayerDetectedState.cs.meta diff --git a/Assets/Animation/AnimationControllers/BasicEnemyAc.controller b/Assets/Animation/AnimationControllers/BasicEnemyAc.controller index 06dcd2b..2d261d1 100644 --- a/Assets/Animation/AnimationControllers/BasicEnemyAc.controller +++ b/Assets/Animation/AnimationControllers/BasicEnemyAc.controller @@ -12,6 +12,7 @@ AnimatorState: m_CycleOffset: 0 m_Transitions: - {fileID: -6959489070667304808} + - {fileID: -1394521872176004560} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -27,6 +28,33 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1102 &-8658500197949413652 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: E1_PlayerDetected + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -1853924301917641163} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 865146c8eeceaad4ca17cb57ae741fb5, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!1101 &-6959489070667304808 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -55,6 +83,34 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1101 &-5080471408698595987 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: Idle + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: PlayerDetected + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -8658500197949413652} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.16666669 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1101 &-3526955028126852807 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -83,6 +139,62 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1101 &-1853924301917641163 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: PlayerDetected + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: Idle + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 8206254002601701628} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-1394521872176004560 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: Move + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: PlayerDetected + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -8658500197949413652} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.48275864 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1101 &-620458994428194117 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -129,6 +241,12 @@ AnimatorController: m_DefaultInt: 0 m_DefaultBool: 0 m_Controller: {fileID: 0} + - m_Name: PlayerDetected + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} m_AnimatorLayers: - serializedVersion: 5 m_Name: Base Layer @@ -204,21 +322,24 @@ AnimatorStateMachine: m_ChildStates: - serializedVersion: 1 m_State: {fileID: -9190944687798816731} - m_Position: {x: 290, y: -20, z: 0} + m_Position: {x: 410, y: 20, z: 0} - serializedVersion: 1 m_State: {fileID: 2331468422103063953} - m_Position: {x: 50, y: -20, z: 0} + m_Position: {x: 290, y: 200, z: 0} - serializedVersion: 1 m_State: {fileID: 8206254002601701628} - m_Position: {x: 290, y: 140, z: 0} + m_Position: {x: 140, y: 20, z: 0} + - serializedVersion: 1 + m_State: {fileID: -8658500197949413652} + m_Position: {x: 290, y: 150, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: [] m_EntryTransitions: [] m_StateMachineTransitions: {} m_StateMachineBehaviours: [] - m_AnyStatePosition: {x: 50, y: 30, z: 0} - m_EntryPosition: {x: 50, y: 90, z: 0} - m_ExitPosition: {x: 50, y: 140, z: 0} + m_AnyStatePosition: {x: 140, y: 120, z: 0} + m_EntryPosition: {x: 430, y: -50, z: 0} + m_ExitPosition: {x: 430, y: 120, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_DefaultState: {fileID: -9190944687798816731} --- !u!1102 &8206254002601701628 @@ -233,6 +354,7 @@ AnimatorState: m_CycleOffset: 0 m_Transitions: - {fileID: -3526955028126852807} + - {fileID: -5080471408698595987} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 diff --git a/Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim b/Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim new file mode 100644 index 0000000..f77489c --- /dev/null +++ b/Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim @@ -0,0 +1,69 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: E1_PlayerDetected + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: -7306169539634696901, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + attribute: m_Sprite + path: + classID: 212 + script: {fileID: 0} + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 0 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + pptrCurveMapping: + - {fileID: -7306169539634696901, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.016666668 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim.meta b/Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim.meta new file mode 100644 index 0000000..040b3d9 --- /dev/null +++ b/Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 865146c8eeceaad4ca17cb57ae741fb5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index 2cbeeef..d427179 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -27066,6 +27066,7 @@ Transform: m_Children: - {fileID: 2138779603} - {fileID: 556279999} + - {fileID: 1610420346} - {fileID: 1280154865} m_Father: {fileID: 1881142531} m_RootOrder: 0 @@ -35805,7 +35806,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 892116533} - m_RootOrder: 2 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1402441190 GameObject: @@ -35874,6 +35875,36 @@ MonoBehaviour: m_Calls: [] m_LegacyBlendHint: 0 m_ComponentOwner: {fileID: 1686624242} +--- !u!1 &1610420345 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1610420346} + m_Layer: 0 + m_Name: PlayerCheck + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1610420346 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1610420345} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.09, y: -0.39, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 892116533} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1686624241 GameObject: m_ObjectHideFlags: 3 @@ -36008,8 +36039,10 @@ MonoBehaviour: entityData: {fileID: 11400000, guid: b722b6081dff5fc48a07f50f3b391492, type: 2} wallCheck: {fileID: 556279999} ledgeCheck: {fileID: 2138779603} + playerCheck: {fileID: 1610420346} idleStateData: {fileID: 11400000, guid: c1afee4bde01d524a8780ceb0e2942cf, type: 2} moveStateData: {fileID: 11400000, guid: 8d3710213c08b1c4cb0429ae94a8a87a, type: 2} + playerDetectedData: {fileID: 11400000, guid: 59caef930896322448abfc4a80d380d7, type: 2} --- !u!1 &2086072978 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset index 5bff30e..fb2be92 100644 --- a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset @@ -14,6 +14,11 @@ MonoBehaviour: m_EditorClassIdentifier: wallCheckDistance: 0.2 ledgeCheckDistance: 0.45 + MinAgroDistance: 3 + MaxAgroDistance: 4 whatIsGround: serializedVersion: 2 m_Bits: 256 + whatIsPlayer: + serializedVersion: 2 + m_Bits: 2048 diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_PlayerDetectedData.asset b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_PlayerDetectedData.asset new file mode 100644 index 0000000..1714f04 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_PlayerDetectedData.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: aab07c177bd811f43bd49f2e24716e9f, type: 3} + m_Name: E1_PlayerDetectedData + m_EditorClassIdentifier: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_PlayerDetectedData.asset.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_PlayerDetectedData.asset.meta new file mode 100644 index 0000000..ce9a8fc --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_PlayerDetectedData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 59caef930896322448abfc4a80d380d7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs index 1d7ee2a..7b6f4a5 100644 --- a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_IdleState.cs @@ -22,9 +22,13 @@ public override void Exit() public override void LogicUpdate() { - base.LogicUpdate(); - - if (isIdleTimeOver) + base.LogicUpdate(); + + if (isPlayerDetectedInMinAgroRange) + { + stateMachine.ChangeState(enemy.playerDetectedState); + } + else if (isIdleTimeOver) { stateMachine.ChangeState(enemy.moveState); } diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs index bb035d6..dbfc328 100644 --- a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MoveState.cs @@ -24,7 +24,11 @@ public override void LogicUpdate() { base.LogicUpdate(); - if (!isDetectingLedge || isTouchingWall) + if (isPlayerDetectedInMinAgroRange) + { + stateMachine.ChangeState(enemy.playerDetectedState); + } + else if (!isDetectingLedge || isTouchingWall) { enemy.idleState.SetFlipAfterIdle(true); stateMachine.ChangeState(enemy.idleState); diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs new file mode 100644 index 0000000..dd9817c --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs @@ -0,0 +1,39 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class E1_PlayerDetectedState : PlayerDetectedState +{ + private Enemy1 enemy1; + + public E1_PlayerDetectedState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_PlayerDetectedState _stateData, Enemy1 _enemy1) : base(_entity, _stateMachine, _animBoolName, _stateData) + { + this.enemy1 = _enemy1; + } + + public override void Enter() + { + base.Enter(); + } + + public override void Exit() + { + base.Exit(); + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + + if (!isPlayerInMaxAgroRange) + { + enemy1.idleState.SetFlipAfterIdle(false); + stateMachine.ChangeState(enemy1.idleState); + } + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + } +} diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs.meta new file mode 100644 index 0000000..c6ad780 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5381b948ed91d2e42a9ea8618bd2fc77 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs index 586a908..0a80188 100644 --- a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs @@ -6,16 +6,19 @@ public class Enemy1 : Entity { public E1_IdleState idleState { get; private set; } public E1_MoveState moveState { get; private set; } + public E1_PlayerDetectedState playerDetectedState { get; private set; } - [SerializeField] private D_IdleState idleStateData; + [SerializeField] private D_IdleState idleStateData; // get ref [SerializeField] private D_MoveState moveStateData; + [SerializeField] private D_PlayerDetectedState playerDetectedData; public override void Start() { base.Start(); - moveState = new E1_MoveState(this, stateMachine, "Move", moveStateData, this); + moveState = new E1_MoveState(this, stateMachine, "Move", moveStateData, this); // create Instance idleState = new E1_IdleState(this, stateMachine, "Idle", idleStateData, this); + playerDetectedState = new E1_PlayerDetectedState(this, stateMachine, "PlayerDetected", playerDetectedData, this); stateMachine.Initialize(moveState); } diff --git a/Assets/Scripts/Enemy/StateMachine/Entity.cs b/Assets/Scripts/Enemy/StateMachine/Entity.cs index 0f6469d..fcf9c4e 100644 --- a/Assets/Scripts/Enemy/StateMachine/Entity.cs +++ b/Assets/Scripts/Enemy/StateMachine/Entity.cs @@ -16,7 +16,9 @@ public class Entity : MonoBehaviour public GameObject aliveGO { get; private set; } [SerializeField] private Transform wallCheck; - [SerializeField] private Transform ledgeCheck; + [SerializeField] private Transform ledgeCheck; + [SerializeField] private Transform playerCheck; + //[SerializeField] private Transform MaxAgroRangeCheck; private Vector2 velocityWorkspace; @@ -55,6 +57,16 @@ public virtual bool CheckLedge() return Physics2D.Raycast(ledgeCheck.position, Vector2.down, entityData.ledgeCheckDistance, entityData.whatIsGround); } + public virtual bool CheckPlayerInMinAgroRange() + { + return Physics2D.Raycast(playerCheck.position, aliveGO.transform.right, entityData.MinAgroDistance, entityData.whatIsPlayer); + + } + public virtual bool CheckPlayerInMaxAgroRange() + { + return Physics2D.Raycast(playerCheck.position, aliveGO.transform.right, entityData.MaxAgroDistance, entityData.whatIsPlayer); + } + public virtual void Flip() { facingDirection *= -1; @@ -68,5 +80,7 @@ public virtual void OnDrawGizmos() { Gizmos.DrawLine(wallCheck.position, wallCheck.position + (Vector3)(Vector2.right * facingDirection * entityData.wallCheckDistance)); Gizmos.DrawLine(ledgeCheck.position, ledgeCheck.position + (Vector3)(Vector2.down * facingDirection * entityData.ledgeCheckDistance)); + Gizmos.DrawLine(playerCheck.position, playerCheck.position + (Vector3)(Vector2.right * facingDirection * entityData.MinAgroDistance)); + Gizmos.DrawLine(playerCheck.position, playerCheck.position + (Vector3)(Vector2.right * facingDirection * entityData.MaxAgroDistance)); } } diff --git a/Assets/Scripts/Enemy/States/Data/D_Entity.cs b/Assets/Scripts/Enemy/States/Data/D_Entity.cs index 806c2be..cc3fd1f 100644 --- a/Assets/Scripts/Enemy/States/Data/D_Entity.cs +++ b/Assets/Scripts/Enemy/States/Data/D_Entity.cs @@ -9,5 +9,9 @@ public float wallCheckDistance = 0.2f; public float ledgeCheckDistance = 0.45f; - public LayerMask whatIsGround; + public float MinAgroDistance = 3f; + public float MaxAgroDistance = 4f; + + public LayerMask whatIsGround; + public LayerMask whatIsPlayer; } diff --git a/Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs b/Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs new file mode 100644 index 0000000..983c830 --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs @@ -0,0 +1,10 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[CreateAssetMenu(fileName = "newPlayerDetectedData", menuName = "Data/State Data/Player Detected State")] + +public class D_PlayerDetectedState : ScriptableObject +{ + +} diff --git a/Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs.meta b/Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs.meta new file mode 100644 index 0000000..7ddab4b --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aab07c177bd811f43bd49f2e24716e9f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/IdleState.cs b/Assets/Scripts/Enemy/States/IdleState.cs index db096dd..dffd355 100644 --- a/Assets/Scripts/Enemy/States/IdleState.cs +++ b/Assets/Scripts/Enemy/States/IdleState.cs @@ -6,7 +6,8 @@ public class IdleState : State protected bool flipAfterIdle; protected bool isIdleTimeOver; - + protected bool isPlayerDetectedInMinAgroRange; + protected float idleTime; public IdleState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_IdleState _stateData) : base(_entity, _stateMachine, _animBoolName) { @@ -19,6 +20,7 @@ public override void Enter() entity.SetVelocity(0f); isIdleTimeOver = false; SetRandomIdleTime(); + isPlayerDetectedInMinAgroRange = entity.CheckPlayerInMinAgroRange(); } public override void Exit() @@ -44,6 +46,7 @@ public override void LogicUpdate() public override void PhysicsUpdate() { base.PhysicsUpdate(); + isPlayerDetectedInMinAgroRange = entity.CheckPlayerInMinAgroRange(); } public void SetFlipAfterIdle(bool _flip) // Setter for flipAfterIdle diff --git a/Assets/Scripts/Enemy/States/MoveState.cs b/Assets/Scripts/Enemy/States/MoveState.cs index bc724d6..1996dea 100644 --- a/Assets/Scripts/Enemy/States/MoveState.cs +++ b/Assets/Scripts/Enemy/States/MoveState.cs @@ -7,7 +7,8 @@ public class MoveState : State protected D_MoveState stateData; protected bool isTouchingWall; - protected bool isDetectingLedge; + protected bool isDetectingLedge; + protected bool isPlayerDetectedInMinAgroRange; public MoveState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_MoveState _stateData) : base(_entity, _stateMachine, _animBoolName) { this.stateData = _stateData; @@ -20,6 +21,7 @@ public override void Enter() isDetectingLedge = entity.CheckLedge(); isTouchingWall = entity.CheckWall(); + isPlayerDetectedInMinAgroRange = entity.CheckPlayerInMinAgroRange(); } public override void Exit() @@ -38,5 +40,7 @@ public override void PhysicsUpdate() isDetectingLedge = entity.CheckLedge(); isTouchingWall = entity.CheckWall(); + isPlayerDetectedInMinAgroRange = entity.CheckPlayerInMinAgroRange(); + } } diff --git a/Assets/Scripts/Enemy/States/PlayerDetectedState.cs b/Assets/Scripts/Enemy/States/PlayerDetectedState.cs new file mode 100644 index 0000000..1f05800 --- /dev/null +++ b/Assets/Scripts/Enemy/States/PlayerDetectedState.cs @@ -0,0 +1,43 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class PlayerDetectedState : State +{ + protected D_PlayerDetectedState stateData; + + protected bool isPlayerInMinAgroRange; + protected bool isPlayerInMaxAgroRange; + + public PlayerDetectedState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_PlayerDetectedState _stateData) : base(_entity, _stateMachine, _animBoolName) + { + this.stateData = _stateData; + } + + public override void Enter() + { + base.Enter(); + + entity.SetVelocity(0.0f); + + isPlayerInMinAgroRange = entity.CheckPlayerInMinAgroRange(); + isPlayerInMaxAgroRange = entity.CheckPlayerInMaxAgroRange(); + } + + public override void Exit() + { + base.Exit(); + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + isPlayerInMinAgroRange = entity.CheckPlayerInMinAgroRange(); + isPlayerInMaxAgroRange = entity.CheckPlayerInMaxAgroRange(); + } +} diff --git a/Assets/Scripts/Enemy/States/PlayerDetectedState.cs.meta b/Assets/Scripts/Enemy/States/PlayerDetectedState.cs.meta new file mode 100644 index 0000000..b6b766f --- /dev/null +++ b/Assets/Scripts/Enemy/States/PlayerDetectedState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 69e0f615e40307c48b53b7c7437a671c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From ddc11a884df7e16db319523a0ba81275e46be873 Mon Sep 17 00:00:00 2001 From: Vikas Singh Date: Sat, 4 Sep 2021 15:30:20 +0530 Subject: [PATCH 3/4] Here i have created a script where if the Enemy detects the Player he charges towards the Player and if the Player goes out of range he waits for player then turn and again look for player and again turn and goes to Walk State. --- .../BasicEnemyAc.controller | 275 +++++++++++++++++- .../Animations/Enemy/Enemy1_Charge.anim | 97 ++++++ .../Animations/Enemy/Enemy1_Charge.anim.meta | 8 + .../Animations/Enemy/Enemy1_walk.anim | 16 +- Assets/Scenes/Main.unity | 4 +- .../Enemy1/Data/E1_ChargedState.asset | 16 + .../Enemy1/Data/E1_ChargedState.asset.meta | 8 + .../Enemy1/Data/E1_LookForPlayerData.asset | 16 + .../Data/E1_LookForPlayerData.asset.meta | 8 + .../EnemySpecific/Enemy1/E1_ChargeState.cs | 47 +++ .../Enemy1/E1_ChargeState.cs.meta | 11 + .../EnemySpecific/Enemy1/E1_LookForPlayer.cs | 48 +++ .../Enemy1/E1_LookForPlayer.cs.meta | 11 + .../Enemy1/E1_PlayerDetectedState.cs | 8 +- .../Enemy/EnemySpecific/Enemy1/Enemy1.cs | 10 +- Assets/Scripts/Enemy/StateMachine/State.cs | 7 + Assets/Scripts/Enemy/States/ChargeState.cs | 57 ++++ .../Scripts/Enemy/States/ChargeState.cs.meta | 11 + .../Enemy/States/Data/D_ChargeState.cs | 11 + .../Enemy/States/Data/D_ChargeState.cs.meta | 11 + .../Enemy/States/Data/D_LookForPlayer.cs | 11 + .../Enemy/States/Data/D_LookForPlayer.cs.meta | 11 + .../States/Data/D_PlayerDetectedState.cs | 2 +- Assets/Scripts/Enemy/States/IdleState.cs | 10 +- .../Enemy/States/LookForPlayerState.cs | 88 ++++++ .../Enemy/States/LookForPlayerState.cs.meta | 11 + Assets/Scripts/Enemy/States/MoveState.cs | 12 +- .../Enemy/States/PlayerDetectedState.cs | 18 +- 28 files changed, 818 insertions(+), 25 deletions(-) create mode 100644 Assets/Animation/Animations/Enemy/Enemy1_Charge.anim create mode 100644 Assets/Animation/Animations/Enemy/Enemy1_Charge.anim.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_ChargedState.asset create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_ChargedState.asset.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_LookForPlayerData.asset create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_LookForPlayerData.asset.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_LookForPlayer.cs create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_LookForPlayer.cs.meta create mode 100644 Assets/Scripts/Enemy/States/ChargeState.cs create mode 100644 Assets/Scripts/Enemy/States/ChargeState.cs.meta create mode 100644 Assets/Scripts/Enemy/States/Data/D_ChargeState.cs create mode 100644 Assets/Scripts/Enemy/States/Data/D_ChargeState.cs.meta create mode 100644 Assets/Scripts/Enemy/States/Data/D_LookForPlayer.cs create mode 100644 Assets/Scripts/Enemy/States/Data/D_LookForPlayer.cs.meta create mode 100644 Assets/Scripts/Enemy/States/LookForPlayerState.cs create mode 100644 Assets/Scripts/Enemy/States/LookForPlayerState.cs.meta diff --git a/Assets/Animation/AnimationControllers/BasicEnemyAc.controller b/Assets/Animation/AnimationControllers/BasicEnemyAc.controller index 2d261d1..1dc3f13 100644 --- a/Assets/Animation/AnimationControllers/BasicEnemyAc.controller +++ b/Assets/Animation/AnimationControllers/BasicEnemyAc.controller @@ -28,6 +28,34 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1101 &-9173579473245928717 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: PlayerDetected + m_EventTreshold: 0 + - m_ConditionMode: 2 + m_ConditionEvent: LookForPlayer + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -8658500197949413652} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.16666669 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1102 &-8658500197949413652 AnimatorState: serializedVersion: 5 @@ -40,6 +68,8 @@ AnimatorState: m_CycleOffset: 0 m_Transitions: - {fileID: -1853924301917641163} + - {fileID: -5360033612222241811} + - {fileID: 5774204204636646451} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -55,6 +85,34 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1101 &-7581026058444137338 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: LookForPlayer + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: Move + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -9190944687798816731} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.16666669 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1101 &-6959489070667304808 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -83,6 +141,62 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1101 &-6246768053446543338 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: PlayerDetected + m_EventTreshold: 0 + - m_ConditionMode: 2 + m_ConditionEvent: Charge + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -8658500197949413652} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.3181818 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-5360033612222241811 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: PlayerDetected + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: Charge + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 3995466496764135770} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1101 &-5080471408698595987 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -111,6 +225,35 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1102 &-3986136229334749953 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Enemy1_LookForPlayer + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -9173579473245928717} + - {fileID: 389712737174338642} + - {fileID: -7581026058444137338} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 5d963416a087ce848be82e3a39b8fdf0, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!1101 &-3526955028126852807 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -247,6 +390,18 @@ AnimatorController: m_DefaultInt: 0 m_DefaultBool: 0 m_Controller: {fileID: 0} + - m_Name: Charge + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + - m_Name: LookForPlayer + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} m_AnimatorLayers: - serializedVersion: 5 m_Name: Base Layer @@ -260,6 +415,34 @@ AnimatorController: m_IKPass: 0 m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} +--- !u!1101 &389712737174338642 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: Charge + m_EventTreshold: 0 + - m_ConditionMode: 2 + m_ConditionEvent: LookForPlayer + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 3995466496764135770} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.16666669 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1102 &2331468422103063953 AnimatorState: serializedVersion: 5 @@ -286,6 +469,62 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1102 &3995466496764135770 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Enemy1_Charge + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -6246768053446543338} + - {fileID: 8416890014345593666} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: da0f5280504f0134da5c37f7f5c67a70, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &5774204204636646451 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: PlayerDetected + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: LookForPlayer + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -3986136229334749953} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1101 &5795875195906319899 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -325,13 +564,19 @@ AnimatorStateMachine: m_Position: {x: 410, y: 20, z: 0} - serializedVersion: 1 m_State: {fileID: 2331468422103063953} - m_Position: {x: 290, y: 200, z: 0} + m_Position: {x: 160, y: -40, z: 0} - serializedVersion: 1 m_State: {fileID: 8206254002601701628} m_Position: {x: 140, y: 20, z: 0} - serializedVersion: 1 m_State: {fileID: -8658500197949413652} m_Position: {x: 290, y: 150, z: 0} + - serializedVersion: 1 + m_State: {fileID: 3995466496764135770} + m_Position: {x: 140, y: 250, z: 0} + - serializedVersion: 1 + m_State: {fileID: -3986136229334749953} + m_Position: {x: 410, y: 250, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: [] m_EntryTransitions: [] @@ -370,3 +615,31 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1101 &8416890014345593666 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: Charge + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: LookForPlayer + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -3986136229334749953} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 diff --git a/Assets/Animation/Animations/Enemy/Enemy1_Charge.anim b/Assets/Animation/Animations/Enemy/Enemy1_Charge.anim new file mode 100644 index 0000000..250864e --- /dev/null +++ b/Assets/Animation/Animations/Enemy/Enemy1_Charge.anim @@ -0,0 +1,97 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Enemy1_Charge + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: 7942249098920568159, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.033333335 + value: {fileID: 6294125324160034484, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.06666667 + value: {fileID: 5845606359538220865, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.1 + value: {fileID: 7559897690265657476, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.13333334 + value: {fileID: -4821758819355737828, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.16666667 + value: {fileID: 4027105108782761397, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.2 + value: {fileID: -4356277145322495249, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.23333333 + value: {fileID: -4536786074267818148, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + attribute: m_Sprite + path: + classID: 212 + script: {fileID: 0} + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 0 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + pptrCurveMapping: + - {fileID: 7942249098920568159, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: 6294125324160034484, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: 5845606359538220865, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: 7559897690265657476, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -4821758819355737828, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: 4027105108782761397, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -4356277145322495249, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -4536786074267818148, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.25 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Assets/Animation/Animations/Enemy/Enemy1_Charge.anim.meta b/Assets/Animation/Animations/Enemy/Enemy1_Charge.anim.meta new file mode 100644 index 0000000..1ebc116 --- /dev/null +++ b/Assets/Animation/Animations/Enemy/Enemy1_Charge.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: da0f5280504f0134da5c37f7f5c67a70 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Animation/Animations/Enemy/Enemy1_walk.anim b/Assets/Animation/Animations/Enemy/Enemy1_walk.anim index 228693d..9d0df77 100644 --- a/Assets/Animation/Animations/Enemy/Enemy1_walk.anim +++ b/Assets/Animation/Animations/Enemy/Enemy1_walk.anim @@ -22,25 +22,25 @@ AnimationClip: - time: 0 value: {fileID: 7942249098920568159, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - - time: 0.06666667 + - time: 0.083333336 value: {fileID: 6294125324160034484, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - - time: 0.13333334 + - time: 0.16666667 value: {fileID: 5845606359538220865, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - - time: 0.2 + - time: 0.25 value: {fileID: 7559897690265657476, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - - time: 0.26666668 + - time: 0.33333334 value: {fileID: -4821758819355737828, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - - time: 0.33333334 + - time: 0.41666666 value: {fileID: 4027105108782761397, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - - time: 0.4 + - time: 0.5 value: {fileID: -4356277145322495249, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} - - time: 0.46666667 + - time: 0.5833333 value: {fileID: -4536786074267818148, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} attribute: m_Sprite @@ -75,7 +75,7 @@ AnimationClip: m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseTime: 0 m_StartTime: 0 - m_StopTime: 0.48333335 + m_StopTime: 0.59999996 m_OrientationOffsetY: 0 m_Level: 0 m_CycleOffset: 0 diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index d427179..8327d27 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -27061,7 +27061,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 892116532} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 3.18, y: 0, z: 0} + m_LocalPosition: {x: 27.1, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 2138779603} @@ -36043,6 +36043,8 @@ MonoBehaviour: idleStateData: {fileID: 11400000, guid: c1afee4bde01d524a8780ceb0e2942cf, type: 2} moveStateData: {fileID: 11400000, guid: 8d3710213c08b1c4cb0429ae94a8a87a, type: 2} playerDetectedData: {fileID: 11400000, guid: 59caef930896322448abfc4a80d380d7, type: 2} + chargeStateData: {fileID: 11400000, guid: 1454ddae167882b4e9bc3df06f52059f, type: 2} + lookForPlayerData: {fileID: 11400000, guid: bfb42d83e58933d4192b7fc4bd97380e, type: 2} --- !u!1 &2086072978 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_ChargedState.asset b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_ChargedState.asset new file mode 100644 index 0000000..0a915af --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_ChargedState.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc0e4fcf4b6fe7f46a744a69b8e9298f, type: 3} + m_Name: E1_ChargedState + m_EditorClassIdentifier: + chargeSpeed: 6 + chargeTime: 0.5 diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_ChargedState.asset.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_ChargedState.asset.meta new file mode 100644 index 0000000..5c7b67d --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_ChargedState.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1454ddae167882b4e9bc3df06f52059f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_LookForPlayerData.asset b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_LookForPlayerData.asset new file mode 100644 index 0000000..4bf69aa --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_LookForPlayerData.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6abb59b9e5f6f384a86c54828ca11e8a, type: 3} + m_Name: E1_LookForPlayerData + m_EditorClassIdentifier: + amountOfTurn: 2 + timeBetweenTurn: 0.75 diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_LookForPlayerData.asset.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_LookForPlayerData.asset.meta new file mode 100644 index 0000000..95f5ee1 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_LookForPlayerData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bfb42d83e58933d4192b7fc4bd97380e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs new file mode 100644 index 0000000..6f8daa0 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs @@ -0,0 +1,47 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class E1_ChargeState : ChargeState +{ + + private Enemy1 enemy1; + + public E1_ChargeState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_ChargeState _chargedState, Enemy1 _enemy1) : base(_entity, _stateMachine, _animBoolName, _chargedState) + { + this.enemy1 = _enemy1; + } + + public override void Enter() + { + base.Enter(); + } + + public override void Exit() + { + base.Exit(); + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + + if (isDetectingWall || !isDetectingLedge) + { + stateMachine.ChangeState(enemy1.lookForPlayerState); + } + + else if (isChargedTimeOver) + { + if (isPlayerInMinAgroRange) + { + stateMachine.ChangeState(enemy1.playerDetectedState); + } + } + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + } +} diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs.meta new file mode 100644 index 0000000..029778c --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e9a1a19af189a1a4bbb62d1f2b6b6d5c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_LookForPlayer.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_LookForPlayer.cs new file mode 100644 index 0000000..f957081 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_LookForPlayer.cs @@ -0,0 +1,48 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class E1_LookForPlayer : LookForPlayerState +{ + public Enemy1 enemy1; + + public E1_LookForPlayer(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_LookForPlayer _stateData, Enemy1 _enemy1) : base(_entity, _stateMachine, _animBoolName, _stateData) + { + this.enemy1 = _enemy1; + } + + + public override void Enter() + { + base.Enter(); + } + + public override void Exit() + { + base.Exit(); + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + + if (isPlayerInMinAgroRange) + { + stateMachine.ChangeState(enemy1.playerDetectedState); + } + else if(isAllTurnsTimeDone) + { + stateMachine.ChangeState(enemy1.moveState); + } + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + } + + public override void DoChecks() + { + base.DoChecks(); + } +} diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_LookForPlayer.cs.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_LookForPlayer.cs.meta new file mode 100644 index 0000000..47b8498 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_LookForPlayer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eddf7e15f97ef9240a40faf99fa74b5b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs index dd9817c..aed0ee0 100644 --- a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs @@ -25,10 +25,14 @@ public override void LogicUpdate() { base.LogicUpdate(); + if (performLongRangeAction) + { + stateMachine.ChangeState(enemy1.chargeState); + } + if (!isPlayerInMaxAgroRange) { - enemy1.idleState.SetFlipAfterIdle(false); - stateMachine.ChangeState(enemy1.idleState); + stateMachine.ChangeState(enemy1.lookForPlayerState); } } diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs index 0a80188..75205ab 100644 --- a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs @@ -7,10 +7,16 @@ public class Enemy1 : Entity public E1_IdleState idleState { get; private set; } public E1_MoveState moveState { get; private set; } public E1_PlayerDetectedState playerDetectedState { get; private set; } + public E1_ChargeState chargeState { get; private set; } + + public E1_LookForPlayer lookForPlayerState { get; private set; } + [SerializeField] private D_IdleState idleStateData; // get ref [SerializeField] private D_MoveState moveStateData; - [SerializeField] private D_PlayerDetectedState playerDetectedData; + [SerializeField] private D_PlayerDetectedState playerDetectedData; + [SerializeField] private D_ChargeState chargeStateData; + [SerializeField] private D_LookForPlayer lookForPlayerData; public override void Start() { @@ -19,6 +25,8 @@ public override void Start() moveState = new E1_MoveState(this, stateMachine, "Move", moveStateData, this); // create Instance idleState = new E1_IdleState(this, stateMachine, "Idle", idleStateData, this); playerDetectedState = new E1_PlayerDetectedState(this, stateMachine, "PlayerDetected", playerDetectedData, this); + chargeState = new E1_ChargeState(this, stateMachine, "Charge", chargeStateData, this); + lookForPlayerState = new E1_LookForPlayer(this, stateMachine, "LookForPlayer", lookForPlayerData, this); stateMachine.Initialize(moveState); } diff --git a/Assets/Scripts/Enemy/StateMachine/State.cs b/Assets/Scripts/Enemy/StateMachine/State.cs index d69c15e..e8d3d05 100644 --- a/Assets/Scripts/Enemy/StateMachine/State.cs +++ b/Assets/Scripts/Enemy/StateMachine/State.cs @@ -24,6 +24,8 @@ public virtual void Enter() // virtual means thats this fu { startTime = Time.time; entity.anim.SetBool(animBoolName, true); + + DoChecks(); } public virtual void Exit() @@ -37,6 +39,11 @@ public virtual void LogicUpdate() } public virtual void PhysicsUpdate() + { + DoChecks(); + } + + public virtual void DoChecks() { } diff --git a/Assets/Scripts/Enemy/States/ChargeState.cs b/Assets/Scripts/Enemy/States/ChargeState.cs new file mode 100644 index 0000000..11ec592 --- /dev/null +++ b/Assets/Scripts/Enemy/States/ChargeState.cs @@ -0,0 +1,57 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class ChargeState : State +{ + protected D_ChargeState stateData; + + protected bool isPlayerInMinAgroRange; + protected bool isDetectingLedge; + protected bool isDetectingWall; + protected bool isChargedTimeOver; + + public ChargeState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_ChargeState _stateData) : base(_entity, _stateMachine, _animBoolName) + { + this.stateData = _stateData; + } + + + public override void Enter() + { + base.Enter(); + + isChargedTimeOver = false; + + entity.SetVelocity(stateData.chargeSpeed); + } + + public override void Exit() + { + base.Exit(); + + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + + if (Time.time >= startTime + stateData.chargeTime) + { + isChargedTimeOver = true; + } + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + } + public override void DoChecks() + { + base.DoChecks(); + + isPlayerInMinAgroRange = entity.CheckPlayerInMinAgroRange(); + isDetectingWall = entity.CheckWall(); + isDetectingLedge = entity.CheckLedge(); + } +} diff --git a/Assets/Scripts/Enemy/States/ChargeState.cs.meta b/Assets/Scripts/Enemy/States/ChargeState.cs.meta new file mode 100644 index 0000000..d2b3eff --- /dev/null +++ b/Assets/Scripts/Enemy/States/ChargeState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76a96f4b9564cc54c9f6d2bfa89be5b5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/Data/D_ChargeState.cs b/Assets/Scripts/Enemy/States/Data/D_ChargeState.cs new file mode 100644 index 0000000..2234bb2 --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_ChargeState.cs @@ -0,0 +1,11 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[CreateAssetMenu(fileName = "newAssetMenu", menuName = "Data/State/Charged State" )] + +public class D_ChargeState : ScriptableObject +{ + public float chargeSpeed = 6.0f; + public float chargeTime = 0.5f; +} diff --git a/Assets/Scripts/Enemy/States/Data/D_ChargeState.cs.meta b/Assets/Scripts/Enemy/States/Data/D_ChargeState.cs.meta new file mode 100644 index 0000000..0ca172d --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_ChargeState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dc0e4fcf4b6fe7f46a744a69b8e9298f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/Data/D_LookForPlayer.cs b/Assets/Scripts/Enemy/States/Data/D_LookForPlayer.cs new file mode 100644 index 0000000..3351a4b --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_LookForPlayer.cs @@ -0,0 +1,11 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[CreateAssetMenu(fileName = "newLookForPlayerData", menuName = "Data/State Data/Look For Player State")] + +public class D_LookForPlayer : ScriptableObject +{ + public int amountOfTurn = 2; + public float timeBetweenTurn = 0.75f; +} diff --git a/Assets/Scripts/Enemy/States/Data/D_LookForPlayer.cs.meta b/Assets/Scripts/Enemy/States/Data/D_LookForPlayer.cs.meta new file mode 100644 index 0000000..207a66f --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_LookForPlayer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6abb59b9e5f6f384a86c54828ca11e8a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs b/Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs index 983c830..f7c54bf 100644 --- a/Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs +++ b/Assets/Scripts/Enemy/States/Data/D_PlayerDetectedState.cs @@ -6,5 +6,5 @@ public class D_PlayerDetectedState : ScriptableObject { - + public float LongRangeActionTime = 1.5f; } diff --git a/Assets/Scripts/Enemy/States/IdleState.cs b/Assets/Scripts/Enemy/States/IdleState.cs index dffd355..a03333b 100644 --- a/Assets/Scripts/Enemy/States/IdleState.cs +++ b/Assets/Scripts/Enemy/States/IdleState.cs @@ -14,13 +14,13 @@ public IdleState(Entity _entity, FiniteStateMachine _stateMachine, string _animB this.stateData = _stateData; } + public override void Enter() { base.Enter(); entity.SetVelocity(0f); isIdleTimeOver = false; SetRandomIdleTime(); - isPlayerDetectedInMinAgroRange = entity.CheckPlayerInMinAgroRange(); } public override void Exit() @@ -46,7 +46,6 @@ public override void LogicUpdate() public override void PhysicsUpdate() { base.PhysicsUpdate(); - isPlayerDetectedInMinAgroRange = entity.CheckPlayerInMinAgroRange(); } public void SetFlipAfterIdle(bool _flip) // Setter for flipAfterIdle @@ -58,4 +57,11 @@ private void SetRandomIdleTime() { idleTime = Random.Range(stateData.minIdleTime, stateData.maxIdleTime); } + + public override void DoChecks() + { + base.DoChecks(); + + isPlayerDetectedInMinAgroRange = entity.CheckPlayerInMinAgroRange(); + } } diff --git a/Assets/Scripts/Enemy/States/LookForPlayerState.cs b/Assets/Scripts/Enemy/States/LookForPlayerState.cs new file mode 100644 index 0000000..938180b --- /dev/null +++ b/Assets/Scripts/Enemy/States/LookForPlayerState.cs @@ -0,0 +1,88 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class LookForPlayerState : State +{ + + protected D_LookForPlayer stateData; + + protected bool isPlayerInMinAgroRange; + protected bool isAllTurnsDone; + protected bool isAllTurnsTimeDone; + protected bool turnImmediately; + + protected float lastTurnTime; + + protected int amountOfTurnsDone; + + public LookForPlayerState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_LookForPlayer _stateData) : base(_entity, _stateMachine, _animBoolName) + { + this.stateData = _stateData; + } + + + public override void Enter() + { + base.Enter(); + + isAllTurnsDone = false; + isAllTurnsTimeDone = false; + + lastTurnTime = startTime; + amountOfTurnsDone = 0; + entity.SetVelocity(0.0f); + } + + public override void Exit() + { + base.Exit(); + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + + if (turnImmediately) + { + entity.Flip(); + lastTurnTime = Time.time; + amountOfTurnsDone++; + turnImmediately = false; + } + else if(Time.time >= lastTurnTime + stateData.timeBetweenTurn && !isAllTurnsDone) + { + entity.Flip(); + lastTurnTime = Time.time; + amountOfTurnsDone++; + } + + if(amountOfTurnsDone >= stateData.amountOfTurn) + { + isAllTurnsDone = true; + } + + if (Time.time >= lastTurnTime + stateData.timeBetweenTurn && isAllTurnsDone) + { + isAllTurnsTimeDone = true; + } + + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + } + + public override void DoChecks() + { + base.DoChecks(); + + isPlayerInMinAgroRange = entity.CheckPlayerInMinAgroRange(); + } + + public void SetTurnImmediately(bool flip) + { + turnImmediately = flip; + } +} diff --git a/Assets/Scripts/Enemy/States/LookForPlayerState.cs.meta b/Assets/Scripts/Enemy/States/LookForPlayerState.cs.meta new file mode 100644 index 0000000..0526c08 --- /dev/null +++ b/Assets/Scripts/Enemy/States/LookForPlayerState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 59663a487140a6c499785239143023b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/MoveState.cs b/Assets/Scripts/Enemy/States/MoveState.cs index 1996dea..1b26543 100644 --- a/Assets/Scripts/Enemy/States/MoveState.cs +++ b/Assets/Scripts/Enemy/States/MoveState.cs @@ -14,14 +14,12 @@ public MoveState(Entity _entity, FiniteStateMachine _stateMachine, string _animB this.stateData = _stateData; } + public override void Enter() { base.Enter(); + entity.SetVelocity(stateData.movementSpeed); - - isDetectingLedge = entity.CheckLedge(); - isTouchingWall = entity.CheckWall(); - isPlayerDetectedInMinAgroRange = entity.CheckPlayerInMinAgroRange(); } public override void Exit() @@ -37,10 +35,12 @@ public override void LogicUpdate() public override void PhysicsUpdate() { base.PhysicsUpdate(); - + } + public override void DoChecks() + { + base.DoChecks(); isDetectingLedge = entity.CheckLedge(); isTouchingWall = entity.CheckWall(); isPlayerDetectedInMinAgroRange = entity.CheckPlayerInMinAgroRange(); - } } diff --git a/Assets/Scripts/Enemy/States/PlayerDetectedState.cs b/Assets/Scripts/Enemy/States/PlayerDetectedState.cs index 1f05800..b45cb7d 100644 --- a/Assets/Scripts/Enemy/States/PlayerDetectedState.cs +++ b/Assets/Scripts/Enemy/States/PlayerDetectedState.cs @@ -8,20 +8,21 @@ public class PlayerDetectedState : State protected bool isPlayerInMinAgroRange; protected bool isPlayerInMaxAgroRange; + protected bool performLongRangeAction; public PlayerDetectedState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_PlayerDetectedState _stateData) : base(_entity, _stateMachine, _animBoolName) { this.stateData = _stateData; } + public override void Enter() { base.Enter(); - entity.SetVelocity(0.0f); + performLongRangeAction = false; - isPlayerInMinAgroRange = entity.CheckPlayerInMinAgroRange(); - isPlayerInMaxAgroRange = entity.CheckPlayerInMaxAgroRange(); + entity.SetVelocity(0.0f); } public override void Exit() @@ -32,11 +33,22 @@ public override void Exit() public override void LogicUpdate() { base.LogicUpdate(); + + if(Time.time >= startTime + stateData.LongRangeActionTime) + { + performLongRangeAction = true; + } } public override void PhysicsUpdate() { base.PhysicsUpdate(); + + } + public override void DoChecks() + { + base.DoChecks(); + isPlayerInMinAgroRange = entity.CheckPlayerInMinAgroRange(); isPlayerInMaxAgroRange = entity.CheckPlayerInMaxAgroRange(); } From b2702b88d5fda36a79c28ceaab701b9c20c3be6e Mon Sep 17 00:00:00 2001 From: Vikas Singh Date: Thu, 9 Sep 2021 17:02:33 +0530 Subject: [PATCH 4/4] Here the Enemy can Attack the Player with Melee Attack. Enemy can change state to MeleeAttack state from Charge, PlayerDetected state and then transition from MeleeAttack state to LookForPlayer State, Charge State based on the condition. --- .../BasicEnemyAc.controller | 173 ++++++++++++++++-- .../Animations/Enemy/Enemy1_MeleeAttack.anim | 103 +++++++++++ ...anim.meta => Enemy1_MeleeAttack.anim.meta} | 2 +- ...tected.anim => Enemy1_PlayerDetected.anim} | 2 +- .../Enemy/Enemy1_PlayerDetected.anim.meta | 8 + Assets/Prefabs/Player.prefab | 36 ++-- Assets/Scenes/Main.unity | 47 +++++ Assets/Scripts/AnimationToStateMachine.cs | 18 ++ .../Scripts/AnimationToStateMachine.cs.meta | 11 ++ .../Enemy1/Data/E1_BaseData.asset | 5 +- .../Enemy1/Data/E1_MeleeAttackData.asset | 19 ++ .../Enemy1/Data/E1_MeleeAttackData.asset.meta | 8 + .../EnemySpecific/Enemy1/E1_AttackState.cs | 8 + .../Enemy1/E1_AttackState.cs.meta | 11 ++ .../EnemySpecific/Enemy1/E1_ChargeState.cs | 11 +- .../Enemy1/E1_MeleeAttackState.cs | 62 +++++++ .../Enemy1/E1_MeleeAttackState.cs.meta | 11 ++ .../Enemy1/E1_PlayerDetectedState.cs | 10 +- .../Enemy/EnemySpecific/Enemy1/Enemy1.cs | 12 +- .../Enemy1}/StateMachine.meta | 0 .../Enemy1}/StateMachine/Entity.cs | 18 +- .../Enemy1}/StateMachine/Entity.cs.meta | 0 .../StateMachine/FiniteStateMachine.cs | 0 .../StateMachine/FiniteStateMachine.cs.meta | 0 .../Enemy1}/StateMachine/State.cs | 0 .../Enemy1}/StateMachine/State.cs.meta | 0 Assets/Scripts/Enemy/States/AttackState.cs | 57 ++++++ .../Scripts/Enemy/States/AttackState.cs.meta | 11 ++ Assets/Scripts/Enemy/States/ChargeState.cs | 5 + .../Enemy/States/Data/D_AttackState.cs | 9 + .../Enemy/States/Data/D_AttackState.cs.meta | 11 ++ Assets/Scripts/Enemy/States/Data/D_Entity.cs | 7 +- .../Enemy/States/Data/D_MeleeAttack.cs | 13 ++ .../Enemy/States/Data/D_MeleeAttack.cs.meta | 11 ++ .../Scripts/Enemy/States/MeleeAttackState.cs | 60 ++++++ .../Enemy/States/MeleeAttackState.cs.meta | 11 ++ .../Enemy/States/PlayerDetectedState.cs | 7 +- .../Scripts/Player/PlayerCombatController.cs | 12 +- Assets/Scripts/Structs.meta | 8 + Assets/Scripts/Structs/AttackDetails.cs | 9 + Assets/Scripts/Structs/AttackDetails.cs.meta | 11 ++ 41 files changed, 763 insertions(+), 54 deletions(-) create mode 100644 Assets/Animation/Animations/Enemy/Enemy1_MeleeAttack.anim rename Assets/Animation/Animations/Enemy/{E1_PlayerDetected.anim.meta => Enemy1_MeleeAttack.anim.meta} (79%) rename Assets/Animation/Animations/Enemy/{E1_PlayerDetected.anim => Enemy1_PlayerDetected.anim} (98%) create mode 100644 Assets/Animation/Animations/Enemy/Enemy1_PlayerDetected.anim.meta create mode 100644 Assets/Scripts/AnimationToStateMachine.cs create mode 100644 Assets/Scripts/AnimationToStateMachine.cs.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MeleeAttackData.asset create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MeleeAttackData.asset.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_AttackState.cs create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_AttackState.cs.meta create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MeleeAttackState.cs create mode 100644 Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MeleeAttackState.cs.meta rename Assets/Scripts/Enemy/{ => EnemySpecific/Enemy1}/StateMachine.meta (100%) rename Assets/Scripts/Enemy/{ => EnemySpecific/Enemy1}/StateMachine/Entity.cs (75%) rename Assets/Scripts/Enemy/{ => EnemySpecific/Enemy1}/StateMachine/Entity.cs.meta (100%) rename Assets/Scripts/Enemy/{ => EnemySpecific/Enemy1}/StateMachine/FiniteStateMachine.cs (100%) rename Assets/Scripts/Enemy/{ => EnemySpecific/Enemy1}/StateMachine/FiniteStateMachine.cs.meta (100%) rename Assets/Scripts/Enemy/{ => EnemySpecific/Enemy1}/StateMachine/State.cs (100%) rename Assets/Scripts/Enemy/{ => EnemySpecific/Enemy1}/StateMachine/State.cs.meta (100%) create mode 100644 Assets/Scripts/Enemy/States/AttackState.cs create mode 100644 Assets/Scripts/Enemy/States/AttackState.cs.meta create mode 100644 Assets/Scripts/Enemy/States/Data/D_AttackState.cs create mode 100644 Assets/Scripts/Enemy/States/Data/D_AttackState.cs.meta create mode 100644 Assets/Scripts/Enemy/States/Data/D_MeleeAttack.cs create mode 100644 Assets/Scripts/Enemy/States/Data/D_MeleeAttack.cs.meta create mode 100644 Assets/Scripts/Enemy/States/MeleeAttackState.cs create mode 100644 Assets/Scripts/Enemy/States/MeleeAttackState.cs.meta create mode 100644 Assets/Scripts/Structs.meta create mode 100644 Assets/Scripts/Structs/AttackDetails.cs create mode 100644 Assets/Scripts/Structs/AttackDetails.cs.meta diff --git a/Assets/Animation/AnimationControllers/BasicEnemyAc.controller b/Assets/Animation/AnimationControllers/BasicEnemyAc.controller index 1dc3f13..b844d37 100644 --- a/Assets/Animation/AnimationControllers/BasicEnemyAc.controller +++ b/Assets/Animation/AnimationControllers/BasicEnemyAc.controller @@ -56,6 +56,34 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1101 &-9092351600516249748 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: Charge + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: MeleeAttack + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -1697517822426922553} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.8508545 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1102 &-8658500197949413652 AnimatorState: serializedVersion: 5 @@ -63,13 +91,14 @@ AnimatorState: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: E1_PlayerDetected + m_Name: Enemy1_PlayerDetected m_Speed: 1 m_CycleOffset: 0 m_Transitions: - {fileID: -1853924301917641163} - {fileID: -5360033612222241811} - {fileID: 5774204204636646451} + - {fileID: 7883401335464094355} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -79,7 +108,7 @@ AnimatorState: m_MirrorParameterActive: 0 m_CycleOffsetParameterActive: 0 m_TimeParameterActive: 0 - m_Motion: {fileID: 7400000, guid: 865146c8eeceaad4ca17cb57ae741fb5, type: 2} + m_Motion: {fileID: 7400000, guid: 59e77a599c2b13647962b16ec646e2d5, type: 2} m_Tag: m_SpeedParameter: m_MirrorParameter: @@ -169,6 +198,34 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1101 &-5934499945346383766 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: MeleeAttack + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: LookForPlayer + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -3986136229334749953} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1101 &-5360033612222241811 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -225,6 +282,34 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1101 &-4917207915996559421 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: MeleeAttack + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: PlayerDetected + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -8658500197949413652} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1102 &-3986136229334749953 AnimatorState: serializedVersion: 5 @@ -310,6 +395,34 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1102 &-1697517822426922553 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Enemy1_MeleeAttack + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -4917207915996559421} + - {fileID: -5934499945346383766} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 19eb1b08d5922484681c8a5383b474d5, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!1101 &-1394521872176004560 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -402,6 +515,12 @@ AnimatorController: m_DefaultInt: 0 m_DefaultBool: 0 m_Controller: {fileID: 0} + - m_Name: MeleeAttack + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} m_AnimatorLayers: - serializedVersion: 5 m_Name: Base Layer @@ -482,6 +601,7 @@ AnimatorState: m_Transitions: - {fileID: -6246768053446543338} - {fileID: 8416890014345593666} + - {fileID: -9092351600516249748} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -561,32 +681,63 @@ AnimatorStateMachine: m_ChildStates: - serializedVersion: 1 m_State: {fileID: -9190944687798816731} - m_Position: {x: 410, y: 20, z: 0} + m_Position: {x: 130, y: 40, z: 0} - serializedVersion: 1 m_State: {fileID: 2331468422103063953} - m_Position: {x: 160, y: -40, z: 0} + m_Position: {x: 330, y: -30, z: 0} - serializedVersion: 1 m_State: {fileID: 8206254002601701628} - m_Position: {x: 140, y: 20, z: 0} + m_Position: {x: 130, y: 260, z: 0} - serializedVersion: 1 m_State: {fileID: -8658500197949413652} - m_Position: {x: 290, y: 150, z: 0} + m_Position: {x: 280, y: 140, z: 0} - serializedVersion: 1 m_State: {fileID: 3995466496764135770} - m_Position: {x: 140, y: 250, z: 0} + m_Position: {x: 420, y: 270, z: 0} - serializedVersion: 1 m_State: {fileID: -3986136229334749953} - m_Position: {x: 410, y: 250, z: 0} + m_Position: {x: 420, y: 40, z: 0} + - serializedVersion: 1 + m_State: {fileID: -1697517822426922553} + m_Position: {x: 570, y: 140, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: [] m_EntryTransitions: [] m_StateMachineTransitions: {} m_StateMachineBehaviours: [] - m_AnyStatePosition: {x: 140, y: 120, z: 0} - m_EntryPosition: {x: 430, y: -50, z: 0} - m_ExitPosition: {x: 430, y: 120, z: 0} + m_AnyStatePosition: {x: 610, y: 0, z: 0} + m_EntryPosition: {x: 150, y: -30, z: 0} + m_ExitPosition: {x: 540, y: -30, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_DefaultState: {fileID: -9190944687798816731} +--- !u!1101 &7883401335464094355 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: PlayerDetected + m_EventTreshold: 0 + - m_ConditionMode: 1 + m_ConditionEvent: MeleeAttack + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -1697517822426922553} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1102 &8206254002601701628 AnimatorState: serializedVersion: 5 diff --git a/Assets/Animation/Animations/Enemy/Enemy1_MeleeAttack.anim b/Assets/Animation/Animations/Enemy/Enemy1_MeleeAttack.anim new file mode 100644 index 0000000..3a107a2 --- /dev/null +++ b/Assets/Animation/Animations/Enemy/Enemy1_MeleeAttack.anim @@ -0,0 +1,103 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Enemy1_MeleeAttack + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: -7306169539634696901, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.016666668 + value: {fileID: -1145555792994578308, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.06666667 + value: {fileID: -5680426439555403407, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.083333336 + value: {fileID: 2624123026477953508, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.11666667 + value: {fileID: -4634043128709410468, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + - time: 0.13333334 + value: {fileID: -6204320956982381673, guid: e77d92723044c9d4f8e8a7c82573d073, + type: 3} + attribute: m_Sprite + path: + classID: 212 + script: {fileID: 0} + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 0 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + pptrCurveMapping: + - {fileID: -7306169539634696901, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -1145555792994578308, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -5680426439555403407, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: 2624123026477953508, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -4634043128709410468, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + - {fileID: -6204320956982381673, guid: e77d92723044c9d4f8e8a7c82573d073, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.15 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: + - time: 0.06666667 + functionName: TriggerAttack + data: + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 + - time: 0.15 + functionName: FinishAttack + data: + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 diff --git a/Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim.meta b/Assets/Animation/Animations/Enemy/Enemy1_MeleeAttack.anim.meta similarity index 79% rename from Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim.meta rename to Assets/Animation/Animations/Enemy/Enemy1_MeleeAttack.anim.meta index 040b3d9..d125746 100644 --- a/Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim.meta +++ b/Assets/Animation/Animations/Enemy/Enemy1_MeleeAttack.anim.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 865146c8eeceaad4ca17cb57ae741fb5 +guid: 19eb1b08d5922484681c8a5383b474d5 NativeFormatImporter: externalObjects: {} mainObjectFileID: 7400000 diff --git a/Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim b/Assets/Animation/Animations/Enemy/Enemy1_PlayerDetected.anim similarity index 98% rename from Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim rename to Assets/Animation/Animations/Enemy/Enemy1_PlayerDetected.anim index f77489c..8b01c37 100644 --- a/Assets/Animation/Animations/Enemy/E1_PlayerDetected.anim +++ b/Assets/Animation/Animations/Enemy/Enemy1_PlayerDetected.anim @@ -6,7 +6,7 @@ AnimationClip: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: E1_PlayerDetected + m_Name: Enemy1_PlayerDetected serializedVersion: 6 m_Legacy: 0 m_Compressed: 0 diff --git a/Assets/Animation/Animations/Enemy/Enemy1_PlayerDetected.anim.meta b/Assets/Animation/Animations/Enemy/Enemy1_PlayerDetected.anim.meta new file mode 100644 index 0000000..4d8f7b2 --- /dev/null +++ b/Assets/Animation/Animations/Enemy/Enemy1_PlayerDetected.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 59e77a599c2b13647962b16ec646e2d5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Player.prefab b/Assets/Prefabs/Player.prefab index 7510603..79551ce 100644 --- a/Assets/Prefabs/Player.prefab +++ b/Assets/Prefabs/Player.prefab @@ -101,11 +101,11 @@ GameObject: - component: {fileID: 8910869952386821002} - component: {fileID: 8910869952386821045} - component: {fileID: 1014591825909172493} + - component: {fileID: 5033257558057960078} - component: {fileID: 8910869952386821003} - component: {fileID: 8910869952386821000} - component: {fileID: 8910869952386821001} - component: {fileID: 844650217789276172} - - component: {fileID: 5033257558057960078} m_Layer: 11 m_Name: Player m_TagString: Player @@ -193,6 +193,23 @@ MonoBehaviour: whatIsDamagable: serializedVersion: 2 m_Bits: 512 +--- !u!114 &5033257558057960078 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8910869952386821006} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0142b1e76b86f5746a31da6d4cdd96c7, type: 3} + m_Name: + m_EditorClassIdentifier: + maxHealth: 50 + deathBloodParticle: {fileID: 6973840520826084357, guid: 123a8f48fb319724799ad291fbf131c8, + type: 3} + deathChunkParticle: {fileID: 1482411589124549042, guid: 11ab0c1767df18c47a4ecc7832d158ab, + type: 3} --- !u!212 &8910869952386821003 SpriteRenderer: m_ObjectHideFlags: 0 @@ -310,23 +327,6 @@ Animator: m_HasTransformHierarchy: 1 m_AllowConstantClipSamplingOptimization: 1 m_KeepAnimatorControllerStateOnDisable: 0 ---- !u!114 &5033257558057960078 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8910869952386821006} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0142b1e76b86f5746a31da6d4cdd96c7, type: 3} - m_Name: - m_EditorClassIdentifier: - maxHealth: 50 - deathBloodParticle: {fileID: 6973840520826084357, guid: 123a8f48fb319724799ad291fbf131c8, - type: 3} - deathChunkParticle: {fileID: 1482411589124549042, guid: 11ab0c1767df18c47a4ecc7832d158ab, - type: 3} --- !u!1 &9208750176505156739 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index 8327d27..184398d 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -26997,6 +26997,36 @@ Transform: m_Father: {fileID: 892116533} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &592136733 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 592136734} + m_Layer: 0 + m_Name: MeleeAttackPosition + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &592136734 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 592136733} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.04, y: -0.31, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 892116533} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &653128047 GameObject: m_ObjectHideFlags: 0 @@ -27046,6 +27076,7 @@ GameObject: - component: {fileID: 892116536} - component: {fileID: 892116535} - component: {fileID: 892116534} + - component: {fileID: 892116538} m_Layer: 9 m_Name: Alive m_TagString: Enemy @@ -27068,6 +27099,7 @@ Transform: - {fileID: 556279999} - {fileID: 1610420346} - {fileID: 1280154865} + - {fileID: 592136734} m_Father: {fileID: 1881142531} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -27188,6 +27220,18 @@ SpriteRenderer: m_WasSpriteAssigned: 1 m_MaskInteraction: 0 m_SpriteSortPoint: 0 +--- !u!114 &892116538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 892116532} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9df63f33a6f7ac2498a3c90f9082de99, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1092216064 GameObject: m_ObjectHideFlags: 0 @@ -36045,6 +36089,9 @@ MonoBehaviour: playerDetectedData: {fileID: 11400000, guid: 59caef930896322448abfc4a80d380d7, type: 2} chargeStateData: {fileID: 11400000, guid: 1454ddae167882b4e9bc3df06f52059f, type: 2} lookForPlayerData: {fileID: 11400000, guid: bfb42d83e58933d4192b7fc4bd97380e, type: 2} + meleeAttackStateData: {fileID: 11400000, guid: cb89210fb16e32d4a8c05f4391829550, + type: 2} + meleeAttackPosition: {fileID: 592136734} --- !u!1 &2086072978 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/AnimationToStateMachine.cs b/Assets/Scripts/AnimationToStateMachine.cs new file mode 100644 index 0000000..bfe2567 --- /dev/null +++ b/Assets/Scripts/AnimationToStateMachine.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class AnimationToStateMachine : MonoBehaviour +{ + public AttackState attackState; + + private void TriggerAttack() + { + attackState.TriggerAttack(); + } + + private void FinishAttack() + { + attackState.FinishAttack(); + } +} diff --git a/Assets/Scripts/AnimationToStateMachine.cs.meta b/Assets/Scripts/AnimationToStateMachine.cs.meta new file mode 100644 index 0000000..34e089a --- /dev/null +++ b/Assets/Scripts/AnimationToStateMachine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9df63f33a6f7ac2498a3c90f9082de99 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset index fb2be92..c0764d6 100644 --- a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_BaseData.asset @@ -14,8 +14,9 @@ MonoBehaviour: m_EditorClassIdentifier: wallCheckDistance: 0.2 ledgeCheckDistance: 0.45 - MinAgroDistance: 3 - MaxAgroDistance: 4 + minAgroDistance: 7 + maxAgroDistance: 8 + closeRangeActionDistance: 1.75 whatIsGround: serializedVersion: 2 m_Bits: 256 diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MeleeAttackData.asset b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MeleeAttackData.asset new file mode 100644 index 0000000..66843de --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MeleeAttackData.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 560f685b14fc1394db4a9cad9df5234a, type: 3} + m_Name: E1_MeleeAttackData + m_EditorClassIdentifier: + attackRadius: 0.75 + attackDamage: 10 + whatIsPlayer: + serializedVersion: 2 + m_Bits: 2048 diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MeleeAttackData.asset.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MeleeAttackData.asset.meta new file mode 100644 index 0000000..54d112e --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Data/E1_MeleeAttackData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cb89210fb16e32d4a8c05f4391829550 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_AttackState.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_AttackState.cs new file mode 100644 index 0000000..13c5c6f --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_AttackState.cs @@ -0,0 +1,8 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class E1_AttackState : MonoBehaviour +{ + +} diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_AttackState.cs.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_AttackState.cs.meta new file mode 100644 index 0000000..a174d72 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_AttackState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b17f38ceb5455d9459c63c87ab8e9bf4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs index 6f8daa0..ea1c7e2 100644 --- a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_ChargeState.cs @@ -25,8 +25,13 @@ public override void Exit() public override void LogicUpdate() { base.LogicUpdate(); + + if (performCloseRangeAction) + { + stateMachine.ChangeState(enemy1.meleeAttackState); + } - if (isDetectingWall || !isDetectingLedge) + else if (isDetectingWall || !isDetectingLedge) { stateMachine.ChangeState(enemy1.lookForPlayerState); } @@ -37,6 +42,10 @@ public override void LogicUpdate() { stateMachine.ChangeState(enemy1.playerDetectedState); } + else + { + stateMachine.ChangeState(enemy1.lookForPlayerState); + } } } diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MeleeAttackState.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MeleeAttackState.cs new file mode 100644 index 0000000..9657054 --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MeleeAttackState.cs @@ -0,0 +1,62 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class E1_MeleeAttackState : MeleeAttackState +{ + + private Enemy1 enemy1; + + public E1_MeleeAttackState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, Transform _attackPosition, D_MeleeAttack _stateData, Enemy1 _enemy1) : base(_entity, _stateMachine, _animBoolName, _attackPosition, _stateData) + { + this.enemy1 = _enemy1; + } + + public override void DoChecks() + { + base.DoChecks(); + } + + public override void Enter() + { + base.Enter(); + } + + public override void Exit() + { + base.Exit(); + } + + public override void FinishAttack() + { + base.FinishAttack(); + + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + + if (isAnimationFinished) + { + if (isPlayerInMinAgroRange) + { + stateMachine.ChangeState(enemy1.playerDetectedState); + } + else + { + stateMachine.ChangeState(enemy1.lookForPlayerState); + } + } + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + } + + public override void TriggerAttack() + { + base.TriggerAttack(); + } +} diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MeleeAttackState.cs.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MeleeAttackState.cs.meta new file mode 100644 index 0000000..5a4bfda --- /dev/null +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_MeleeAttackState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4ba46fbea8e4490429015c25edb87626 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs index aed0ee0..0cc36c7 100644 --- a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/E1_PlayerDetectedState.cs @@ -24,13 +24,15 @@ public override void Exit() public override void LogicUpdate() { base.LogicUpdate(); - - if (performLongRangeAction) + if (performCloseRangeAction) + { + stateMachine.ChangeState(enemy1.meleeAttackState); + } + else if (performLongRangeAction) { stateMachine.ChangeState(enemy1.chargeState); } - - if (!isPlayerInMaxAgroRange) + else if (!isPlayerInMaxAgroRange) { stateMachine.ChangeState(enemy1.lookForPlayerState); } diff --git a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs index 75205ab..6d94559 100644 --- a/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/Enemy1.cs @@ -8,8 +8,8 @@ public class Enemy1 : Entity public E1_MoveState moveState { get; private set; } public E1_PlayerDetectedState playerDetectedState { get; private set; } public E1_ChargeState chargeState { get; private set; } - public E1_LookForPlayer lookForPlayerState { get; private set; } + public E1_MeleeAttackState meleeAttackState { get; private set; } [SerializeField] private D_IdleState idleStateData; // get ref @@ -17,6 +17,8 @@ public class Enemy1 : Entity [SerializeField] private D_PlayerDetectedState playerDetectedData; [SerializeField] private D_ChargeState chargeStateData; [SerializeField] private D_LookForPlayer lookForPlayerData; + [SerializeField] private D_MeleeAttack meleeAttackStateData; + [SerializeField] private Transform meleeAttackPosition; public override void Start() { @@ -27,7 +29,15 @@ public override void Start() playerDetectedState = new E1_PlayerDetectedState(this, stateMachine, "PlayerDetected", playerDetectedData, this); chargeState = new E1_ChargeState(this, stateMachine, "Charge", chargeStateData, this); lookForPlayerState = new E1_LookForPlayer(this, stateMachine, "LookForPlayer", lookForPlayerData, this); + meleeAttackState = new E1_MeleeAttackState(this, stateMachine, "MeleeAttack", meleeAttackPosition, meleeAttackStateData, this); stateMachine.Initialize(moveState); } + + public override void OnDrawGizmos() + { + base.OnDrawGizmos(); + + Gizmos.DrawWireSphere(meleeAttackPosition.position, meleeAttackStateData.attackRadius); + } } diff --git a/Assets/Scripts/Enemy/StateMachine.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine.meta similarity index 100% rename from Assets/Scripts/Enemy/StateMachine.meta rename to Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine.meta diff --git a/Assets/Scripts/Enemy/StateMachine/Entity.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/Entity.cs similarity index 75% rename from Assets/Scripts/Enemy/StateMachine/Entity.cs rename to Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/Entity.cs index fcf9c4e..47d0cfd 100644 --- a/Assets/Scripts/Enemy/StateMachine/Entity.cs +++ b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/Entity.cs @@ -14,6 +14,7 @@ public class Entity : MonoBehaviour public Rigidbody2D rb { get; private set; } public Animator anim { get; private set; } public GameObject aliveGO { get; private set; } + public AnimationToStateMachine atsm { get; private set; } [SerializeField] private Transform wallCheck; [SerializeField] private Transform ledgeCheck; @@ -28,6 +29,7 @@ public virtual void Start() aliveGO = transform.Find("Alive").gameObject; rb = aliveGO.GetComponent(); anim = aliveGO.GetComponent(); + atsm = aliveGO.GetComponent(); stateMachine = new FiniteStateMachine(); } @@ -59,12 +61,17 @@ public virtual bool CheckLedge() public virtual bool CheckPlayerInMinAgroRange() { - return Physics2D.Raycast(playerCheck.position, aliveGO.transform.right, entityData.MinAgroDistance, entityData.whatIsPlayer); + return Physics2D.Raycast(playerCheck.position, aliveGO.transform.right, entityData.minAgroDistance, entityData.whatIsPlayer); } public virtual bool CheckPlayerInMaxAgroRange() { - return Physics2D.Raycast(playerCheck.position, aliveGO.transform.right, entityData.MaxAgroDistance, entityData.whatIsPlayer); + return Physics2D.Raycast(playerCheck.position, aliveGO.transform.right, entityData.maxAgroDistance, entityData.whatIsPlayer); + } + + public virtual bool CheckPlayerInCloseRangeAction() + { + return Physics2D.Raycast(playerCheck.position, aliveGO.transform.right, entityData.closeRangeActionDistance, entityData.whatIsPlayer); } public virtual void Flip() @@ -80,7 +87,10 @@ public virtual void OnDrawGizmos() { Gizmos.DrawLine(wallCheck.position, wallCheck.position + (Vector3)(Vector2.right * facingDirection * entityData.wallCheckDistance)); Gizmos.DrawLine(ledgeCheck.position, ledgeCheck.position + (Vector3)(Vector2.down * facingDirection * entityData.ledgeCheckDistance)); - Gizmos.DrawLine(playerCheck.position, playerCheck.position + (Vector3)(Vector2.right * facingDirection * entityData.MinAgroDistance)); - Gizmos.DrawLine(playerCheck.position, playerCheck.position + (Vector3)(Vector2.right * facingDirection * entityData.MaxAgroDistance)); + + Gizmos.DrawWireSphere(playerCheck.position + (Vector3)(Vector2.right * entityData.minAgroDistance), 0.2f); + Gizmos.DrawWireSphere(playerCheck.position + (Vector3)(Vector2.right * entityData.maxAgroDistance), 0.2f); + + Gizmos.DrawWireSphere(playerCheck.position + (Vector3)(Vector2.right * entityData.closeRangeActionDistance), 0.2f); } } diff --git a/Assets/Scripts/Enemy/StateMachine/Entity.cs.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/Entity.cs.meta similarity index 100% rename from Assets/Scripts/Enemy/StateMachine/Entity.cs.meta rename to Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/Entity.cs.meta diff --git a/Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/FiniteStateMachine.cs similarity index 100% rename from Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs rename to Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/FiniteStateMachine.cs diff --git a/Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/FiniteStateMachine.cs.meta similarity index 100% rename from Assets/Scripts/Enemy/StateMachine/FiniteStateMachine.cs.meta rename to Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/FiniteStateMachine.cs.meta diff --git a/Assets/Scripts/Enemy/StateMachine/State.cs b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/State.cs similarity index 100% rename from Assets/Scripts/Enemy/StateMachine/State.cs rename to Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/State.cs diff --git a/Assets/Scripts/Enemy/StateMachine/State.cs.meta b/Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/State.cs.meta similarity index 100% rename from Assets/Scripts/Enemy/StateMachine/State.cs.meta rename to Assets/Scripts/Enemy/EnemySpecific/Enemy1/StateMachine/State.cs.meta diff --git a/Assets/Scripts/Enemy/States/AttackState.cs b/Assets/Scripts/Enemy/States/AttackState.cs new file mode 100644 index 0000000..339546e --- /dev/null +++ b/Assets/Scripts/Enemy/States/AttackState.cs @@ -0,0 +1,57 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class AttackState : State +{ + protected Transform attackPosition; + + protected bool isAnimationFinished; + protected bool isPlayerInMinAgroRange; + + public AttackState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, Transform _attackPosition) : base(_entity, _stateMachine, _animBoolName) + { + this.attackPosition = _attackPosition; + } + + public override void Enter() + { + base.Enter(); + + isAnimationFinished = false; + entity.atsm.attackState = this; + entity.SetVelocity(0.0f); + } + + public override void Exit() + { + base.Exit(); + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + } + + public override void DoChecks() + { + base.DoChecks(); + + isPlayerInMinAgroRange = entity.CheckPlayerInMinAgroRange(); + } + + public virtual void TriggerAttack() + { + + } + + public virtual void FinishAttack() + { + isAnimationFinished = true; + } +} diff --git a/Assets/Scripts/Enemy/States/AttackState.cs.meta b/Assets/Scripts/Enemy/States/AttackState.cs.meta new file mode 100644 index 0000000..b549dd5 --- /dev/null +++ b/Assets/Scripts/Enemy/States/AttackState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 61772b62954c84e47be4c694c8c90cdc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/ChargeState.cs b/Assets/Scripts/Enemy/States/ChargeState.cs index 11ec592..5981bf2 100644 --- a/Assets/Scripts/Enemy/States/ChargeState.cs +++ b/Assets/Scripts/Enemy/States/ChargeState.cs @@ -10,6 +10,7 @@ public class ChargeState : State protected bool isDetectingLedge; protected bool isDetectingWall; protected bool isChargedTimeOver; + protected bool performCloseRangeAction; public ChargeState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_ChargeState _stateData) : base(_entity, _stateMachine, _animBoolName) { @@ -46,12 +47,16 @@ public override void PhysicsUpdate() { base.PhysicsUpdate(); } + public override void DoChecks() { base.DoChecks(); isPlayerInMinAgroRange = entity.CheckPlayerInMinAgroRange(); + isDetectingWall = entity.CheckWall(); isDetectingLedge = entity.CheckLedge(); + + performCloseRangeAction = entity.CheckPlayerInCloseRangeAction(); } } diff --git a/Assets/Scripts/Enemy/States/Data/D_AttackState.cs b/Assets/Scripts/Enemy/States/Data/D_AttackState.cs new file mode 100644 index 0000000..fda3fd1 --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_AttackState.cs @@ -0,0 +1,9 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[CreateAssetMenu(fileName = "newAttackStateData", menuName = "Data/State/Attack State")] +public class D_AttackState : ScriptableObject +{ + +} diff --git a/Assets/Scripts/Enemy/States/Data/D_AttackState.cs.meta b/Assets/Scripts/Enemy/States/Data/D_AttackState.cs.meta new file mode 100644 index 0000000..38c7674 --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_AttackState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8985b142e157ef5478839ff9aec229b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/Data/D_Entity.cs b/Assets/Scripts/Enemy/States/Data/D_Entity.cs index cc3fd1f..96fb360 100644 --- a/Assets/Scripts/Enemy/States/Data/D_Entity.cs +++ b/Assets/Scripts/Enemy/States/Data/D_Entity.cs @@ -2,16 +2,17 @@ using System.Collections.Generic; using UnityEngine; -[CreateAssetMenu(fileName = "newEntityData", menuName = "Data/EntityData/BaseData")] +[CreateAssetMenu(fileName = "newEntityData", menuName = "Data/Entity Data/Base Data")] public class D_Entity : ScriptableObject // we need to create Data objects in Unity & this is something ScriptableObject allows us to do { public float wallCheckDistance = 0.2f; public float ledgeCheckDistance = 0.45f; - public float MinAgroDistance = 3f; - public float MaxAgroDistance = 4f; + public float minAgroDistance = 3f; + public float maxAgroDistance = 4f; + public float closeRangeActionDistance = 1.0f; public LayerMask whatIsGround; public LayerMask whatIsPlayer; } diff --git a/Assets/Scripts/Enemy/States/Data/D_MeleeAttack.cs b/Assets/Scripts/Enemy/States/Data/D_MeleeAttack.cs new file mode 100644 index 0000000..24e815b --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_MeleeAttack.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[CreateAssetMenu(fileName = "newMeleeAttackData", menuName = "Data/State Data/Melee Attack")] + +public class D_MeleeAttack : ScriptableObject +{ + public float attackRadius = 0.5f; + public float attackDamage = 10.0f; + + public LayerMask whatIsPlayer; +} diff --git a/Assets/Scripts/Enemy/States/Data/D_MeleeAttack.cs.meta b/Assets/Scripts/Enemy/States/Data/D_MeleeAttack.cs.meta new file mode 100644 index 0000000..e63f105 --- /dev/null +++ b/Assets/Scripts/Enemy/States/Data/D_MeleeAttack.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 560f685b14fc1394db4a9cad9df5234a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/MeleeAttackState.cs b/Assets/Scripts/Enemy/States/MeleeAttackState.cs new file mode 100644 index 0000000..581dba4 --- /dev/null +++ b/Assets/Scripts/Enemy/States/MeleeAttackState.cs @@ -0,0 +1,60 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class MeleeAttackState : AttackState +{ + protected D_MeleeAttack stateData; + + protected AttackDetails attackDetails; + + public MeleeAttackState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, Transform _attackPosition, D_MeleeAttack _stateData) : base(_entity, _stateMachine, _animBoolName, _attackPosition) + { + this.stateData = _stateData; + } + + public override void Enter() + { + base.Enter(); + + attackDetails.damageAmount = stateData.attackDamage; + attackDetails.position = entity.aliveGO.transform.position; + } + + public override void Exit() + { + base.Exit(); + } + + public override void LogicUpdate() + { + base.LogicUpdate(); + } + + public override void DoChecks() + { + base.DoChecks(); + } + + public override void PhysicsUpdate() + { + base.PhysicsUpdate(); + } + + public override void TriggerAttack() + { + base.TriggerAttack(); + + Collider2D[] detectedObjects = Physics2D.OverlapCircleAll(attackPosition.position, stateData.attackRadius, stateData.whatIsPlayer); + + foreach (Collider2D collider in detectedObjects) + { + collider.transform.SendMessage("Damage", attackDetails); + } + } + + public override void FinishAttack() + { + base.FinishAttack(); + } +} diff --git a/Assets/Scripts/Enemy/States/MeleeAttackState.cs.meta b/Assets/Scripts/Enemy/States/MeleeAttackState.cs.meta new file mode 100644 index 0000000..07ee218 --- /dev/null +++ b/Assets/Scripts/Enemy/States/MeleeAttackState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 30c4e041d3ef094489acb7a9ec2899aa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Enemy/States/PlayerDetectedState.cs b/Assets/Scripts/Enemy/States/PlayerDetectedState.cs index b45cb7d..eaafadb 100644 --- a/Assets/Scripts/Enemy/States/PlayerDetectedState.cs +++ b/Assets/Scripts/Enemy/States/PlayerDetectedState.cs @@ -9,6 +9,7 @@ public class PlayerDetectedState : State protected bool isPlayerInMinAgroRange; protected bool isPlayerInMaxAgroRange; protected bool performLongRangeAction; + protected bool performCloseRangeAction; public PlayerDetectedState(Entity _entity, FiniteStateMachine _stateMachine, string _animBoolName, D_PlayerDetectedState _stateData) : base(_entity, _stateMachine, _animBoolName) { @@ -49,7 +50,9 @@ public override void DoChecks() { base.DoChecks(); - isPlayerInMinAgroRange = entity.CheckPlayerInMinAgroRange(); - isPlayerInMaxAgroRange = entity.CheckPlayerInMaxAgroRange(); + isPlayerInMinAgroRange = entity.CheckPlayerInMinAgroRange(); // check if Player is in minimum agro range of Enemy + isPlayerInMaxAgroRange = entity.CheckPlayerInMaxAgroRange(); // check if Player is in maximum agro range of Enemy + + performCloseRangeAction = entity.CheckPlayerInCloseRangeAction(); //check for melee attack } } diff --git a/Assets/Scripts/Player/PlayerCombatController.cs b/Assets/Scripts/Player/PlayerCombatController.cs index 1aa90fe..0551bed 100644 --- a/Assets/Scripts/Player/PlayerCombatController.cs +++ b/Assets/Scripts/Player/PlayerCombatController.cs @@ -10,7 +10,7 @@ public class PlayerCombatController : MonoBehaviour private bool gotInput, isAttacking, isFirstAttack; // hold the input from player so if player hit just before he is able to hit, the player will still hit once he is able to hit private float lastInputTime = Mathf.NegativeInfinity; // will store last time player had attacked & mathf.negativeInfinity will always attack from the start of the game - private float[] attackDetails = new float[2]; + private AttackDetails attackDetails; //Ref private Animator anim; // hold the ref to Animator component private PlayerController player; @@ -69,8 +69,8 @@ private void CheckHitBox() // det { Collider2D[] detectedObject = Physics2D.OverlapCircleAll(attackHitBoxPos.position, attack1Radius, whatIsDamagable); - attackDetails[0] = attack1Damage; - attackDetails[1] = transform.position.x; + attackDetails.damageAmount = attack1Damage; + attackDetails.position = transform.position; foreach (Collider2D col in detectedObject) { @@ -86,15 +86,15 @@ private void FinishAttack1() // it anim.SetBool("attack1", false); } - private void Damage(float[] _attackDetails) + private void Damage(AttackDetails _attackDetails) { if (!player.GetDashStatus()) { int direction; - playerStats.DecreaseHealth(attackDetails[0]); // damage player here using attackDeatails[0] + playerStats.DecreaseHealth(attackDetails.damageAmount); // damage player here using attackDeatails[0] - if (_attackDetails[1] < transform.position.x) + if (attackDetails.position.x < transform.position.x) { direction = 1; } diff --git a/Assets/Scripts/Structs.meta b/Assets/Scripts/Structs.meta new file mode 100644 index 0000000..fd14517 --- /dev/null +++ b/Assets/Scripts/Structs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 876fe8bdbc059b94d8dd7247491328be +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Structs/AttackDetails.cs b/Assets/Scripts/Structs/AttackDetails.cs new file mode 100644 index 0000000..f726e0c --- /dev/null +++ b/Assets/Scripts/Structs/AttackDetails.cs @@ -0,0 +1,9 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public struct AttackDetails +{ + public Vector2 position; + public float damageAmount; +} diff --git a/Assets/Scripts/Structs/AttackDetails.cs.meta b/Assets/Scripts/Structs/AttackDetails.cs.meta new file mode 100644 index 0000000..ce50e36 --- /dev/null +++ b/Assets/Scripts/Structs/AttackDetails.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e59c46664229d84e9c3ffd68396d194 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: