linkdoor
This commit is contained in:
@@ -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("_facingDirectionOnArrive:A→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");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user