我有一个预制的房子,上面有一条路,像这样:
我想将它们并排布置以创建一条街道,但我也想让它们倾斜一个小角度,这样这条路似乎一直延伸到远处。更像是这样的:
我已经能够放置它们并旋转它们,但我在确定位置时遇到了很多麻烦。我猜有一些我没有应用的数学技巧之类的。
到目前为止这是我的代码:
int houseCount = 0;
float offsetX = 0;
float offsetZ = 0;
while (houseCount < 30)
{
GameObject house = GameObject.Instantiate(housePrefab);
house.transform.Rotate(new Vector3(0,-20f,0), Space.Self);
house.transform.position = new Vector3(offsetX, 0, offsetZ);
// Calculate offset for next house
HouseUnit unit = house.GetComponent<HouseUnit>();
MeshRenderer renderer = unit.GetHouseBase().GetComponent<MeshRenderer>();
Vector3 size = renderer.bounds.size;
offsetX += size.x;
offsetZ += size.z / 2f;
Debug.Log(size);
houseCount++;
}
unit.GetHouseBase()
返回路段,这是一个简单的平面。我认为这是定位的最合乎逻辑的部分,因为它是 a) 最宽的部分,b) 我需要连接的部分。
运行它会得到以下结果:
他们并没有排得太糟糕,但我不知道如何缩小差距。有没有人有任何建议或资源可以指点我?提前致谢。
renderer.bounds
是世界空间中的边界框,因此如果旋转渲染器,边界也会发生变化。您可以尝试 renderer.localBounds
或 Mesh.bounds
,这些属性返回局部空间中的边界框。但请注意它们是可变的,通常由所有顶点计算,这意味着它们不能保证准确。如果还是发现有缝隙,可以用内置的立方体手动测量道路的宽度,它的宽度是1.