From f54c4b35b9a6db52090fac481b61831aeac46e8c Mon Sep 17 00:00:00 2001 From: Dal4segno Date: Tue, 13 Jan 2026 11:24:32 +0900 Subject: [PATCH] =?UTF-8?q?Enemy=EC=9D=98=20=EC=9D=B4=EB=8F=99=20=EB=B0=8F?= =?UTF-8?q?=20=EA=B3=B5=EA=B2=A9=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 포탈 추가 --- Assets/Materials/EnemyMaterial.mat | 112 ++++- Assets/Prefabs/Enemy.prefab | 437 ++++++++++-------- Assets/Scenes/DefenceScene.unity | 349 ++++++++++++-- .../Scenes/DefenceScene/NavMesh-Ground.asset | Bin 24392 -> 22380 bytes Assets/Scripts/Enemy/EnemyAttack.cs | 65 ++- Assets/Scripts/Enemy/EnemyMoveDefault.cs | 132 +++++- Assets/Scripts/GameBase/Gate.cs | 19 +- Assets/Scripts/GameBase/Portal.cs | 15 +- 8 files changed, 837 insertions(+), 292 deletions(-) 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 a0ef9571af30626f9753ca712f19a746d070e414..7c3dda526dca1aa93c8b27004e20206643c31d3b 100644 GIT binary patch literal 22380 zcmeHP3v^UPwylOv2#kzDbPyROih!Rd5~3jTNe6<0@)HnHkk}-h(2(EjbRZzg1rY<{ z4(dX?XeI5lQwpl4W* zpCQ|9m{9llnG&~bg~ah&dGLT()IwM>JwDdZ-1=L4`n%WP#)AjMP~vwFk%oPL1Kh$a zs?hoZxnv()z+uBc$i!Pp`*or*V4JqUrKPxkOK}19olY0l{aX(n5N}Z5VbqTC52t54 zi*C9k&Yw-~?HU-xT<-bX0e4`DPoz5L$M{D8w;Y9l2+H}VQ4{d?9z4Uv|485=y6F-S znJ)fEQM-HoOtFUeF@Nk6Hy#v=$+tDs4sIPhc!umhhuUGkqkZrzHQvz&U#jtAeDLKO z@8pBuuJPad;2Si4tPlQx#*g#CH*37J5B`kCbA0fv8b96#->GrzbGQAKed!F4_U+<> zf28pfeef?e-qi;`r15S(cqTa){_UQCx1`o=0=m*QfUuM3%C_jH3!g9j3CI3BnJ&Z; z7vO6t_J?Zx6atdr<1~(QE*XBQ#{a_ypP}*7eDIkX@8N?l()j5<_$rO}OoHS5{*%UY zli+I!->mUoNpSRkM&o%t_zsQZtWUHL`oE>|Gn3$WKke6e?<6?-f2(nN&w0jgPcN<0 z=pq$y7I2Ghy5Ri7`I4vczSN!_VibMU`Pz?goNs3Xw@lo9zV`zjGI96$+8?+BQ*^Zy zLuqWBZzHH3F>2yCU%w`7Jn4i88|c9^WPFwpj`+>@!DnbZ~$z#|OV!2&OeaLxc8?!|F{UaGd#_oDL&Ns2kd*X#B*$ofM_N6-(H#@`)`sD{*lHf z`{4UEeu)QH`PCd*Emq2_Fnqfs?KaJEmx2WR_~dT=#=R!cR1nFn{z zk36-x`J+BK&rfzr=&$_Kj^;;v&H!%FO_xOflv8_i{;2@Yo#_etb)>Q3pB$=J(&ffm zN&BCo`BzCCnyTPi!nA)iHM{vMobCUgJ~;D_d2ls9ed9_0t2{i1v{Xr)KTgff&0p(- z^ZYYCcq@6n^`iL^sk0|RqO8;F%I@mv#OFW0}s^EM!{dWa5yX~iN_TM}oob6|Ma5aBe z&p+RTyXRlvgY*1X`rthOLJuC4{K{y4`0px-(@htg@7K`zTTM6}F=7#2Zuy^KCI|MnV3M^PkVRB@)ZAHQ-;GuD-6fO zV)W>EtpAXbXuK*mq%Iz*tcg}t4iptd=S0gR!wN|l9ga^ULF$c;MM}d{hgH_Z!zRDst?KB72&OqM_lMX=3W^c%)`h&r7tB%R(;}@>n>7g)>>`%|ag*&SIf2 z3%SnF_Sm`h;JNnbx%Tk6G`?QieptZHHA@SQ&ADE z91|%cCltgYVNnsTtPPhBj+B>=jn0XPVir_8tS;N*EKCIjH9kyF{p-%FnmVB>HX{bX?UrFt&adr`d?)q7FB7uEBqo=5dO zs^{g2xEe8d`-<`t7>D#><#J(wm@bPHoB@Ns?`dN@WY0dFAC9c z5`L<2%2IrB|BL0f)L(Cm)6R_{N`$}<1v}{)Uof%|2k-Zkocur+iE<@440$1VG2#+p zO(Wgb3z5^fxW2xzWJ}+I#r0W@O-)sUX3bhnZCU;6sa{W5qWsx`;~H59GDgRb6DTb# zVM&2*m=kk5MQOE=KMSHyhQx#70ntxPbkq!K>uEKYudCVk`a^e4S$N^>fj^o&5B&t5 z;6}qqp4(p@?&1lIxdBU*!Hsp2^9)*8>QCVbJ+ei>kLR0RV|QG$YUO<+%bw}`NbA46 z_5=;e{)8{tpRjTkUCP>mQhs%9qxF-h{h8(BSy*_MC`6*wtY~Hu;UcT8TaRvqYsx$r_BH4AC;d?dTPZR?~JH= z>{ZjB_=6me>E}=Kh2hWo26KNdu79-wzJfnLKX9KdQ>;o^#jWF8j0Ju8>WFqbqz>e= zQq>nS_x&mUgy(p_n;vC<;Y0NQhCgT9{(Oua*PK5mUA5}%fBd!mu09>JHoSLN#y#da zMDDcx>DWL;0%8Lf>`M>1Kj|sl{#1U0?SZkcSk~u|?OW6S>bwnF(B-)ytK!`kXlI^U z$@REBdi)1-9$5Ooo|*?nJQ~XXZ<8k!Ic|9_JW-gZs_{8gA2N9YV{T-RP@=5PSf!(6 zC(eFto?mtTs_dy@=PX!u+2!}I_;lFCCQoom#S`l%H9l_(OrCCTSp^PHC2N05{^{m9 z=uiLic&pz$(fO*wzMQE zylnGl*)I;h@Wv}gn*PKYn~Epa%sk0|E}qOspOZFE=)t$($vWxw=Q|zyFCEqT*?G?u z^?CN;Rc)R#dD6a4$rEd4o|FT+crqXGtedsk=E<`1r^7kHpEPXHqTA0nhc?>hFZ!8f z$mFIex0PPEdw<5Z(A|?yJly1o_ch+3(8pc{Z#+?)b4ca4qLxNY9fx#TD_zh$1tB-_x1Ckk?1)H%NePh6%yIltZg&ZiCAURL?)=LZhZ`%=l! z=lm8j=fKccdm1)!@>|HC9q1js|h!;7(v}u-TEn^SsY++%=h(6O^_{k3pP+E$h zrJ|JW>Ac;5XIiSa>W?!kL*`MyfI2ooe}%WA`C9|#JzzoR@gb|CMmFy%F4cOJt(A=L ziDYq%`OJJ8V+F)f)TW+^I5nflc=$%|RUz|d5#X~}(4PzYiI5yasUyD@^53edy6VsQ z`5-+WF!kf8!ZDuuF%Z(1m6Or9x9EeJQ(rOT5wVym9uXrn zl-zgNUuHaVevbIMWu?lu5l5VRqp!YX+;I*MeT+qzZ0GzOy6?VouWVOw?Zlv?U*Djj zQN^2zMtqIIKPo;T{eL`)fD@0%|IK);ONd8>tDON$`o|-_9~ehGZnoKAm-_dY(JhCr&P1t|95C`;-@kmeoeWBiWW{dz+@g?=OjCgY5 z4spWYcgVXlt)NBSj5tCK<>$W#E<1hqmdRtj>(^ybyea(l;b)pWF(U6fKc3K`!uw8t zUnrgcm>cm4d1bk0ZO-ZBIkQVedG5Y8XP(*b{rkrr)!{gkC%C2JiS?73=9#7QG~1sB zH9d4Xo zgQp|QbI|6TPJgzawC#c(*0SQ)tUjgf%N8AP^2EC@6;G_$@h5*@D1SP9um@Fst^CQd z%b3fayV_lD^2E87iYM03Je}_gJ8m_H`Ud`{08dAjaqGuZ z{QPqW-xu=Oq9wV@k=Go&tF-TlhbkW)8$E2mtuLB9k#C@&hyOXm-xtznG9QJ$`F(*p ze_xm~IP>r4kiBsWZD(#(!`*w{s&@%~KTpoH&7;K&TQ@e|bHo|9)VJt<_VJezAwEpC^Pk(J~YTL?;E#w9$&|@BWqF{ZvoNpcZPIko>e~Un$ zzeP+Lc4i&Om?d5B^4uA#7Kw^KKDp-PU4MV+%2T_TJaJB-U~PUpapn^&V+(6_$Cf`Lo8gJG zg8871!aP}4xZ)4_y?5Sus;u5L>V~i;F-!U346%maoJ~FSCQ%56ZcGFUH1!2 zXpwvm?G?Xov6mJH9CIa>Gdk~G{(O1&@?Fp7$6npMagu3s=yGgfzu=2U?QQ4Wf({jq zEtw~x0XD~z?MyZeCCacf>#)prE-T$TFi}=^R=)TJHm9kA7TxT90$CNsitmXwPOR%r zzBU)q=ADF}&39kY_CQV9#H|OHbegi@^yv%D{R|(m%{eyMZ&)8L*peRF<|=2UI>)(T zXO-6hBirluy?j?l9cAo#F|Ns z_mGPx^T8U3lk}k}gD2~x+n-&Yp1t+XsO_j6GYkDzKk^l6-%ADX;7k4=F zDf8?{&dOtBuO>VD!HpovlVZ@t6PWf@2w0+wu~`T5_LnC%21G+XWaOraGUciHtOMC= zm!O5d>=W~Sn<){X4z6mrgPn6vJnIwdQkjNnE@u@oXLbI4gYF|AH=R@0`@)ecYWKc! zbLjnX)kDlZaw|!k5W9TyiUcIljE@t`eT-K<*c1PjK-eW z`q2%0{&&Zs{>xfVGqBc4g-OaT>N-q{iMTt$i>s-MqDKyGkJP zjkEVXysGu47qeGAcUXMLD3d4N#i@8=&7{V0>*DF~0pEI?rz5-bLCj|4308C80Lk+N z=Wl4VCRb@Z|JvfSzq@t7k8O8XtQekuy2;bb+rihY8+p9V)5(X}pAI+9fe^orEaTSC zpTBB8w0m9GnSn!dmsd@``oVWkdt|=J6ZsJ5@_sy>d`S9CzCVS?k@*nkJ)a*q&d7nX z3Y;9sk)dPyGu3x=qCZuRioZLLbNP`glW#v~!e5Wtw{cUCbFUr$WrOG6wWi`pG1y3B zQQWGWNBwP3@dSoF2@aeOnKJsY4rCWk@k{?bQ*xf4Zr%8oeajlA9lU$s^w^Rq(@lRO zA4PlPB__R6N1W z;mLpNWq&%{$Zrj#D}Bo{xS>DVA*a)yH_T`lb;%cPe^|4i@z@J;?`|@A63w5$lk*|@ zev$bQ?@#6fA7Y!h3KiZ{Pm|5k9}zNgNe{>Zq#^Lm&(v9?tHgbo$CKWWV} zA7Y*Wm>aM}S#fi6rgZvqarl&>uik$CmTRl7eSP2T6StW>1GLUmJh6UK(>zr^#5~>H zWQ^*#RWf+8j^gaRKWWTg`2HM6UA^VWtpnc5uY0!jCGC!zKlrO5rl1GJc&N!!y`z+E;M-(*0@h3r z$E}Me^8q*V8(sD}BxUeqopk%N%TagDeq!fsU$nSr*WZ?G=yArY57R`f09uA(f@5{(cjX} z7$ihU{_Rb9RfO;)->AQzz{x4fCl}ltf=X%Wnu0|iucTZ*2X?WX%gW#QoE4(F_~6Js G^7&7K(}xuR literal 24392 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 QWV4f?clEa;PS(%=2WaM@_W%F@ 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