refactor(scaffold): E001 用统一助手建 Box HurtBox/接触伤害区 + sprite 尺寸参数
This commit is contained in:
@@ -435,9 +435,9 @@ namespace BaseGames.Editor
|
|||||||
// ══ 具体敌人快速放置 ════════════════════════════════════════════════════
|
// ══ 具体敌人快速放置 ════════════════════════════════════════════════════
|
||||||
|
|
||||||
[MenuItem("BaseGames/Scene/Place/Enemy E001 (草蛭)", priority = 111)]
|
[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>();
|
var report = new List<string>();
|
||||||
int undoGroup = Undo.GetCurrentGroup();
|
int undoGroup = Undo.GetCurrentGroup();
|
||||||
@@ -454,12 +454,14 @@ namespace BaseGames.Editor
|
|||||||
rb.constraints = RigidbodyConstraints2D.FreezeRotation;
|
rb.constraints = RigidbodyConstraints2D.FreezeRotation;
|
||||||
rb.collisionDetectionMode = CollisionDetectionMode2D.Continuous;
|
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");
|
Transform visual = GetOrCreateChild(go.transform, "Visual");
|
||||||
visual.localPosition = (Vector3)(Vector2)body.offset;
|
visual.localPosition = (Vector3)(Vector2)body.offset;
|
||||||
GetOrAddComponent<Animator>(visual.gameObject);
|
GetOrAddComponent<Animator>(visual.gameObject);
|
||||||
AnimancerComponent animancer = GetOrAddComponent<AnimancerComponent>(visual.gameObject);
|
AnimancerComponent animancer = GetOrAddComponent<AnimancerComponent>(visual.gameObject);
|
||||||
SpriteRenderer sr1 = SetupSpriteRenderer(visual.gameObject);
|
SpriteRenderer sr1 = SetupSpriteRenderer(visual.gameObject);
|
||||||
|
if (defaultSprite != null) sr1.sprite = defaultSprite;
|
||||||
|
|
||||||
EnemyBase enemyBase = GetOrAddComponent<EnemyBase>(go);
|
EnemyBase enemyBase = GetOrAddComponent<EnemyBase>(go);
|
||||||
EnemyStats enemyStats = GetOrAddComponent<EnemyStats>(go);
|
EnemyStats enemyStats = GetOrAddComponent<EnemyStats>(go);
|
||||||
@@ -470,25 +472,8 @@ namespace BaseGames.Editor
|
|||||||
GetOrAddComponent<TransformBasedMovement>(go); // required by EnemyNavAgent [RequireComponent]
|
GetOrAddComponent<TransformBasedMovement>(go); // required by EnemyNavAgent [RequireComponent]
|
||||||
PhysicsPerceptionSystem sensorHub = GetOrAddComponent<PhysicsPerceptionSystem>(go);
|
PhysicsPerceptionSystem sensorHub = GetOrAddComponent<PhysicsPerceptionSystem>(go);
|
||||||
|
|
||||||
Transform hurtBoxT = GetOrCreateChild(go.transform, "HurtBox");
|
var (hurtBox, bodyContact, contactHitBox) =
|
||||||
SetLayer(hurtBoxT.gameObject, "EnemyHurtBox", report);
|
SetupHurtAndContactBoxes(go, size, contactEnabled: false, report); // E001 伪装期不伤,追击能力开
|
||||||
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
|
|
||||||
|
|
||||||
// Model A:AI 只决策触发哪个能力(Idle/Patrol/Alert 已改为纯移动意图,由 EnemyLocomotion 执行,无需挂能力组件)
|
// Model A:AI 只决策触发哪个能力(Idle/Patrol/Alert 已改为纯移动意图,由 EnemyLocomotion 执行,无需挂能力组件)
|
||||||
Transform abilitiesT = GetOrCreateChild(go.transform, "Abilities");
|
Transform abilitiesT = GetOrCreateChild(go.transform, "Abilities");
|
||||||
|
|||||||
Reference in New Issue
Block a user