想用unity做一个无限循环的楼梯场景,我的设想是始终生成并保留玩家所在及上下两次的楼梯,删除多余的。
现在实际情况是如果没有最后一段删除代码的话,楼梯是可以正常生成的;
否则当我到达一定高度后,所有生成的楼梯都消失了,只剩下顶层的,而且有好几个顶层的。
using System.Collections.Generic;
using UnityEngine;
public class StairGenerator : MonoBehaviour
{
public GameObject stairPrefab; // 楼梯预制体
public int initialStairsCount = 5; // 初始楼梯数量
public float stairHeight = 1.0f; // 楼梯高度(Y轴高度)
private List<GameObject> stairs = new List<GameObject>(); // 存储楼梯的列表
private Transform player; // 玩家对象
private const float playerInitialHeight = 1.98f; // 玩家初始高度
private int currentPlayerIndex = -1; // 当前玩家所在楼梯索引
void Start()
{
player = Camera.main.transform; // 假设玩家是摄像机
InitializeStairs();
UpdatePlayerIndex(); // 初始化玩家当前楼梯索引
}
void Update()
{
UpdatePlayerIndex(); // 更新玩家楼梯索引
UpdateStairs(); // 根据新的玩家索引更新楼梯
}
void InitializeStairs()
{
// 初始化楼梯
for (int i = 0; i < initialStairsCount; i++)
{
CreateStair(i);
}
}
void CreateStair(int index)
{
GameObject stair = Instantiate(stairPrefab);
stair.transform.position = new Vector3(stairPrefab.transform.position.x, index * stairHeight, stairPrefab.transform.position.z);
stairs.Add(stair);
Debug.Log($"Creating stair at index {index} at position {stair.transform.position}");
}
void UpdatePlayerIndex()
{
// 计算当前玩家的楼梯索引
int playerPositionIndex = Mathf.FloorToInt((player.position.y - playerInitialHeight) / stairHeight);
// 只在玩家位置变化时更新索引
if (playerPositionIndex != currentPlayerIndex)
{
currentPlayerIndex = playerPositionIndex; // 更新当前玩家楼梯索引
}
}
void UpdateStairs()
{
// 计算需要保留的楼梯范围
int minStairIndex = Mathf.Max(0, currentPlayerIndex - 2); // 下方保留两个楼梯
int maxStairIndex = currentPlayerIndex + 3; // 上方保留三个楼梯
// 生成新的楼梯
while (stairs.Count <= maxStairIndex)
{
CreateStair(stairs.Count); // 继续创建新的楼梯,直到达到 maxStairIndex
}
// 销毁不在保留范围内的楼梯
for (int i = stairs.Count - 1; i >= 0; i--)
{
if (i < minStairIndex || i > maxStairIndex)
{
Destroy(stairs[i]);
stairs.RemoveAt(i);
}
}
}
}