refactor(scaffold): E001 用统一助手建 Box HurtBox/接触伤害区 + sprite 尺寸参数

This commit is contained in:
2026-07-20 16:11:18 +08:00
parent 3124b2bba2
commit 8efd5e2207
@@ -435,9 +435,9 @@ namespace BaseGames.Editor
// ══ 具体敌人快速放置 ════════════════════════════════════════════════════
[MenuItem("BaseGames/Scene/Place/Enemy E001 (草蛭)", priority = 111)]
public static void PlaceE001_CaoZhi() => PlaceE001_CaoZhi(EnemyBodyColliderType.Box);
public static void PlaceE001_CaoZhi() => PlaceE001_CaoZhi(EnemyBodyColliderType.Box, null);
public static void PlaceE001_CaoZhi(EnemyBodyColliderType bodyCollider)
public static void PlaceE001_CaoZhi(EnemyBodyColliderType bodyCollider, Sprite defaultSprite = null)
{
var report = new List<string>();
int undoGroup = Undo.GetCurrentGroup();
@@ -454,12 +454,14 @@ namespace BaseGames.Editor
rb.constraints = RigidbodyConstraints2D.FreezeRotation;
rb.collisionDetectionMode = CollisionDetectionMode2D.Continuous;
Collider2D body = CreateBodyCollider(go, bodyCollider, new Vector2(0.6f, 0.8f));
Vector2 size = SpriteSizeOr(defaultSprite, new Vector2(0.6f, 0.8f));
Collider2D body = CreateBodyCollider(go, bodyCollider, size);
Transform visual = GetOrCreateChild(go.transform, "Visual");
visual.localPosition = (Vector3)(Vector2)body.offset;
GetOrAddComponent<Animator>(visual.gameObject);
AnimancerComponent animancer = GetOrAddComponent<AnimancerComponent>(visual.gameObject);
SpriteRenderer sr1 = SetupSpriteRenderer(visual.gameObject);
if (defaultSprite != null) sr1.sprite = defaultSprite;
EnemyBase enemyBase = GetOrAddComponent<EnemyBase>(go);
EnemyStats enemyStats = GetOrAddComponent<EnemyStats>(go);
@@ -470,25 +472,8 @@ namespace BaseGames.Editor
GetOrAddComponent<TransformBasedMovement>(go); // required by EnemyNavAgent [RequireComponent]
PhysicsPerceptionSystem sensorHub = GetOrAddComponent<PhysicsPerceptionSystem>(go);
Transform hurtBoxT = GetOrCreateChild(go.transform, "HurtBox");
SetLayer(hurtBoxT.gameObject, "EnemyHurtBox", report);
CapsuleCollider2D hurtCap = GetOrAddComponent<CapsuleCollider2D>(hurtBoxT.gameObject);
hurtCap.isTrigger = true;
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);
CircleCollider2D contactCol = GetOrAddComponent<CircleCollider2D>(contactT.gameObject);
contactCol.isTrigger = true;
contactCol.radius = 0.4f;
AlignColliderBottomToPivot(contactCol); // 底部对齐 y=0
HitBox contactHitBox = GetOrAddComponent<HitBox>(contactT.gameObject);
BodyContactDamage bodyContact = GetOrAddComponent<BodyContactDamage>(contactT.gameObject);
bodyContact.enabled = false; // 伪装/待机期不伤人;由 e001_chase 能力在追击期开启
EnsureCollidersAreTriggers(contactT.gameObject); // 兜底:无论碰撞体类型都为 trigger
var (hurtBox, bodyContact, contactHitBox) =
SetupHurtAndContactBoxes(go, size, contactEnabled: false, report); // E001 伪装期不伤,追击能力开
// Model AAI 只决策触发哪个能力(Idle/Patrol/Alert 已改为纯移动意图,由 EnemyLocomotion 执行,无需挂能力组件)
Transform abilitiesT = GetOrCreateChild(go.transform, "Abilities");