You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:27:44