You need to enable JavaScript to run this app. Unity魔方开发中射线检测与2D数组功能未达预期问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Unity魔方开发中射线检测与2D数组功能未达预期问题咨询

初始化逻辑核心问题
  • 当前Face二维数组的写入存在两个关键缺陷,直接导致射线检测仅单侧可触发:
    1. 索引维度不匹配
      魔方六个面的法向量各沿一个坐标轴,平面本身需要由另外两个坐标轴的坐标做数组索引。当前代码对所有面类型统一使用j、k作为二维数组索引,不符合Up/Down面(需X/Z轴坐标做索引)、Front/Back面(需X/Y轴坐标做索引)的维度要求,导致数组写入位置完全偏移。
    2. 无边界判断的覆盖写入
      每个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。

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 07:15:03