光线投射和二维阵列在 Unity 中的魔方无法按预期工作

Posted

技术标签:

【中文标题】光线投射和二维阵列在 Unity 中的魔方无法按预期工作【英文标题】:Raycasting and 2d arrays not working as expected with Rubik's Cube in Unity 【发布时间】:2021-06-14 20:15:11 【问题描述】:

我希望这是一个很好的问题,但我目前正在 Unity 中研究魔方。我有一个自定义 MonoBehaviour 的 3d 数组,Cubie,每个都包含一个 Face 对象的 1d 数组。然后,我在Start() 方法中使用此代码来创建二维面数组以将更改映射到多维数据集(我确信这不是最有效的做事方式,但这是一个旨在涉及矩阵变换):

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)
                    
                        if (face.GetFaceType() == FaceType.Up) upFace[j, k] = face;
                        if (face.GetFaceType() == FaceType.Down) downFace[j, k] = face;
                        if (face.GetFaceType() == FaceType.Right) rightFace[j, k] = face;
                        if (face.GetFaceType() == FaceType.Left) leftFace[j, k] = face;
                        if (face.GetFaceType() == FaceType.Front) frontFace[j, k] = face;
                        if (face.GetFaceType() == FaceType.Back) backFace[j, k] = face;
                    
                
            
        

我有一组 UI 面板作为立方体的 2d 表示,它们显示如下:

这按预期工作,所以我假设二维数组工作得很好。但是,一旦我开始尝试通过光线投射来获取被点击的一侧,它只适用于连接到右侧的立方体。基于这样一个事实,即当我更改上面的代码时,它改变了立方体的哪一侧与光线投射一起工作,我认为问题出在该代码上,与光线投射本身无关,但如果需要,我可以给你该代码.

【问题讨论】:

作为后续,我已经弄清楚了哪里出错了,但还没有找到解决方法。我需要在每一侧使用ijk,具体取决于侧。目前,我有 6 个面孔中的 3 个按预期工作,但我对其余的面孔有点困惑。 我使用了一个 Excel 表来可视化需要在哪里使用哪些变量,并且它大部分都有效。我认为其余的错误是无关的。 【参考方案1】:

当你使用 Instantiate 函数时,你可以得到这样的对象 clone(....)。

Instantiate 函数创建的对象不是 Gameobject,所以为了使用 prefab,你可以像这样在 Instantiate 函数的末尾添加“as Gameobject”。

cube[i, j, k] = Instantiate(prefab, new Vector3(i, j, k), Quaternion.identity, transform) as GameObject;

而且,您必须使用physicsRaycast 进行光线投射操作。 我希望我的回答能回答你的问题。

【讨论】:

cube 数组不是 GameObjects 数组,而是自定义 MonoBehaviour Cubie 数组,所以我相当肯定不需要强制转换。我已经调试到可以将问题缩小到与上面代码中的 for 循环逻辑有关的程度,但我似乎无法弄清楚如何遍历列表以正确设置面。我希望这是一个比我在问题中给出的解释更好的解释。 啊,我明白了,在我看来,附在右侧的立方体设置为适合进行光线投射,但其他方块不适合进行光线投射。也许,如果立方体的面被翻转,面就无法从鼠标中得到光线。如您所见,光线投射需要碰撞,因此您最好检查另一面的位置。【参考方案2】:

以防万一有人好奇,这是我对我的问题的解决方案:

正如我在 cmets 中提到的,我做错了,所以当我发现我需要改变哪些面孔使用哪些变量时,我设法走得更远。在玩了一会儿之后,我制作了一个 Excel 电子表格来帮助我可视化我将使用什么来正确映射人脸。

这让我可以在 for 循环中应用正确的映射,最终我得到了一些按预期工作的东西。起初,我以错误的顺序插入变量,这最终导致了其他几个错误,但我能够通过切换顺序来解决这个问题,瞧,我的工作正常了。

【讨论】:

以上是关于光线投射和二维阵列在 Unity 中的魔方无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

使用光线投射和实例化对象问题检查与多边形碰撞器的碰撞(统一)

Unity3D 5.x 交互功能 - 光线投射碰撞设置

2-6 光线投射

在 Unity 中沿光线投射实例化预定义数量的对象

Unity3D:弹跳/反射光线投射

Hololens 2 的光线投射问题