Unity魔方开发中射线检测与2D数组功能未达预期问题咨询
初始化逻辑核心问题
- 当前Face二维数组的写入存在两个关键缺陷,直接导致射线检测仅单侧可触发:
- 索引维度不匹配
魔方六个面的法向量各沿一个坐标轴,平面本身需要由另外两个坐标轴的坐标做数组索引。当前代码对所有面类型统一使用j、k作为二维数组索引,不符合Up/Down面(需X/Z轴坐标做索引)、Front/Back面(需X/Y轴坐标做索引)的维度要求,导致数组写入位置完全偏移。 - 无边界判断的覆盖写入
每个Cubie预制体本身自带全部六个方向的Face组件,但只有处于魔方最外侧边界的Cubie上的对应方向Face才是朝外、可被射线命中的。当前代码只要遍历到Cubie上的对应类型Face,就会无差别覆盖全局二维数组的内容——受三层循环从X轴最小值遍历到最大值的顺序影响,所有非Right面的数组元素最终都会被X轴最内侧的Cubie的内部Face覆盖,这些Face的碰撞体被相邻Cubie夹在魔方结构内部,无法被外部射线命中。
只有Right面的索引本身匹配Y/Z坐标,且最后一次覆盖写入发生在X轴最外侧的Cubie位置,存入的是真正朝外的Right Face,因此仅这部分Face可正常触发射线。
- 索引维度不匹配
修复实现
调整逻辑为:首先获取魔方三个轴向的最大边界值,对每个Face类型的写入增加边界判断,同时修正对应二维数组的索引维度,修改后的核心逻辑如下:
// 预计算三个轴向的最大边界索引 int maxX = cube.GetLength(0) - 1; int maxY = cube.GetLength(1) - 1; int maxZ = cube.GetLength(2) - 1; for (int i = 0; i < cube.GetLength(0); i++) { for (int j = 0; j < cube.GetLength(1); j++) { for (int k = 0; k < cube.GetLength(2); k++) { cube[i, j, k] = Instantiate(prefab, new Vector3(i, j, k), Quaternion.identity, transform); Cubie cubie = cube[i, j, k]; Face[] faces = cubie.GetFaces(); foreach (Face face in faces) { // 仅当Cubie处于对应方向的最外侧边界时,才将Face存入全局映射数组 switch (face.GetFaceType()) { case FaceType.Right: if (i == maxX) rightFace[j, k] = face; break; case FaceType.Left: if (i == 0) leftFace[j, k] = face; break; case FaceType.Up: if (j == maxY) upFace[i, k] = face; break; case FaceType.Down: if (j == 0) downFace[i, k] = face; break; case FaceType.Front: if (k == maxZ) frontFace[i, j] = face; break; case FaceType.Back: if (k == 0) backFace[i, j] = face; break; } } } } }
- 优化提示:对最终存入数组的朝外Face保留碰撞体,对其他内部的Face组件,可以直接禁用其碰撞体组件,避免内部重叠的碰撞体干扰射线检测的命中结果。
内容的提问来源于stack exchange,提问作者Sam。
相关产品推荐
相关产品推荐

