From 3124b2bba2fcfa6fada380a951744d71829759e4 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Mon, 20 Jul 2026 16:01:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(scaffold):=20=E6=96=B0=E5=A2=9E=20SpriteSi?= =?UTF-8?q?zeOr=20/=20SetupHurtAndContactBoxes=20=E5=8A=A9=E6=89=8B(Box=20?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=20HurtBox/=E6=8E=A5=E8=A7=A6=E4=BC=A4?= =?UTF-8?q?=E5=AE=B3=E5=8C=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/Scene/SceneObjectPlacerTool.cs | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs b/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs index ec2a8b6e..5ee3e35b 100644 --- a/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs +++ b/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs @@ -2304,6 +2304,44 @@ namespace BaseGames.Editor c.isTrigger = true; } + /// Sprite 有则用其世界包围盒尺寸(sprite.bounds.size),否则回退。 + private static Vector2 SpriteSizeOr(Sprite s, Vector2 fallback) + => s != null ? (Vector2)s.bounds.size : fallback; + + /// + /// 建/更新 HurtBox 与 ContactDamageZone 两个子节点:均为 BoxCollider2D、同尺寸 size、 + /// 底部对齐 y=0、isTrigger=true。ContactDamageZone 带 HitBox + BodyContactDamage。 + /// contactEnabled:BodyContactDamage 初始启用状态(不需要接触伤害的敌人可传 false 或后续置节点非激活)。 + /// 返回 (hurtBox, bodyContact, contactHitBox) 供上层按需接线(如伤害源/能力引用)。 + /// + private static (HurtBox hurt, BodyContactDamage contact, HitBox contactHitBox) + SetupHurtAndContactBoxes(GameObject root, Vector2 size, bool contactEnabled, List report) + { + // HurtBox 子节点 + var hurtT = GetOrCreateChild(root.transform, "HurtBox"); + SetLayer(hurtT.gameObject, "EnemyHurtBox", report); + var hurtCol = GetOrAddComponent(hurtT.gameObject); + hurtCol.size = size; + hurtCol.isTrigger = true; + AlignColliderBottomToPivot(hurtCol); + var hurtBox = GetOrAddComponent(hurtT.gameObject); + EnsureCollidersAreTriggers(hurtT.gameObject); + + // ContactDamageZone 子节点 + var contactT = GetOrCreateChild(root.transform, "ContactDamageZone"); + SetLayer(contactT.gameObject, "EnemyHitBox", report); + var contactCol = GetOrAddComponent(contactT.gameObject); + contactCol.size = size; + contactCol.isTrigger = true; + AlignColliderBottomToPivot(contactCol); + var contactHitBox = GetOrAddComponent(contactT.gameObject); + var bodyContact = GetOrAddComponent(contactT.gameObject); + bodyContact.enabled = contactEnabled; + EnsureCollidersAreTriggers(contactT.gameObject); + + return (hurtBox, bodyContact, contactHitBox); + } + private static void AssignReference(Object target, string propName, Object value, List report = null) { var so = new SerializedObject(target);