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

Unity地牢房间生成器位置偏移与生成数量限制问题求助

地牢房间生成器问题修复:位置偏移与数量限制

一、房间生成位置偏移问题修复

1. 预制体原点(Pivot)校准

房间生成偏移的核心原因是房间预制体的原点未与对应门的SpawnPoint位置对齐:

  • 针对不同openingDirection,比如openingDirection=1需要生成带底部门的房间,需将该房间预制体的根GameObject的Pivot点,拖拽到其底部门的SpawnPoint位置(在Inspector面板的Transform组件中调整)。
  • 若不想修改Pivot,可在Instantiate时手动添加位置偏移,示例:
    // 假设底部门到预制体原点的偏移为Vector2(0, 4)
    Instantiate(templates.bottomRooms[rand], transform.position + new Vector3(0, 4, 0), templates.bottomRooms[rand].transform.rotation);
    

2. 代码逻辑优化

代码中存在局部变量rand重复定义的冗余问题,可简化为switch结构提升可读性:

private void Spawn()
{
    if (spawned) return;

    switch(openingDirection)
    {
        case 1:
            rand = UnityEngine.Random.Range(0, templates.bottomRooms.Length);
            Instantiate(templates.bottomRooms[rand], transform.position, templates.bottomRooms[rand].transform.rotation);
            break;
        case 2:
            rand = UnityEngine.Random.Range(0, templates.topRooms.Length);
            Instantiate(templates.topRooms[rand], transform.position, templates.topRooms[rand].transform.rotation);
            break;
        case 3:
            rand = UnityEngine.Random.Range(0, templates.leftRooms.Length);
            Instantiate(templates.leftRooms[rand], transform.position, templates.leftRooms[rand].transform.rotation);
            break;
        case 4:
            rand = UnityEngine.Random.Range(0, templates.rightRooms.Length);
            Instantiate(templates.rightRooms[rand], transform.position, templates.rightRooms[rand].transform.rotation);
            break;
    }
    spawned = true;
}

3. 碰撞检测验证

确保所有SpawnPoint的Collider2D组件勾选Is Trigger,且房间预制体内的SpawnPoint位置严格对应门的位置,保证OnTriggerEnter2D能正确销毁重叠的SpawnPoint。

二、限制房间生成数量实现

1. 在RoomTemplates中添加计数变量

打开RoomTemplates脚本,新增全局计数与上限控制变量:

public class RoomTemplates : MonoBehaviour
{
    public GameObject[] bottomRooms;
    public GameObject[] topRooms;
    public GameObject[] leftRooms;
    public GameObject[] rightRooms;

    // 房间数量限制配置
    public int maxRoomCount = 15;
    public int currentRoomCount = 0;
}

2. 在Spawn方法中加入数量判断

修改RoomSpawner的Spawn方法,生成前先检查房间数是否达标:

private void Spawn()
{
    if (spawned || templates.currentRoomCount >= templates.maxRoomCount)
    {
        Destroy(gameObject);
        return;
    }

    switch(openingDirection)
    {
        case 1:
            rand = UnityEngine.Random.Range(0, templates.bottomRooms.Length);
            Instantiate(templates.bottomRooms[rand], transform.position, templates.bottomRooms[rand].transform.rotation);
            break;
        case 2:
            rand = UnityEngine.Random.Range(0, templates.topRooms.Length);
            Instantiate(templates.topRooms[rand], transform.position, templates.topRooms[rand].transform.rotation);
            break;
        case 3:
            rand = UnityEngine.Random.Range(0, templates.leftRooms.Length);
            Instantiate(templates.leftRooms[rand], transform.position, templates.leftRooms[rand].transform.rotation);
            break;
        case 4:
            rand = UnityEngine.Random.Range(0, templates.rightRooms.Length);
            Instantiate(templates.rightRooms[rand], transform.position, templates.rightRooms[rand].transform.rotation);
            break;
    }
    templates.currentRoomCount++;
    spawned = true;
}

3. 初始化计数

游戏启动时,将RoomTemplates的currentRoomCount设为1(默认初始房间已算入总数),避免计数偏差。

内容的提问来源于stack exchange,提问作者FlameingoStuidos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:47:52