This commit is contained in:
2026-05-19 15:30:27 +08:00
parent ee0f659c97
commit 0559d2cd36
3 changed files with 295 additions and 5 deletions

View File

@@ -499,6 +499,110 @@ namespace BaseGames.Editor
MarkDirtyAndLog("Room Transition", go, report);
}
[MenuItem("BaseGames/Scene/Place/Door Transition", priority = 141)]
public static void PlaceDoorTransition()
{
var report = new List<string>();
int undoGroup = Undo.GetCurrentGroup();
Undo.SetCurrentGroupName("Place Door Transition");
GameObject go = new GameObject("DoorTransition");
Undo.RegisterCreatedObjectUndo(go, "Place Door Transition");
go.transform.position = GetDropPosition();
SetLayer(go, "TriggerZone", report);
// 触发碰撞体(门宽×门高)
BoxCollider2D col = GetOrAddComponent<BoxCollider2D>(go);
col.isTrigger = true;
col.size = new Vector2(1.5f, 2.5f);
// 精灵渲染器 + 动画(门对象通常有外观与开关动画)
SetupSpriteRenderer(go);
GetOrAddComponent<Animator>(go);
AnimancerComponent animancer = GetOrAddComponent<AnimancerComponent>(go);
// DoorTransition 组件
DoorTransition door = GetOrAddComponent<DoorTransition>(go);
AssignBool(door, "_autoTrigger", false); // 默认需玩家按交互键
AssignReference(door, "_animancer", animancer, report);
AssignAsset(door, "_onSceneLoadRequest", report, false, "EVT_SceneLoadRequest");
report.Add("填写 _targetSceneAddress目标场景 Addressable Key与 _targetTransitionId目标 PlayerSpawnPoint 的 _transitionId。");
report.Add("将开门动画片段拖入 _openClip若目标场景有玩家从门中走出的动画拖入 _enterClip 并在目标场景 PlayerSpawnPoint._exitDoor 引用该侧的 DoorTransition。");
report.Add("过渡类型默认 Room极短淡出若跨大区域将 _transitionType 改为 Scene。");
report.Add("若需钥匙解锁,设 _requiresKeyItem = true 并填写 _requiredItemId。");
Undo.CollapseUndoOperations(undoGroup);
Selection.activeGameObject = go;
MarkDirtyAndLog("Door Transition", go, report);
}
[MenuItem("BaseGames/Scene/Place/Linked Door Pair (Same-Scene)", priority = 142)]
public static void PlaceLinkedDoorPair()
{
var report = new List<string>();
int undoGroup = Undo.GetCurrentGroup();
Undo.SetCurrentGroupName("Place Linked Door Pair");
Vector3 basePos = GetDropPosition();
// ── 门 A ─────────────────────────────────────────────────────────
GameObject goA = new GameObject("LinkedDoor_A");
Undo.RegisterCreatedObjectUndo(goA, "Place LinkedDoor_A");
goA.transform.position = basePos + new Vector3(-3f, 0f, 0f);
SetLayer(goA, "TriggerZone", report);
BoxCollider2D colA = GetOrAddComponent<BoxCollider2D>(goA);
colA.isTrigger = true;
colA.size = new Vector2(1.5f, 2.5f);
SetupSpriteRenderer(goA);
GetOrAddComponent<Animator>(goA);
AnimancerComponent animancerA = GetOrAddComponent<AnimancerComponent>(goA);
LinkedDoorTransition doorA = GetOrAddComponent<LinkedDoorTransition>(goA);
AssignBool(doorA, "_autoTrigger", true);
AssignReference(doorA, "_animancer", animancerA, report);
AssignInt(doorA, "_facingDirectionOnArrive", 1); // 朝右走出
// ── 门 B ─────────────────────────────────────────────────────────
GameObject goB = new GameObject("LinkedDoor_B");
Undo.RegisterCreatedObjectUndo(goB, "Place LinkedDoor_B");
goB.transform.position = basePos + new Vector3(3f, 0f, 0f);
SetLayer(goB, "TriggerZone", report);
BoxCollider2D colB = GetOrAddComponent<BoxCollider2D>(goB);
colB.isTrigger = true;
colB.size = new Vector2(1.5f, 2.5f);
SetupSpriteRenderer(goB);
GetOrAddComponent<Animator>(goB);
AnimancerComponent animancerB = GetOrAddComponent<AnimancerComponent>(goB);
LinkedDoorTransition doorB = GetOrAddComponent<LinkedDoorTransition>(goB);
AssignBool(doorB, "_autoTrigger", true);
AssignReference(doorB, "_animancer", animancerB, report);
AssignInt(doorB, "_facingDirectionOnArrive", -1); // 朝左走出
// ── 互相绑定 ─────────────────────────────────────────────────────
AssignReference(doorA, "_linkedDoor", doorB, report);
AssignReference(doorB, "_linkedDoor", doorA, report);
report.Add("LinkedDoor_A ↔ LinkedDoor_B 已互相绑定。");
report.Add("将两扇门分别移到场景中正确位置(如两个区域的入口处)。");
report.Add("调整 _spawnOffset 使玩家传送后不被触发器再次捕获(如偏移 1f 让玩家落在门外侧)。");
report.Add("_facingDirectionOnArriveA→B 时玩家朝向由 B 的该值决定B→A 反之。");
report.Add("若需门动画,将 AnimationClip 拖入各自的 _openClip / _enterClip。");
Undo.CollapseUndoOperations(undoGroup);
// 选中 A便于立即调整位置
Selection.activeGameObject = goA;
MarkDirtyAndLog("Linked Door Pair (Same-Scene)", goA, report);
}
[MenuItem("BaseGames/Scene/Place/Camera Area", priority = 140)]
public static void PlaceCameraArea() => PlaceCameraArea("CameraArea");