Unity如何创建按枢轴对象本地空间对齐的网格?
枢轴本地空间对齐网格生成的问题修复
问题核心诱因
现有代码生成的网格始终沿世界坐标轴排布、无法跟随枢轴本地空间对齐,根本原因是代码逻辑中混用了世界空间、本地空间两套坐标计算规则:
- 网格超过单行数量阈值的分支逻辑中,错误使用了代表世界空间的
.position属性,而非代表父对象本地空间的.localPosition - 网格的偏移计算没有基于枢轴的本地坐标轴方向,直接在世界坐标系下做距离加法,哪怕枢轴发生旋转/倾斜,网格的延伸方向依然固定绑定世界X/Z轴
- 旋转赋值环节使用了世界空间的
.rotation属性,没有和父级枢轴的本地变换逻辑保持统一
替换后可直接运行的代码
将原方法的全部分支计算逻辑替换为纯本地空间运算,所有坐标计算完全锚定枢轴的本地坐标系,代码如下:
private void createColum() { // 以列表第一个元素作为枢轴参考,提取本地空间的基准位置 Vector3 pivotLocalBasePos = gridGame[0].localPosition; int rowCapacity = Mathf.RoundToInt(limiteFila); for (int i = 0; i < gridGame.Count; i++) { // 直接计算当前元素在网格中的列、行索引,无需零散分支判断 int currentColumn = i % rowCapacity; int currentRow = i / rowCapacity; // 完全基于本地空间计算目标位置:列方向沿本地X轴排布,行方向沿本地Z轴排布 Vector3 targetLocalPos = pivotLocalBasePos + new Vector3(currentColumn * distX, 0, currentRow * distY); gridGame[i].localPosition = targetLocalPos; // 对齐本地旋转,和枢轴的空间变换保持完全一致 gridGame[i].localRotation = gridGame[0].localRotation; } }
修复逻辑说明
- 全流程剔除世界空间属性(
.position、.rotation)的调用,所有计算统一使用.localPosition、.localRotation,确保整个网格的空间计算完全落在枢轴对象的本地坐标系框架内 - 取模、整除的索引计算方式替代原有的零散分支判断,避免原代码中因为分支错位导致的网格位置错乱问题
- 排布偏移量
distX、distY的方向完全跟随枢轴的本地坐标轴,只要枢轴发生旋转、倾斜、缩放,整个网格会同步跟随变换方向,不会再出现固定沿世界轴排布的异常效果
内容的提问来源于stack exchange,提问作者Jose Eduardo
相关产品推荐
相关产品推荐

