Unity开发问题:无法在玩家处克隆物体,地板生成偏离玩家位置
问题修复方案
核心问题分析
- 地板远离玩家:生成位置用了
xi * -times和zi * times,且xi/zi是基于玩家坐标向上取整后的值,直接导致区块位置和玩家实际位置脱节、偏离。 - 无法在玩家位置克隆+重复生成:
id列表从未添加过已生成的区块ID,每次Update都会重复生成;transform.Find("floor")的判断逻辑完全错误,浮点数直接比较相等存在精度问题,且&应该用逻辑与&&。 - 区块ID精度问题:用
float存区块ID容易出现精度误差,应该用整数坐标标识区块。
修正后的代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Generate : MonoBehaviour { public GameObject player; public GameObject floorPrefab; // 简化为单个预制体,无需数组 private HashSet<Vector2Int> generatedChunks = new HashSet<Vector2Int>(); // 用HashSet存区块坐标,查询更高效 public int chunkRange = 5; // 围绕玩家生成的区块范围 public float chunkSize = 6f; // 每个区块的尺寸 public float yOffset = 1f; // Y轴偏移量 void Update() { // 计算玩家所在的区块坐标(将玩家坐标转换为区块网格的整数坐标) Vector2Int playerChunk = new Vector2Int( Mathf.RoundToInt(player.transform.position.x / chunkSize), Mathf.RoundToInt(player.transform.position.z / chunkSize) ); // 遍历玩家周围的区块 for (int x = playerChunk.x - chunkRange; x <= playerChunk.x + chunkRange; x++) { for (int z = playerChunk.y - chunkRange; z <= playerChunk.y + chunkRange; z++) { Vector2Int currentChunk = new Vector2Int(x, z); // 该区块未生成过则执行生成 if (!generatedChunks.Contains(currentChunk)) { // 计算区块生成位置:区块坐标 × 区块尺寸,Y轴贴合玩家位置下方 Vector3 spawnPos = new Vector3( x * chunkSize, Mathf.Floor(player.transform.position.y) - yOffset, z * chunkSize ); // 生成区块并设置为当前物体的子物体,方便管理 GameObject newFloor = Instantiate(floorPrefab, spawnPos, floorPrefab.transform.rotation); newFloor.transform.parent = transform; // 标记该区块已生成 generatedChunks.Add(currentChunk); } } } } }
修改说明
- 用
Vector2Int和HashSet管理区块ID,避免浮点数精度问题,查询效率更高。 - 先计算玩家所在的区块坐标,再围绕该坐标生成周围区块,确保区块始终围绕玩家生成。
- 生成位置直接用区块坐标乘以区块尺寸,保证区块与玩家位置对齐。
- 移除错误的
transform.Find判断,改用HashSet记录已生成区块,彻底避免重复生成。 - 简化变量命名,提升代码可读性。
内容的提问来源于stack exchange,提问作者beginner_123
相关产品推荐
相关产品推荐

