diff --git a/Assets/Materials/EnemyMaterial.mat b/Assets/Materials/EnemyMaterial.mat index 346fcaf..d49dbc4 100644 --- a/Assets/Materials/EnemyMaterial.mat +++ b/Assets/Materials/EnemyMaterial.mat @@ -8,17 +8,19 @@ Material: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: EnemyMaterial - m_Shader: {fileID: 4800000, guid: e260cfa7296ee7642b167f1eb5be5023, type: 3} + m_Shader: {fileID: 4800000, guid: 4e90a8289da1f3943885176e4f83e35c, type: 3} m_Parent: {fileID: 0} m_ModifiedSerializedProperties: 0 m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 + m_InvalidKeywords: + - _EMISSION + m_LightmapFlags: 1 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 m_CustomRenderQueue: -1 stringTagMap: {} - disabledShaderPasses: [] + disabledShaderPasses: + - MOTIONVECTORS m_LockedProperties: m_SavedProperties: serializedVersion: 3 @@ -27,6 +29,30 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _BaseMap: + m_Texture: {fileID: 2800000, guid: 2d8756227812cb6418ddf659e94f7226, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} - _MainTex: m_Texture: {fileID: 2800000, guid: 2d8756227812cb6418ddf659e94f7226, type: 3} m_Scale: {x: 1, y: 1} @@ -35,16 +61,92 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} - _NormalMap: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Ints: [] m_Floats: + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 0 - _EnableExternalAlpha: 0 - - _ZWrite: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _XRMotionVectorsPass: 1 + - _ZWrite: 1 m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - _RendererColor: {r: 1, g: 1, b: 1, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + - _White: {r: 1, g: 1, b: 1, a: 1} m_BuildTextureStacks: [] m_AllowLocking: 1 +--- !u!114 &691978132743817064 +MonoBehaviour: + m_ObjectHideFlags: 11 + 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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 diff --git a/Assets/Prefabs/Enemy.prefab b/Assets/Prefabs/Enemy.prefab index c72f5c8..2b9a8a0 100644 --- a/Assets/Prefabs/Enemy.prefab +++ b/Assets/Prefabs/Enemy.prefab @@ -1,6 +1,6 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &3659626783364531313 +--- !u!1 &1440687268849026173 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8,201 +8,10 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 6163474767907971787} - - component: {fileID: 2689275992091239379} - - component: {fileID: 3349682118017606557} - - component: {fileID: 2800794347720400813} - - component: {fileID: -5761292396473217197} - - component: {fileID: 8179311635793422716} - - component: {fileID: 7188026176818599596} - - component: {fileID: 9004018437643743475} - m_Layer: 6 - m_Name: Enemy - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6163474767907971787 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3659626783364531313} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 3, y: 1, z: 3} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 644112838320947147} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &2689275992091239379 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3659626783364531313} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &3349682118017606557 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3659626783364531313} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10302, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!65 &2800794347720400813 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3659626783364531313} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!195 &-5761292396473217197 -NavMeshAgent: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3659626783364531313} - m_Enabled: 1 - m_AgentTypeID: 0 - m_Radius: 0.5 - m_Speed: 5 - m_Acceleration: 8 - avoidancePriority: 50 - m_AngularSpeed: 120 - m_StoppingDistance: 0 - m_AutoTraverseOffMeshLink: 1 - m_AutoBraking: 1 - m_AutoRepath: 1 - m_Height: 1 - m_BaseOffset: 0.5 - m_WalkableMask: 4294967295 - m_ObstacleAvoidanceType: 4 ---- !u!114 &8179311635793422716 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3659626783364531313} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1c203980d40e2bf4392783aade147dca, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::EnemyAttack - damage: 1 - attackCooldown: 3 ---- !u!114 &7188026176818599596 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3659626783364531313} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0624f93e2b743af4baf8b6459f3a64ff, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::EnemyAI ---- !u!54 &9004018437643743475 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3659626783364531313} - serializedVersion: 5 - m_Mass: 1000 - m_LinearDamping: 0 - m_AngularDamping: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 0 - m_Interpolate: 0 - m_Constraints: 112 - m_CollisionDetection: 0 ---- !u!1 &5399706329508289898 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 644112838320947147} - - component: {fileID: 961686847063583643} - - component: {fileID: 1355627780543189246} + - component: {fileID: 1267599756386386670} + - component: {fileID: 5592533808163045756} + - component: {fileID: 2237297192798623692} + - component: {fileID: 6473643533526686233} m_Layer: 6 m_Name: Quad m_TagString: Untagged @@ -210,36 +19,36 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &644112838320947147 +--- !u!4 &1267599756386386670 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5399706329508289898} + m_GameObject: {fileID: 1440687268849026173} serializedVersion: 2 m_LocalRotation: {x: 0.5, y: 0.5, z: -0.5, w: 0.5} - m_LocalPosition: {x: 0, y: 0.51, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalPosition: {x: 0, y: 1.1, z: 0} + m_LocalScale: {x: 2, y: 2, z: 0} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6163474767907971787} - m_LocalEulerAnglesHint: {x: 90, y: 90, z: 0} ---- !u!33 &961686847063583643 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: -90} +--- !u!33 &5592533808163045756 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5399706329508289898} + m_GameObject: {fileID: 1440687268849026173} m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &1355627780543189246 +--- !u!23 &2237297192798623692 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5399706329508289898} + m_GameObject: {fileID: 1440687268849026173} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -282,3 +91,221 @@ MeshRenderer: m_SortingOrder: 0 m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &6473643533526686233 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1440687268849026173} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &3659626783364531313 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6163474767907971787} + - component: {fileID: 2689275992091239379} + - component: {fileID: 3349682118017606557} + - component: {fileID: 2800794347720400813} + - component: {fileID: -5761292396473217197} + - component: {fileID: 8179311635793422716} + - component: {fileID: 7188026176818599596} + - component: {fileID: 9004018437643743475} + m_Layer: 6 + m_Name: Enemy + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6163474767907971787 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3659626783364531313} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1267599756386386670} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2689275992091239379 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3659626783364531313} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3349682118017606557 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3659626783364531313} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10652, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &2800794347720400813 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3659626783364531313} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 3, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!195 &-5761292396473217197 +NavMeshAgent: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3659626783364531313} + m_Enabled: 1 + m_AgentTypeID: 0 + m_Radius: 1 + m_Speed: 5 + m_Acceleration: 50 + avoidancePriority: 50 + m_AngularSpeed: 120 + m_StoppingDistance: 0.1 + m_AutoTraverseOffMeshLink: 1 + m_AutoBraking: 0 + m_AutoRepath: 1 + m_Height: 1 + m_BaseOffset: 0.5 + m_WalkableMask: 4294967295 + m_ObstacleAvoidanceType: 4 +--- !u!114 &8179311635793422716 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3659626783364531313} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1c203980d40e2bf4392783aade147dca, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::EnemyAttack + damage: 1 + attackRange: 5 + attackCooldown: 1 +--- !u!114 &7188026176818599596 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3659626783364531313} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0624f93e2b743af4baf8b6459f3a64ff, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::EnemyAI + _finalTarget: {fileID: 0} + _updateInterval: 0.2 + _detectionRange: 1.5 +--- !u!54 &9004018437643743475 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3659626783364531313} + serializedVersion: 5 + m_Mass: 1000 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 112 + m_CollisionDetection: 0 diff --git a/Assets/Scenes/DefenceScene.unity b/Assets/Scenes/DefenceScene.unity index 92f5677..8338979 100644 --- a/Assets/Scenes/DefenceScene.unity +++ b/Assets/Scenes/DefenceScene.unity @@ -290,9 +290,9 @@ RectTransform: - {fileID: 584961939} m_Father: {fileID: 280147083} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 232.5, y: -80} m_SizeDelta: {x: 150, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &227051992 @@ -666,7 +666,7 @@ Transform: m_GameObject: {fileID: 412220986} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0.19360995, y: 0, z: -3.13349} + m_LocalPosition: {x: 12, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -728,6 +728,7 @@ GameObject: - component: {fileID: 449450327} - component: {fileID: 449450326} - component: {fileID: 449450329} + - component: {fileID: 449450330} m_Layer: 0 m_Name: Core m_TagString: Core @@ -843,6 +844,150 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::Core maxHealth: 100 currentHealth: 100 +--- !u!208 &449450330 +NavMeshObstacle: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 449450324} + m_Enabled: 1 + serializedVersion: 3 + m_Shape: 1 + m_Extents: {x: 0.25, y: 0.25, z: 0.25} + m_MoveThreshold: 0.1 + m_Carve: 0 + m_CarveOnlyStationary: 1 + m_Center: {x: 0, y: 0, z: 0} + m_TimeToStationary: 0.5 +--- !u!1 &485353134 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 485353135} + - component: {fileID: 485353139} + - component: {fileID: 485353138} + - component: {fileID: 485353137} + - component: {fileID: 485353136} + m_Layer: 0 + m_Name: Portal_OutIn + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &485353135 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 485353134} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -6, y: 1, z: -8} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 743367988} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!114 &485353136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 485353134} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df30a5239a8f26149a53cbc492a9fba7, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Portal + destination: {fileID: 1336301788} + cooldown: 5 +--- !u!64 &485353137 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 485353134} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 1 + m_CookingOptions: 30 + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &485353138 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 485353134} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9452ae1262a74094f8a68013fbcd1834, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &485353139 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 485353134} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &584961938 GameObject: m_ObjectHideFlags: 0 @@ -1014,9 +1159,9 @@ RectTransform: - {fileID: 59717881} m_Father: {fileID: 280147083} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 387.5, y: -80} m_SizeDelta: {x: 150, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &599851511 @@ -1145,7 +1290,7 @@ Transform: m_GameObject: {fileID: 621471626} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalPosition: {x: 0, y: 9.02, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1347,6 +1492,8 @@ Transform: - {fileID: 1842105546} - {fileID: 449450325} - {fileID: 1505396057} + - {fileID: 1336301788} + - {fileID: 485353135} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1282481006 @@ -1380,6 +1527,134 @@ Transform: m_Children: [] m_Father: {fileID: 1842105546} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1336301787 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1336301788} + - component: {fileID: 1336301792} + - component: {fileID: 1336301791} + - component: {fileID: 1336301790} + - component: {fileID: 1336301789} + m_Layer: 0 + m_Name: Portal_InOut + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1336301788 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1336301787} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: -11, y: 1, z: -8} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 743367988} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!114 &1336301789 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1336301787} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df30a5239a8f26149a53cbc492a9fba7, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Portal + destination: {fileID: 485353135} + cooldown: 5 +--- !u!64 &1336301790 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1336301787} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 1 + m_CookingOptions: 30 + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1336301791 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1336301787} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9452ae1262a74094f8a68013fbcd1834, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1336301792 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1336301787} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1409253543 GameObject: m_ObjectHideFlags: 0 @@ -1398,7 +1673,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!114 &1409253544 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1495,6 +1770,7 @@ GameObject: - component: {fileID: 1505396059} - component: {fileID: 1505396058} - component: {fileID: 1505396061} + - component: {fileID: 1505396062} m_Layer: 0 m_Name: Gate m_TagString: Untagged @@ -1607,8 +1883,24 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: aca054ee474238545a8a396d410bf5a3, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::Gate - maxHealth: 50 - currentHealth: 50 + maxHealth: 10 + currentHealth: 10 +--- !u!208 &1505396062 +NavMeshObstacle: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1505396056} + m_Enabled: 1 + serializedVersion: 3 + m_Shape: 1 + m_Extents: {x: 0.4, y: 0.4, z: 0.5} + m_MoveThreshold: 0.1 + m_Carve: 1 + m_CarveOnlyStationary: 1 + m_Center: {x: 0, y: 0, z: 0} + m_TimeToStationary: 0.5 --- !u!1 &1558135260 GameObject: m_ObjectHideFlags: 0 @@ -1643,9 +1935,9 @@ RectTransform: - {fileID: 2000300136} m_Father: {fileID: 280147083} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 77.5, y: -80} m_SizeDelta: {x: 150, y: 150} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1558135262 @@ -1771,7 +2063,7 @@ Transform: m_GameObject: {fileID: 1648146733} serializedVersion: 2 m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} - m_LocalPosition: {x: 7.55436, y: 13, z: 4.26362} + m_LocalPosition: {x: 7.55436, y: 22.02, z: 4.26362} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1992,7 +2284,7 @@ Transform: m_GameObject: {fileID: 1866217602} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalPosition: {x: 10, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -2071,7 +2363,7 @@ Transform: m_GameObject: {fileID: 1883252233} serializedVersion: 2 m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} - m_LocalPosition: {x: 7.55436, y: 13, z: 4.26362} + m_LocalPosition: {x: 7.55436, y: 22.02, z: 4.26362} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -2150,7 +2442,6 @@ GameObject: - component: {fileID: 1956749384} - component: {fileID: 1956749387} - component: {fileID: 1956749386} - - component: {fileID: 1956749385} m_Layer: 0 m_Name: Quad m_TagString: Untagged @@ -2173,28 +2464,6 @@ Transform: m_Children: [] m_Father: {fileID: 449450325} m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!64 &1956749385 -MeshCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1956749383} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 5 - m_Convex: 0 - m_CookingOptions: 30 - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} --- !u!23 &1956749386 MeshRenderer: m_ObjectHideFlags: 0 diff --git a/Assets/Scenes/DefenceScene/NavMesh-Ground.asset b/Assets/Scenes/DefenceScene/NavMesh-Ground.asset index a0ef957..7c3dda5 100644 Binary files a/Assets/Scenes/DefenceScene/NavMesh-Ground.asset and b/Assets/Scenes/DefenceScene/NavMesh-Ground.asset differ diff --git a/Assets/Scripts/Enemy/EnemyAttack.cs b/Assets/Scripts/Enemy/EnemyAttack.cs index 7f7c6f1..1000268 100644 --- a/Assets/Scripts/Enemy/EnemyAttack.cs +++ b/Assets/Scripts/Enemy/EnemyAttack.cs @@ -1,26 +1,69 @@ +using System.Collections; using UnityEngine; public class EnemyAttack : MonoBehaviour { [Header("Attack Settings")] - [SerializeField] private float damage = 10f; - [SerializeField] private float attackCooldown = 1.0f; // 공격 간격 (1초) + public float damage = 10f; + public float attackRange = 2.0f; + public float attackCooldown = 1.0f; - private float _nextAttackTime = 0f; + private Material _enemyMaterial; + private float _nextAttackTime; + private Transform _target; + private IDamageable _targetDamageable; - // EnemyAttack.cs - private void OnCollisionStay(Collision collision) + // 쉐이더 프로퍼티 ID (문자열보다 성능이 좋음) + private static readonly int EmissionColorProp = Shader.PropertyToID("_EmissionColor"); + + void Update() { - if (Time.time >= _nextAttackTime) + // 이동 스크립트로부터 현재 목표를 실시간으로 가져옵니다. + if (_target == null) { - // 상대방에게서 IDamageable 인터페이스가 있는지 확인 - IDamageable target = collision.gameObject.GetComponent(); + // EnemyMoveDefault에서 _target을 public이나 프로퍼티로 만들어 가져오세요 + _target = GetComponent().Target; + if (_target != null) _targetDamageable = _target.GetComponent(); + return; + } - if (target != null) + float distance = Vector3.Distance(transform.position, _target.position); + + // 사거리 안에 있고 타겟이 살아있을 때만 공격 + if (distance <= attackRange) + { + if (Time.time >= _nextAttackTime) { - target.TakeDamage(damage); - _nextAttackTime = Time.time + attackCooldown; + Attack(); } } } + + private void Attack() + { + if (_target == null) return; + + if (_targetDamageable == null) + { + _targetDamageable = _target.GetComponentInParent(); + } + + if (_targetDamageable != null) + { + _targetDamageable.TakeDamage(damage); + _nextAttackTime = Time.time + attackCooldown; + } + else + { + // 대상이 IDamageable이 아니거나 이미 파괴됨 + _target = null; + } + } + + public void SetAttackTarget(Transform newTarget) + { + _target = newTarget; + if (_target != null) + _targetDamageable = _target.GetComponent(); + } } \ No newline at end of file diff --git a/Assets/Scripts/Enemy/EnemyMoveDefault.cs b/Assets/Scripts/Enemy/EnemyMoveDefault.cs index dac8a16..3031b05 100644 --- a/Assets/Scripts/Enemy/EnemyMoveDefault.cs +++ b/Assets/Scripts/Enemy/EnemyMoveDefault.cs @@ -1,45 +1,129 @@ +using System.Collections; using UnityEngine; -using UnityEngine.AI; // NavMesh 기능을 위해 필수 +using UnityEngine.AI; -public class EnemyAI : MonoBehaviour +[RequireComponent(typeof(NavMeshAgent))] +public class EnemyMoveDefault : MonoBehaviour { + [Header("Movement Settings")] + [SerializeField] private Transform _finalTarget; // 최종 목적지 (Core) + [SerializeField] private float _updateInterval = 0.2f; // 경로 갱신 간격 + [SerializeField] private float _detectionRange = 1.5f; // 전방 장애물 감지 거리 + + private Transform _currentTarget; // 현재 추적 중인 대상 private NavMeshAgent _agent; - private Transform _target; + private EnemyAttack _attackScript; + private Coroutine _pathUpdateCoroutine; + + // EnemyAttack 스크립트에서 현재 타겟을 참조하기 위한 프로퍼티 + public Transform Target => _currentTarget; void Awake() { _agent = GetComponent(); + _attackScript = GetComponent(); + + // 인스펙터에서 비어있다면 태그로 자동으로 찾음 + if (_finalTarget == null) + { + GameObject core = GameObject.FindWithTag("Core"); // Core 오브젝트에 "Core" 태그를 달아주세요. + if (core != null) _finalTarget = core.transform; + } + + _currentTarget = _finalTarget; } - void Start() + void OnEnable() { - // --- 2번 방법: 위치 보정 로직 시작 --- - // 현재 위치에서 반경 2.0f 이내에 가장 가까운 NavMesh가 있는지 검사합니다. - if (NavMesh.SamplePosition(transform.position, out NavMeshHit hit, 2.0f, NavMesh.AllAreas)) - { - // 에이전트를 해당 위치로 강제 순간이동(Warp) 시킵니다. - // 이 작업은 에러를 방지하고 에이전트를 활성화합니다. - _agent.Warp(hit.position); - } - else - { - Debug.LogError($"{gameObject.name} 근처에 NavMesh를 찾을 수 없습니다! 스폰 위치를 확인하세요."); - } - // --- 2번 방법 끝 --- + if (_pathUpdateCoroutine != null) StopCoroutine(_pathUpdateCoroutine); + _pathUpdateCoroutine = StartCoroutine(UpdatePathRoutine()); + } - // 기존 타겟(Core) 설정 로직 - GameObject coreObj = GameObject.FindWithTag("Core"); - if (coreObj != null) + void OnDisable() + { + if (_pathUpdateCoroutine != null) StopCoroutine(_pathUpdateCoroutine); + } + + IEnumerator UpdatePathRoutine() + { + // Agent가 NavMesh에 배치될 시간을 줌 + yield return null; + WaitForSeconds delay = new WaitForSeconds(_updateInterval); + + while (true) { - _target = coreObj.transform; + // 1. 타겟 유효성 체크: 타겟이 파괴되었으면 다시 코어로 설정 + if (_currentTarget == null || !_currentTarget.gameObject.activeInHierarchy) + { + _currentTarget = _finalTarget; + _agent.isStopped = false; + } + + if (_currentTarget != null && _agent.isOnNavMesh) + { + float distance = Vector3.Distance(transform.position, _currentTarget.position); + + // 2. 공격 사거리 체크 (EnemyAttack의 사거리 참조) + if (distance <= _attackScript.attackRange) + { + // 사거리 안이면 멈춤 + _agent.isStopped = true; + _agent.velocity = Vector3.zero; + } + else + { + // 3. 사거리 밖이면 전방 장애물(성벽 등) 감지 + DetectObstacle(); + + // 4. 장애물 때문에 멈춘 게 아니라면 목적지로 전진 + if (!_agent.isStopped) + { + _agent.SetDestination(_currentTarget.position); + } + } + } + yield return delay; } } - void FixedUpdate() + /// + /// 레이캐스트를 쏴서 전방에 길을 막는 IDamageable(성벽)이 있는지 확인 + /// + private void DetectObstacle() { - if (_target != null && _agent.isOnNavMesh) + RaycastHit hit; + // 적의 위치(발밑)보다 약간 위(가슴 높이)에서 전방으로 레이 발사 + Vector3 rayOrigin = transform.position + Vector3.up * 1.0f; + + // Scene 뷰에서 레이를 시각적으로 확인 (디버깅용) + Debug.DrawRay(rayOrigin, transform.forward * _detectionRange, Color.yellow); + + if (Physics.Raycast(rayOrigin, transform.forward, out hit, _detectionRange)) { - _agent.SetDestination(_target.position); + // 부딪힌 대상에게서 IDamageable 인터페이스 확인 + IDamageable damageable = hit.collider.GetComponentInParent(); + + // 대상이 존재하고, 그 대상이 현재 코어가 아닐 때 (즉, 가로막는 성벽일 때) + if (damageable != null && hit.collider.transform != _finalTarget) + { + _currentTarget = hit.collider.transform; + + // 공격 스크립트에도 즉시 새로운 타겟을 알려줌 + _attackScript.SetAttackTarget(_currentTarget); + + // 일단 멈추고 다음 루프에서 사거리 체크를 받도록 함 + _agent.isStopped = true; + _agent.velocity = Vector3.zero; + } } } + + /// + /// 외부(스패너 등)에서 최종 목적지를 설정해줄 때 사용 + /// + public void SetFinalTarget(Transform target) + { + _finalTarget = target; + _currentTarget = target; + } } \ No newline at end of file diff --git a/Assets/Scripts/GameBase/Gate.cs b/Assets/Scripts/GameBase/Gate.cs index cf1577a..e311a33 100644 --- a/Assets/Scripts/GameBase/Gate.cs +++ b/Assets/Scripts/GameBase/Gate.cs @@ -1,19 +1,34 @@ using UnityEngine; using System; -// Gate.cs public class Gate : MonoBehaviour, IDamageable { [SerializeField] private float maxHealth = 50f; [SerializeField] private float currentHealth = 50f; private float CurrentHealth; + // 체력이 변경될 때 UI 등에 알리기 위한 이벤트 (Observer 패턴) + public static event Action OnHealthChanged; + public static event Action OnGateDestroyed; + void Awake() => currentHealth = maxHealth; public void TakeDamage(float amount) { currentHealth -= amount; - if (currentHealth <= 0) + OnHealthChanged?.Invoke(currentHealth / maxHealth); + + if (currentHealth <= 0) + { gameObject.SetActive(false); + var obstacle = GetComponent(); + if(obstacle != null) + { + obstacle.carving = false; + obstacle.enabled = false; + } + OnGateDestroyed?.Invoke(); + Destroy(gameObject, 0.1f); + } } } \ No newline at end of file diff --git a/Assets/Scripts/GameBase/Portal.cs b/Assets/Scripts/GameBase/Portal.cs index 2753cb2..30ac377 100644 --- a/Assets/Scripts/GameBase/Portal.cs +++ b/Assets/Scripts/GameBase/Portal.cs @@ -11,17 +11,22 @@ public class Portal : MonoBehaviour // 플레이어 태그 확인 및 쿨타임 체크 if (other.CompareTag("Player") && Time.time > _lastTeleportTime + cooldown) { - // 상대방 포탈의 쿨타임도 같이 설정해야 무한 루프를 방지함 + CharacterController cc = other.GetComponent(); + + // 1. 상대방 포탈 쿨타임 설정 Portal destPortal = destination.GetComponent(); if (destPortal != null) destPortal._lastTeleportTime = Time.time; - _lastTeleportTime = Time.time; - // 플레이어 위치 이동 - // CharacterController나 Rigidbody를 사용 중이라면 이동 방식에 주의 - other.transform.position = destination.position; + // 2. CharacterController 잠시 끄기 (중요!) + if (cc != null) cc.enabled = false; + // 3. 위치 이동 + other.transform.position = destination.position; Debug.Log("Teleported to " + destination.name); + + // 4. 다시 켜기 + if (cc != null) cc.enabled = true; } } } \ No newline at end of file