fix(scaffold): 兜底把 HurtBox/接触伤害节点所有碰撞体设为 trigger

脚手架原本只对自己创建的具体类型(Capsule/Circle)设 isTrigger=true;若碰撞体被
手动换成别的类型(如 BoxCollider2D,默认 isTrigger=false),那条就漏掉——E001 的
HurtBox/ContactDamageZone 被换成 Box 后 isTrigger 掉回 false,导致受击/接触伤害
的 trigger 判定失效。

新增 EnsureCollidersAreTriggers 助手,对节点全部 Collider2D 兜底设 trigger;
PlaceE001 的 HurtBox 与 ContactDamageZone 建好后调用。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
This commit is contained in:
2026-07-20 14:50:00 +08:00
parent d7be0cc119
commit b8360ec426
@@ -477,6 +477,7 @@ namespace BaseGames.Editor
hurtCap.size = new Vector2(0.55f, 0.75f);
AlignColliderBottomToPivot(hurtCap); // 底部对齐 y=0
HurtBox hurtBox = GetOrAddComponent<HurtBox>(hurtBoxT.gameObject);
EnsureCollidersAreTriggers(hurtBoxT.gameObject); // 兜底:无论碰撞体类型都为 trigger
Transform contactT = GetOrCreateChild(go.transform, "ContactDamageZone");
SetLayer(contactT.gameObject, "EnemyHitBox", report);
@@ -487,6 +488,7 @@ namespace BaseGames.Editor
HitBox contactHitBox = GetOrAddComponent<HitBox>(contactT.gameObject);
BodyContactDamage bodyContact = GetOrAddComponent<BodyContactDamage>(contactT.gameObject);
bodyContact.enabled = false; // 伪装/待机期不伤人;由 e001_chase 能力在追击期开启
EnsureCollidersAreTriggers(contactT.gameObject); // 兜底:无论碰撞体类型都为 trigger
// Model AAI 只决策触发哪个能力(Idle/Patrol/Alert 已改为纯移动意图,由 EnemyLocomotion 执行,无需挂能力组件)
Transform abilitiesT = GetOrCreateChild(go.transform, "Abilities");
@@ -2291,6 +2293,17 @@ namespace BaseGames.Editor
go.layer = layer;
}
/// <summary>
/// 把节点上所有 Collider2D 设为 trigger。HurtBox/HitBox/接触伤害语义要求碰撞体为 trigger;
/// 只对脚手架创建的具体类型(Capsule/Circle)设 isTrigger 不够——若碰撞体被手动换成别的类型
/// (如 BoxCollider2D,默认 isTrigger=false),那条就漏掉。此助手对该节点全部碰撞体兜底设 trigger。
/// </summary>
private static void EnsureCollidersAreTriggers(GameObject go)
{
foreach (var c in go.GetComponents<Collider2D>())
c.isTrigger = true;
}
private static void AssignReference(Object target, string propName, Object value, List<string> report = null)
{
var so = new SerializedObject(target);