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

如何无间隙旋转并排列一行带道路的房屋预制件?

解决房屋预制件街道排列的间隙问题

方案一:用标记物实现精准拼接(最省心,适合美术调整)

直接在房屋预制件的道路段上添加两个空物体:

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:57:50