diff --git a/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs b/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs index 48928529..300b57d6 100644 --- a/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs +++ b/Assets/_Game/Scripts/Editor/Scene/SceneObjectPlacerTool.cs @@ -532,9 +532,9 @@ namespace BaseGames.Editor } [MenuItem("BaseGames/Scene/Place/Enemy E002 (簧蛭)", priority = 112)] - public static void PlaceE002_HuangZhi() => PlaceE002_HuangZhi(EnemyBodyColliderType.Box); + public static void PlaceE002_HuangZhi() => PlaceE002_HuangZhi(EnemyBodyColliderType.Box, null); - public static void PlaceE002_HuangZhi(EnemyBodyColliderType bodyCollider) + public static void PlaceE002_HuangZhi(EnemyBodyColliderType bodyCollider, Sprite defaultSprite = null) { var report = new List(); int undoGroup = Undo.GetCurrentGroup(); @@ -549,7 +549,8 @@ namespace BaseGames.Editor rb.bodyType = RigidbodyType2D.Kinematic; rb.gravityScale = 0f; - Collider2D body = CreateBodyCollider(go, bodyCollider, new Vector2(0.5f, 0.7f)); + Vector2 size = SpriteSizeOr(defaultSprite, new Vector2(0.5f, 0.7f)); + Collider2D body = CreateBodyCollider(go, bodyCollider, size); // Visual 子节点:挂载精灵 / 动画(EnemyMovement 翻转时操作此节点) Transform visual = GetOrCreateChild(go.transform, "Visual"); @@ -557,6 +558,7 @@ namespace BaseGames.Editor GetOrAddComponent(visual.gameObject); AnimancerComponent animancer = GetOrAddComponent(visual.gameObject); SpriteRenderer sr = SetupSpriteRenderer(visual.gameObject); + if (defaultSprite != null) sr.sprite = defaultSprite; EnemyBase enemyBase = GetOrAddComponent(go); EnemyStats enemyStats = GetOrAddComponent(go); @@ -566,13 +568,9 @@ namespace BaseGames.Editor GetOrAddComponent(go); // required by EnemyNavAgent [RequireComponent] PhysicsPerceptionSystem sensorHub = GetOrAddComponent(go); - // HurtBox(component.enabled 初始为 false:仅悬挂脆弱窗口期间由能力开启) - Transform hurtBoxT = GetOrCreateChild(go.transform, "HurtBox"); - SetLayer(hurtBoxT.gameObject, "EnemyHurtBox", report); - CapsuleCollider2D hurtCap = GetOrAddComponent(hurtBoxT.gameObject); - hurtCap.isTrigger = true; - hurtCap.size = new Vector2(0.45f, 0.65f); - HurtBox hurtBox = GetOrAddComponent(hurtBoxT.gameObject); + // HurtBox + ContactDamageZone(component.enabled 初始为 false:仅悬挂脆弱窗口期间由能力开启) + var (hurtBox, bodyContact, contactHitBox) = + SetupHurtAndContactBoxes(go, size, contactEnabled: true, report); hurtBox.enabled = false; // 悬挂阶段外不可被攻击;CeilingHangStrikeAbility 在 _loopClip 期间开启 // AttackHitBox(钻出啃咬瞬间判定,由 CeilingHangStrikeAbility 激活) @@ -617,7 +615,10 @@ namespace BaseGames.Editor Object dmgSrc = FindFirstAsset("CMB_DS_EnemyBody"); if (dmgSrc != null) + { AssignReference(attackHitBox, "_defaultSource", dmgSrc, report); + AssignReference(contactHitBox, "_defaultSource", dmgSrc, report); + } SetupPerceptionSystemSlots(sensorHub, new[] { "attack_range" }, report); report.Add("★ 将此对象放置于天花板,调整位置使 CapsuleCollider 正好贴合天花板底面。"); @@ -633,9 +634,9 @@ namespace BaseGames.Editor } [MenuItem("BaseGames/Scene/Place/Enemy E003 (幼蛭)", priority = 113)] - public static void PlaceE003_YouZhi_Enemy() => PlaceE003_YouZhi_Enemy(EnemyBodyColliderType.Box); + public static void PlaceE003_YouZhi_Enemy() => PlaceE003_YouZhi_Enemy(EnemyBodyColliderType.Box, null); - public static void PlaceE003_YouZhi_Enemy(EnemyBodyColliderType bodyCollider) + public static void PlaceE003_YouZhi_Enemy(EnemyBodyColliderType bodyCollider, Sprite defaultSprite = null) { var report = new List(); int undoGroup = Undo.GetCurrentGroup(); @@ -650,12 +651,14 @@ namespace BaseGames.Editor rb.bodyType = RigidbodyType2D.Kinematic; rb.gravityScale = 0f; - Collider2D body = CreateBodyCollider(go, bodyCollider, new Vector2(0.5f, 0.6f)); + Vector2 size = SpriteSizeOr(defaultSprite, new Vector2(0.5f, 0.6f)); + 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 sr3 = SetupSpriteRenderer(visual.gameObject); + if (defaultSprite != null) sr3.sprite = defaultSprite; EnemyBase enemyBase = GetOrAddComponent(go); EnemyStats enemyStats = GetOrAddComponent(go); @@ -666,20 +669,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.45f, 0.55f); - HurtBox hurtBox = GetOrAddComponent(hurtBoxT.gameObject); - - Transform contactT = GetOrCreateChild(go.transform, "ContactDamageZone"); - SetLayer(contactT.gameObject, "EnemyHitBox", report); - CircleCollider2D contactCol = GetOrAddComponent(contactT.gameObject); - contactCol.isTrigger = true; - contactCol.radius = 0.35f; - HitBox contactHitBox = GetOrAddComponent(contactT.gameObject); - BodyContactDamage bodyContact = GetOrAddComponent(contactT.gameObject); + var (hurtBox, bodyContact, contactHitBox) = + SetupHurtAndContactBoxes(go, size, contactEnabled: true, report); Transform abilitiesT = GetOrCreateChild(go.transform, "Abilities"); Transform fallT = GetOrCreateChild(abilitiesT, "AnimatedCeilingDropAbility"); @@ -731,9 +722,9 @@ namespace BaseGames.Editor } [MenuItem("BaseGames/Scene/Place/Enemy E004 (蛭母)", priority = 114)] - public static void PlaceE004_ZhiMu_Enemy() => PlaceE004_ZhiMu_Enemy(EnemyBodyColliderType.Box); + public static void PlaceE004_ZhiMu_Enemy() => PlaceE004_ZhiMu_Enemy(EnemyBodyColliderType.Box, null); - public static void PlaceE004_ZhiMu_Enemy(EnemyBodyColliderType bodyCollider) + public static void PlaceE004_ZhiMu_Enemy(EnemyBodyColliderType bodyCollider, Sprite defaultSprite = null) { var report = new List(); int undoGroup = Undo.GetCurrentGroup(); @@ -750,12 +741,14 @@ namespace BaseGames.Editor rb.constraints = RigidbodyConstraints2D.FreezeRotation; rb.collisionDetectionMode = CollisionDetectionMode2D.Continuous; - Collider2D body = CreateBodyCollider(go, bodyCollider, new Vector2(0.8f, 1.2f)); + Vector2 size = SpriteSizeOr(defaultSprite, new Vector2(0.8f, 1.2f)); + 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 sr4 = SetupSpriteRenderer(visual.gameObject); + if (defaultSprite != null) sr4.sprite = defaultSprite; EnemyBase enemyBase = GetOrAddComponent(go); EnemyStats enemyStats = GetOrAddComponent(go); @@ -766,12 +759,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.75f, 1.1f); - HurtBox hurtBox = GetOrAddComponent(hurtBoxT.gameObject); + var (hurtBox, bodyContact, contactHitBox) = + SetupHurtAndContactBoxes(go, size, contactEnabled: true, report); Transform biteT = GetOrCreateChild(go.transform, "BiteHitBox"); SetLayer(biteT.gameObject, "EnemyHitBox", report); @@ -844,6 +833,7 @@ namespace BaseGames.Editor { AssignReference(biteHitBox, "_defaultSource", dmgSrc, report); AssignReference(slamHitBox, "_defaultSource", dmgSrc, report); + AssignReference(contactHitBox, "_defaultSource", dmgSrc, report); } // 死亡前摇无敌演出(零代码:替代过去的 E004_ZhiMu 专属 Die() 重写) @@ -862,9 +852,9 @@ namespace BaseGames.Editor } [MenuItem("BaseGames/Scene/Place/Enemy E005 (肥蛭)", priority = 115)] - public static void PlaceE005_FeiZhi_Enemy() => PlaceE005_FeiZhi_Enemy(EnemyBodyColliderType.Box); + public static void PlaceE005_FeiZhi_Enemy() => PlaceE005_FeiZhi_Enemy(EnemyBodyColliderType.Box, null); - public static void PlaceE005_FeiZhi_Enemy(EnemyBodyColliderType bodyCollider) + public static void PlaceE005_FeiZhi_Enemy(EnemyBodyColliderType bodyCollider, Sprite defaultSprite = null) { var report = new List(); int undoGroup = Undo.GetCurrentGroup(); @@ -881,12 +871,14 @@ namespace BaseGames.Editor rb.constraints = RigidbodyConstraints2D.FreezeRotation; rb.collisionDetectionMode = CollisionDetectionMode2D.Continuous; - Collider2D body = CreateBodyCollider(go, bodyCollider, new Vector2(0.9f, 1.0f)); + Vector2 size = SpriteSizeOr(defaultSprite, new Vector2(0.9f, 1.0f)); + 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 sr5 = SetupSpriteRenderer(visual.gameObject); + if (defaultSprite != null) sr5.sprite = defaultSprite; EnemyBase enemyBase = GetOrAddComponent(go); EnemyStats enemyStats = GetOrAddComponent(go); @@ -896,12 +888,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.85f, 0.95f); - HurtBox hurtBox = GetOrAddComponent(hurtBoxT.gameObject); + var (hurtBox, bodyContact, contactHitBox) = + SetupHurtAndContactBoxes(go, size, contactEnabled: true, report); Transform biteT = GetOrCreateChild(go.transform, "BiteHitBox"); SetLayer(biteT.gameObject, "EnemyHitBox", report); @@ -950,7 +938,11 @@ namespace BaseGames.Editor AssignReference(acidAbl, "_muzzle", acidMuzzleT, report); Object dmgSrc = FindFirstAsset("CMB_DS_EnemyBody"); - if (dmgSrc != null) AssignReference(biteHitBox, "_defaultSource", dmgSrc, report); + if (dmgSrc != null) + { + AssignReference(biteHitBox, "_defaultSource", dmgSrc, report); + AssignReference(contactHitBox, "_defaultSource", dmgSrc, report); + } // 死亡前摇无敌演出 + 动画事件池生成幼蛭(零代码:替代过去的 E005_FeiZhi 专属 Die()/SpawnProjectile 重写) EnemyDeathSequence deathSeq = GetOrAddComponent(go); @@ -970,9 +962,9 @@ namespace BaseGames.Editor } [MenuItem("BaseGames/Scene/Place/Enemy E006 (讙)", priority = 116)] - public static void PlaceE006_Huan() => PlaceE006_Huan(EnemyBodyColliderType.Box); + public static void PlaceE006_Huan() => PlaceE006_Huan(EnemyBodyColliderType.Box, null); - public static void PlaceE006_Huan(EnemyBodyColliderType bodyCollider) + public static void PlaceE006_Huan(EnemyBodyColliderType bodyCollider, Sprite defaultSprite = null) { var report = new List(); int undoGroup = Undo.GetCurrentGroup(); @@ -989,12 +981,14 @@ namespace BaseGames.Editor rb.constraints = RigidbodyConstraints2D.FreezeRotation; rb.collisionDetectionMode = CollisionDetectionMode2D.Continuous; - Collider2D body = CreateBodyCollider(go, bodyCollider, new Vector2(0.7f, 1.0f)); + Vector2 size = SpriteSizeOr(defaultSprite, new Vector2(0.7f, 1.0f)); + 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 sr6 = SetupSpriteRenderer(visual.gameObject); + if (defaultSprite != null) sr6.sprite = defaultSprite; EnemyBase enemyBase = GetOrAddComponent(go); EnemyStats enemyStats = GetOrAddComponent(go); @@ -1005,20 +999,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.65f, 0.95f); - HurtBox hurtBox = GetOrAddComponent(hurtBoxT.gameObject); - - Transform contactT = GetOrCreateChild(go.transform, "ContactDamageZone"); - SetLayer(contactT.gameObject, "EnemyHitBox", report); - CircleCollider2D contactCol = GetOrAddComponent(contactT.gameObject); - contactCol.isTrigger = true; - contactCol.radius = 0.4f; - HitBox contactHitBox = GetOrAddComponent(contactT.gameObject); - BodyContactDamage bodyContact = GetOrAddComponent(contactT.gameObject); + var (hurtBox, bodyContact, contactHitBox) = + SetupHurtAndContactBoxes(go, size, contactEnabled: true, report); Transform landT = GetOrCreateChild(go.transform, "LandingHitBox"); SetLayer(landT.gameObject, "EnemyHitBox", report);