如何无间隙旋转并排列一行带道路的房屋预制件?
解决房屋预制件街道排列的间隙问题
方案一:用标记物实现精准拼接(最省心,适合美术调整)
直接在房屋预制件的道路段上添加两个空物体:
RoadStart:放在道路段需要和前一个预制件拼接的起始位置RoadEnd:放在道路段需要和下一个预制件拼接的结束位置
然后修改代码,以上一个房屋的RoadEnd位置作为下一个房屋的生成位置,彻底避免计算误差:
int houseCount = 0; Vector3 nextSpawnPos = Vector3.zero; // 统一用固定旋转角度,避免重复计算 Quaternion houseRotation = Quaternion.Euler(0, -20f, 0); while (houseCount < 30) { GameObject house = GameObject.Instantiate(housePrefab, nextSpawnPos, houseRotation); // 获取当前房屋的道路终点,作为下一个房屋的起点 Transform roadEnd = house.transform.Find("RoadEnd"); if (roadEnd != null) { nextSpawnPos = roadEnd.position; } houseCount++; }
方案二:数学计算实现拼接(无需额外物体)
如果不想加标记物,核心是基于局部空间尺寸和旋转方向计算位移——你的原始代码用了世界空间的轴对齐边界尺寸(bounds.size),但旋转后这个尺寸和实际拼接方向不匹配,才会出现间隙。
修改后的代码:
int houseCount = 0; Vector3 currentPos = Vector3.zero; Quaternion houseRotation = Quaternion.Euler(0, -20f, 0); // 提前获取预制件道路段的局部原始尺寸(不受旋转缩放影响) HouseUnit prefabUnit = housePrefab.GetComponent<HouseUnit>(); MeshRenderer prefabRenderer = prefabUnit.GetHouseBase().GetComponent<MeshRenderer>(); Vector3 localRoadSize = prefabRenderer.bounds.size / housePrefab.transform.localScale; // 假设道路段的拼接长度对应局部Z轴长度(根据你的模型实际轴方向调整) float roadSegmentLength = localRoadSize.z; // 计算旋转后的街道延伸方向 Vector3 streetDirection = houseRotation * Vector3.forward; while (houseCount < 30) { GameObject house = GameObject.Instantiate(housePrefab, currentPos, houseRotation); // 沿着街道方向移动一个道路段的长度,作为下一个房屋的位置 currentPos += streetDirection * roadSegmentLength; houseCount++; }
关键说明
你之前的代码用offsetX += size.x和offsetZ += size.z / 2f,但size是包裹旋转后物体的轴对齐盒子的尺寸,不是沿着街道延伸方向的实际拼接长度,自然会出现错位间隙。用局部尺寸结合旋转后的方向向量计算,才能精准对齐。
内容的提问来源于stack exchange,提问作者Seona
相关产品推荐
相关产品推荐

