Unity中实现类似《Spooky's Jumpscare Mansion》的随机房间生成及场景切换方案咨询
实现《Spooky's Jumpscare Mansion》风格的随机房间生成与开门切换效果
一、随机房间生成系统
1. 前置准备
- 制作房间预制体:所有房间必须包含统一的入口/出口锚点(创建空GameObject并命名为
RoomEntrance、RoomExit),确保锚点位置对应门的位置,保证后续生成的房间能精准衔接。 - 创建空GameObject作为
RoomManager,用于挂载生成逻辑脚本。
2. 核心生成脚本
将以下脚本挂载到RoomManager上,实现随机选预制体并生成房间:
using UnityEngine; using System.Collections.Generic; public class RoomGenerator : MonoBehaviour { [Header("房间配置")] public List<GameObject> roomPrefabs; // 拖拽所有房间预制体至该列表 public Transform currentRoom; // 当前加载的房间 private void Start() { // 初始化首个房间(可指定固定起点房间,或随机选取) SpawnInitialRoom(); } private void SpawnInitialRoom() { GameObject startRoom = Instantiate(roomPrefabs[0], transform.position, Quaternion.identity); currentRoom = startRoom.transform; } // 生成下一个随机房间 public void SpawnNextRoom() { if (roomPrefabs.Count == 0) return; // 随机选取房间预制体(若需避免重复,可添加已生成房间的索引过滤逻辑) int randomIdx = Random.Range(0, roomPrefabs.Count); GameObject nextRoomPrefab = roomPrefabs[randomIdx]; // 获取锚点并计算生成位置,确保房间衔接 Transform currentExit = currentRoom.Find("RoomExit"); Transform nextEntrance = nextRoomPrefab.transform.Find("RoomEntrance"); Vector3 spawnPos = currentExit.position - nextEntrance.localPosition; GameObject nextRoom = Instantiate(nextRoomPrefab, spawnPos, Quaternion.identity); // 销毁当前房间(按需保留或删除,若保留需管理房间池) Destroy(currentRoom.gameObject); currentRoom = nextRoom.transform; } }
二、开门淡入淡出切换逻辑
1. 淡入淡出UI设置
- 创建全屏
Image面板(命名FadePanel),颜色设为纯黑,初始透明度0,确保其位于UI层级最顶层。 - 给
FadePanel添加CanvasGroup组件,用于控制透明度渐变。
2. 门交互与渐变脚本
将门的GameObject添加碰撞体(设为Is Trigger),并挂载以下脚本:
using UnityEngine; using System.Collections; public class DoorTransition : MonoBehaviour { [Header("切换配置")] public RoomGenerator roomGenerator; public CanvasGroup fadePanel; public float fadeTime = 1f; // 渐变时长 private bool triggered = false; // 防止重复触发 private void OnTriggerEnter(Collider other) { if (other.CompareTag("Player") && !triggered) { triggered = true; StartCoroutine(FadeThenSwitchRoom()); } } private IEnumerator FadeThenSwitchRoom() { // 淡入:屏幕渐黑 float elapsed = 0f; while (elapsed < fadeTime) { fadePanel.alpha = Mathf.Lerp(0f, 1f, elapsed / fadeTime); elapsed += Time.deltaTime; yield return null; } fadePanel.alpha = 1f; // 生成下一个房间 roomGenerator.SpawnNextRoom(); // 淡出:屏幕恢复 elapsed = 0f; while (elapsed < fadeTime) { fadePanel.alpha = Mathf.Lerp(1f, 0f, elapsed / fadeTime); elapsed += Time.deltaTime; yield return null; } fadePanel.alpha = 0f; triggered = false; } }
3. 关键注意点
- 玩家对象需带有
Collider(勾选Is Trigger)和Rigidbody(启用重力),否则无法触发门的检测。 - 房间锚点位置必须严格对齐,否则生成的房间会出现错位。
- 若需避免连续生成相同房间,可在
RoomGenerator中维护一个已生成房间的索引列表,随机选取时排除这些索引。
内容的提问来源于stack exchange,提问作者Smoothbrick578
相关产品推荐
相关产品推荐

