diff --git a/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs b/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs index 5ee3e35b..48928529 100644 --- a/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs +++ b/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs @@ -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(); 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(visual.gameObject); AnimancerComponent animancer = GetOrAddComponent(visual.gameObject); SpriteRenderer sr1 = SetupSpriteRenderer(visual.gameObject); + if (defaultSprite != null) sr1.sprite = defaultSprite; EnemyBase enemyBase = GetOrAddComponent(go); EnemyStats enemyStats = GetOrAddComponent(go); @@ -470,25 +472,8 @@ namespace BaseGames.Editor GetOrAddComponent(go); // required by EnemyNavAgent [RequireComponent] PhysicsPerceptionSystem sensorHub = GetOrAddComponent(go); - Transform hurtBoxT = GetOrCreateChild(go.transform, "HurtBox"); - SetLayer(hurtBoxT.gameObject, "EnemyHurtBox", report); - CapsuleCollider2D hurtCap = GetOrAddComponent(hurtBoxT.gameObject); - hurtCap.isTrigger = true; - hurtCap.size = new Vector2(0.55f, 0.75f); - AlignColliderBottomToPivot(hurtCap); // 底部对齐 y=0 - HurtBox hurtBox = GetOrAddComponent(hurtBoxT.gameObject); - EnsureCollidersAreTriggers(hurtBoxT.gameObject); // 兜底:无论碰撞体类型都为 trigger - - Transform contactT = GetOrCreateChild(go.transform, "ContactDamageZone"); - SetLayer(contactT.gameObject, "EnemyHitBox", report); - CircleCollider2D contactCol = GetOrAddComponent(contactT.gameObject); - contactCol.isTrigger = true; - contactCol.radius = 0.4f; - AlignColliderBottomToPivot(contactCol); // 底部对齐 y=0 - HitBox contactHitBox = GetOrAddComponent(contactT.gameObject); - BodyContactDamage bodyContact = GetOrAddComponent(contactT.gameObject); - bodyContact.enabled = false; // 伪装/待机期不伤人;由 e001_chase 能力在追击期开启 - EnsureCollidersAreTriggers(contactT.gameObject); // 兜底:无论碰撞体类型都为 trigger + var (hurtBox, bodyContact, contactHitBox) = + SetupHurtAndContactBoxes(go, size, contactEnabled: false, report); // E001 伪装期不伤,追击能力开 // Model A:AI 只决策触发哪个能力(Idle/Patrol/Alert 已改为纯移动意图,由 EnemyLocomotion 执行,无需挂能力组件) Transform abilitiesT = GetOrCreateChild(go.transform, "Abilities");