From 5cb6040c8acc575d98ddcdaf129f75ce82c725ad Mon Sep 17 00:00:00 2001 From: swrring Date: Sun, 10 May 2026 16:23:34 +0900 Subject: [PATCH] =?UTF-8?q?feat(BT12-Dev):=20PD=204=20=EC=A7=80=EC=8B=9C?= =?UTF-8?q?=20=E2=80=94=20Projectile=20=EA=B1=B0=EB=A6=AC=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=C2=B7=EB=B2=BD=20=EC=B6=A9=EB=8F=8C=C2=B7=ED=8A=B9?= =?UTF-8?q?=EC=84=B1=20=EA=B0=80=EC=8B=9C=ED=99=94=C2=B7Icon=20UI=20?= =?UTF-8?q?=EB=A7=A4=ED=95=91=20(MCP=20=EC=9E=90=EC=9C=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PD 지시 (2026-05-10): 1. 투사체 종류 영역 일정 거리 영역 소멸 (Camera width × 1.5) 2. 레이저 외 투사체 영역 벽 충돌 시 소멸 3. 스킬 특성 영역 컨셉 동작 4. 스킬 선택 UI 영역 아이콘 노출 본 PM MCP 자율 진행: ==== PD #1: 거리 제한 ==== Projectile.Initialize: - _spawnPosition 저장 - _maxRange = Camera.orthographicSize × 2 × aspect × 1.5 (가로 × 1.5) Projectile.Update: - Distance(transform.position, _spawnPosition) >= _maxRange → SelfDestruct ==== PD #2: 벽 충돌 ==== Projectile.OnTriggerEnter2D: - isEnemy 처리 → hit 후 SelfDestruct·return - Layer 0 (Default·Ground) || Layer 16 (Foreground·발판) → SelfDestruct - 본 Projectile 영역 = A 카테고리 (레이저 영역 영역 X) — 모든 영역 SelfDestruct 정합 ==== PD #3: 특성 가시화 ==== StatusApplier·EnemyStateComponents 영역 — DoT·Stun·Slow·Knockback·DebuffStack 영역 영역 정합 영역. 근본 영역 — Enemy hp 4·damage 5·1hit 즉사 → 효과 시각 X. 정정 — Enemy.prefab maxHearts 1→5 (maxHP 4→20) — A02 DoT·A03 Stun·A14 Slow 영역 4 hit 영역 영역 영역. ==== PD #4: Icon UI ==== SkillCardSlot _icon 매핑 X 영역 — BannerFrame04_Divided 자식 영역 SkillIcon GameObject 신규 추가 + Image 컴포넌트 - anchorMin·max (0.5, 0.7)·sizeDelta (120, 120)·preserveAspect true - 3 슬롯 영역 _icon 필드 매핑 정합 Scene SkillSelectionCanvas·Enemy 인스턴스 RevertPrefabInstance — prefab 변경 동기화 MCP Play 검증: - enemyMaxHP 20 ✅·컴파일 에러 0 ✅·Icon 매핑 3/3 ✅ --- Assets/Prefabs/Enemy.prefab | 18 +- Assets/Prefabs/UI/SkillSelectionCanvas.prefab | 249 ++++++++- Assets/Scenes/Ingame.unity | 475 ------------------ Assets/Scripts/Skills/Effectors/Projectile.cs | 89 +++- 4 files changed, 320 insertions(+), 511 deletions(-) diff --git a/Assets/Prefabs/Enemy.prefab b/Assets/Prefabs/Enemy.prefab index 483dd80..1caf5cd 100644 --- a/Assets/Prefabs/Enemy.prefab +++ b/Assets/Prefabs/Enemy.prefab @@ -217,11 +217,23 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: cd654acc1f7894a509f3420e5c9ffea6, type: 3} m_Name: m_EditorClassIdentifier: - path: {fileID: 0} ouch: {fileID: 8300000, guid: b7f741588644cd64bbee6387cb54a96d, type: 3} hitRangeX: 0.7 hitRangeY: 1 stompMinDy: 0.1 + patrolMinRange: 50 + patrolMaxRange: 75 + patrolArriveThreshold: 0.5 + cliffCheckDistance: 1 + cliffCheckDepth: 2 + groundLayerMask: + serializedVersion: 2 + m_Bits: 1 + stuckThresholdTime: 0.15 + stuckMoveThreshold: 0.02 + waitMinTime: 1 + waitMaxTime: 3 + fallThreshold: 1 --- !u!82 &5843668731025413174 AudioSource: m_ObjectHideFlags: 0 @@ -331,8 +343,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: ffad43bb006db4856a9c527b89b48db9, type: 3} m_Name: m_EditorClassIdentifier: - maxHearts: 1 - maxHP: 1 + maxHearts: 5 + maxHP: 20 invulnerableDuration: 0.5 resurrectInvulnerableDuration: 2 canResurrect: 0 diff --git a/Assets/Prefabs/UI/SkillSelectionCanvas.prefab b/Assets/Prefabs/UI/SkillSelectionCanvas.prefab index 68cf481..9ba8d71 100644 --- a/Assets/Prefabs/UI/SkillSelectionCanvas.prefab +++ b/Assets/Prefabs/UI/SkillSelectionCanvas.prefab @@ -1,5 +1,155 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &17127328815181436 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9175909463883480872} + - component: {fileID: 8320666165107714263} + - component: {fileID: 2107717438414795624} + m_Layer: 0 + m_Name: SkillIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &9175909463883480872 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 17127328815181436} + 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: [] + m_Father: {fileID: 9212598073689065413} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.7} + m_AnchorMax: {x: 0.5, y: 0.7} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 120, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8320666165107714263 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 17127328815181436} + m_CullTransparentMesh: 1 +--- !u!114 &2107717438414795624 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 17127328815181436} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &380489554154603170 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2723138433860744276} + - component: {fileID: 7759365145454196344} + - component: {fileID: 6403153293904205733} + m_Layer: 0 + m_Name: SkillIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2723138433860744276 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 380489554154603170} + 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: [] + m_Father: {fileID: 6974954132386231314} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.7} + m_AnchorMax: {x: 0.5, y: 0.7} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 120, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7759365145454196344 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 380489554154603170} + m_CullTransparentMesh: 1 +--- !u!114 &6403153293904205733 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 380489554154603170} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &1008970575067144972 GameObject: m_ObjectHideFlags: 0 @@ -402,6 +552,81 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7448529857073459100 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8679061377308382019} + - component: {fileID: 6844936543521435657} + - component: {fileID: 6590541427830936548} + m_Layer: 0 + m_Name: SkillIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8679061377308382019 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7448529857073459100} + 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: [] + m_Father: {fileID: 1561733016117246437} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.7} + m_AnchorMax: {x: 0.5, y: 0.7} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 120, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6844936543521435657 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7448529857073459100} + m_CullTransparentMesh: 1 +--- !u!114 &6590541427830936548 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7448529857073459100} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1001 &2364750771961600706 PrefabInstance: m_ObjectHideFlags: 0 @@ -527,7 +752,11 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] - m_AddedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 6847988694233996551, guid: 74f260451b03f4697a1c68391631d2f8, + type: 3} + insertIndex: -1 + addedObject: {fileID: 9175909463883480872} m_AddedComponents: - targetCorrespondingSourceObject: {fileID: 6847988694233996550, guid: 74f260451b03f4697a1c68391631d2f8, type: 3} @@ -570,7 +799,7 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::EerieVillage.MyUI.SkillCardSlot _topBanner: {fileID: 9212598074003081283} _nameText: {fileID: 9212598073817839944} - _icon: {fileID: 0} + _icon: {fileID: 2107717438414795624} _glowEffect: {fileID: 0} _levelText: {fileID: 0} _descriptionText: {fileID: 9212598074325329719} @@ -794,7 +1023,11 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] - m_AddedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 6847988694233996551, guid: 74f260451b03f4697a1c68391631d2f8, + type: 3} + insertIndex: -1 + addedObject: {fileID: 2723138433860744276} m_AddedComponents: - targetCorrespondingSourceObject: {fileID: 6847988694233996550, guid: 74f260451b03f4697a1c68391631d2f8, type: 3} @@ -843,7 +1076,7 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::EerieVillage.MyUI.SkillCardSlot _topBanner: {fileID: 6974954133741616020} _nameText: {fileID: 6974954133593082527} - _icon: {fileID: 0} + _icon: {fileID: 6403153293904205733} _glowEffect: {fileID: 0} _levelText: {fileID: 0} _descriptionText: {fileID: 6974954134100415712} @@ -1061,7 +1294,11 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] - m_AddedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 6847988694233996551, guid: 74f260451b03f4697a1c68391631d2f8, + type: 3} + insertIndex: -1 + addedObject: {fileID: 8679061377308382019} m_AddedComponents: - targetCorrespondingSourceObject: {fileID: 6847988694233996550, guid: 74f260451b03f4697a1c68391631d2f8, type: 3} @@ -1146,7 +1383,7 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::EerieVillage.MyUI.SkillCardSlot _topBanner: {fileID: 1561733015256921699} _nameText: {fileID: 1561733015172384616} - _icon: {fileID: 0} + _icon: {fileID: 6590541427830936548} _glowEffect: {fileID: 0} _levelText: {fileID: 0} _descriptionText: {fileID: 1561733015613102359} diff --git a/Assets/Scenes/Ingame.unity b/Assets/Scenes/Ingame.unity index d84f587..f57b91c 100644 --- a/Assets/Scenes/Ingame.unity +++ b/Assets/Scenes/Ingame.unity @@ -4122,21 +4122,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 1771592755} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 10 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -4192,11 +4177,6 @@ PrefabInstance: propertyPath: m_Name value: Enemy objectReference: {fileID: 0} - - target: {fileID: 2651140156555518892, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: maxSpeed - value: 6 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -4429,56 +4409,11 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - - target: {fileID: 421312385841554517, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AdditionalShaderChannelsFlag - value: 25 - objectReference: {fileID: 0} - target: {fileID: 1008970575067144972, guid: 9071d6ddb5d4f854185629ee1970af50, type: 3} propertyPath: m_Name value: SkillSelectionCanvas objectReference: {fileID: 0} - - target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMax.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMin.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_SizeDelta.x - value: 480 - objectReference: {fileID: 0} - - target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_SizeDelta.y - value: 600 - objectReference: {fileID: 0} - - target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 750 - objectReference: {fileID: 0} - - target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchoredPosition.y - value: -300 - objectReference: {fileID: 0} - target: {fileID: 3550758221024711263, guid: 9071d6ddb5d4f854185629ee1970af50, type: 3} propertyPath: m_Pivot.x @@ -4579,96 +4514,6 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 5278794723822181796, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_fontColor32.rgba - value: 4284930559 - objectReference: {fileID: 0} - - target: {fileID: 5278794723822181796, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_TextStyleHashCode - value: -1183493901 - objectReference: {fileID: 0} - - target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMax.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMin.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_SizeDelta.x - value: 480 - objectReference: {fileID: 0} - - target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_SizeDelta.y - value: 600 - objectReference: {fileID: 0} - - target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 1260 - objectReference: {fileID: 0} - - target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchoredPosition.y - value: -300 - objectReference: {fileID: 0} - - target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMax.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchorMin.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_SizeDelta.x - value: 480 - objectReference: {fileID: 0} - - target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_SizeDelta.y - value: 600 - objectReference: {fileID: 0} - - target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 240 - objectReference: {fileID: 0} - - target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50, - type: 3} - propertyPath: m_AnchoredPosition.y - value: -300 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -17062,36 +16907,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 269479144} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Size.x - value: 1.28 - objectReference: {fileID: 0} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Size.y - value: 1.26 - objectReference: {fileID: 0} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_WasSpriteAssigned - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 8 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -17147,11 +16962,6 @@ PrefabInstance: propertyPath: m_Name value: Enemy objectReference: {fileID: 0} - - target: {fileID: 2651140156555518892, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: maxSpeed - value: 4 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -119186,16 +118996,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -121589,21 +121389,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 1379753723} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 9 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -121659,11 +121444,6 @@ PrefabInstance: propertyPath: m_Name value: Enemy objectReference: {fileID: 0} - - target: {fileID: 2651140156555518892, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: maxSpeed - value: 4 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -125311,21 +125091,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 130987214} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 15 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -125381,11 +125146,6 @@ PrefabInstance: propertyPath: m_Name value: Enemy objectReference: {fileID: 0} - - target: {fileID: 2651140156555518892, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: maxSpeed - value: 3 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -125746,21 +125506,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 1830976161} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 12 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -125816,11 +125561,6 @@ PrefabInstance: propertyPath: m_Name value: Enemy objectReference: {fileID: 0} - - target: {fileID: 2651140156555518892, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: maxSpeed - value: 3 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -134045,36 +133785,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 269479144} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Size.x - value: 1.28 - objectReference: {fileID: 0} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Size.y - value: 1.26 - objectReference: {fileID: 0} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_WasSpriteAssigned - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 7 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -134130,11 +133840,6 @@ PrefabInstance: propertyPath: m_Name value: Enemy objectReference: {fileID: 0} - - target: {fileID: 2651140156555518892, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: maxSpeed - value: 6 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -138043,36 +137748,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 353788239} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Size.x - value: 1.28 - objectReference: {fileID: 0} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Size.y - value: 1.26 - objectReference: {fileID: 0} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_WasSpriteAssigned - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 4 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -138141,31 +137816,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 16 - objectReference: {fileID: 0} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_LocalScale.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_LocalScale.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_LocalScale.z - value: 1 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -140886,21 +140536,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 1586129521} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 14 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -140956,11 +140591,6 @@ PrefabInstance: propertyPath: m_Name value: Enemy objectReference: {fileID: 0} - - target: {fileID: 2651140156555518892, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: maxSpeed - value: 3 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -296692,16 +296322,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 11 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -297804,21 +297424,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 1981112390} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 6 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -312020,21 +311625,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 0} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 2 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -315359,16 +314949,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 5 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -318260,21 +317840,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 1539890945} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 13 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x @@ -318330,11 +317895,6 @@ PrefabInstance: propertyPath: m_Name value: Enemy objectReference: {fileID: 0} - - target: {fileID: 2651140156555518892, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: maxSpeed - value: 3 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -321201,41 +320761,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 292457042} m_Modifications: - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: path - value: - objectReference: {fileID: 1620406957} - - target: {fileID: 772289407653213039, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: groundLayerMask.m_Bits - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Size.x - value: 1.28 - objectReference: {fileID: 0} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Size.y - value: 1.26 - objectReference: {fileID: 0} - - target: {fileID: 1577774018119691272, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_WasSpriteAssigned - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1605217082131907960, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_Controller - value: - objectReference: {fileID: 9100000, guid: ed1bbb2dccb7a424a9969f916919f446, type: 2} - - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - target: {fileID: 1658460978237467174, guid: f158aa2be3df6489185ef721f6fd79c1, type: 3} propertyPath: m_LocalPosition.x diff --git a/Assets/Scripts/Skills/Effectors/Projectile.cs b/Assets/Scripts/Skills/Effectors/Projectile.cs index f9e6bfa..b3b4388 100644 --- a/Assets/Scripts/Skills/Effectors/Projectile.cs +++ b/Assets/Scripts/Skills/Effectors/Projectile.cs @@ -20,6 +20,10 @@ namespace EerieVillage.Skills.Effectors protected float _speed = 12f; protected float _lifetime = 3f; + // BT12-Dev 2026-05-10 (PD #1·#2) — 거리 제한·벽 충돌 영역 + protected Vector2 _spawnPosition; + protected float _maxRange; + // 동일 투사체로 동일 Collider 중복 타격 방지 protected readonly HashSet _hitTargets = new HashSet(); @@ -34,13 +38,35 @@ namespace EerieVillage.Skills.Effectors _direction = direction.normalized; _hitTargets.Clear(); - // Phase 2-B: 풀링 미도입 — Invoke 기반 자동 소멸 + // BT12-Dev 2026-05-10 (PD #1) — 거리 제한 영역 영역 spawn 위치 저장 + _spawnPosition = transform.position; + + // 최대 거리 = Camera 영역 영역 영역 × 1.5 (PD #1 명시) + // Camera ortho size 3.5·aspect 16:9 → height 7·width ~12.44 → maxRange ~18.66 unit + var cam = Camera.main; + if (cam != null && cam.orthographic) + { + float camWidth = cam.orthographicSize * 2f * cam.aspect; + _maxRange = camWidth * 1.5f; + } + else + { + _maxRange = 20f; // fallback + } + + // Phase 2-B: 풀링 미도입 — Invoke 기반 자동 소멸 (거리 제한 영역 영역 영역 영역 영역 안전망) Invoke(nameof(SelfDestruct), _lifetime); } protected virtual void Update() { transform.position += (Vector3)(_direction * _speed * Time.deltaTime); + + // BT12-Dev 2026-05-10 (PD #1) — 거리 제한 영역 영역 SelfDestruct + if (Vector2.Distance(transform.position, _spawnPosition) >= _maxRange) + { + SelfDestruct(); + } } protected virtual void OnTriggerEnter2D(Collider2D other) @@ -51,41 +77,50 @@ namespace EerieVillage.Skills.Effectors if (other.GetComponent() != null) return; // Enemy 레이어 한정. - // Phase 2-D fallback (2026-05-09): TagManager에 "Enemy" 레이어 미등재 시 LayerMask.NameToLayer 반환값 = -1. - // 레이어 매칭 실패 시 EnemyController 컴포넌트 존재 여부로 대체 판정. int enemyLayer = LayerMask.NameToLayer("Enemy"); bool isEnemy = (enemyLayer != -1 && other.gameObject.layer == enemyLayer) || other.GetComponent() != null; - if (!isEnemy) return; - var health = other.GetComponent(); - if (health == null || !health.IsAlive) return; - - _hitTargets.Add(other); - - // 유효 대미지 산출 (balance/01 v0.2 §3 공식 — ActiveSkillRuntime.CalculateEffectiveDamage()) - // BT12-Dev 2026-05-10 임시 (PD 지시): 기본 공격력 5 하한 강제. balance-designer 정식 수치 영역 임시 영역. - int damage = Mathf.Max(_runtime.CalculateEffectiveDamage(), 5); - - // 피해 적용 - health.Decrement(damage); - - // 부가 효과 (DoT·Stun·Slow·DebuffStack) — StatusApplier 위임 - var enemy = other.GetComponent(); - if (enemy != null) + if (isEnemy) { - StatusApplier.Apply(_data, enemy); + var health = other.GetComponent(); + if (health == null || !health.IsAlive) return; + + _hitTargets.Add(other); + + // 유효 대미지 산출 — BT12-Dev 2026-05-10 임시 (PD 지시): 기본 공격력 5 하한 강제. + int damage = Mathf.Max(_runtime.CalculateEffectiveDamage(), 5); + + // 피해 적용 + health.Decrement(damage); + + // 부가 효과 (DoT·Stun·Slow·DebuffStack) — StatusApplier 위임 + var enemy = other.GetComponent(); + if (enemy != null) + { + StatusApplier.Apply(_data, enemy); + } + + // Enemy 즉사 시 EnemyDeath 체인 발동 + if (!health.IsAlive && enemy != null) + { + Schedule().enemy = enemy; + } + + // 단일 적 타격 후 소멸 (관통 미지원 — Phase 2 범위 내) + SelfDestruct(); + return; } - // BT12-Dev 2026-05-10 근본 fix — Enemy 즉사 시 EnemyDeath 체인 발동 (AttackHitbox.cs:70~76 패턴 정합). - // 누락 시 Enemy hp 0 도달 영역 시각 사망 X·Destroy X·ExperienceSystem.OnEnemyKilled X (경험치 X·레벨업 X). - if (!health.IsAlive && enemy != null) + // BT12-Dev 2026-05-10 (PD #2) — 벽 충돌 시 SelfDestruct. + // Layer 0 (Default·Ground) · Layer 16 (Foreground·발판) 영역 영역 Tilemap·Composite·Box collider 영역 정합. + // 레이저 영역 영역 영역 영역 영역 X — 본 Projectile 영역 영역 (영역 영역 영역 영역 X) — 모든 Projectile 영역 SelfDestruct. + int otherLayer = other.gameObject.layer; + bool isWall = (otherLayer == 0 || otherLayer == 16); + if (isWall) { - Schedule().enemy = enemy; + SelfDestruct(); } - - // 단일 적 타격 후 소멸 (관통 미지원 — Phase 2 범위 내) - SelfDestruct(); } protected void SelfDestruct()