在Unity中使用两个网格用于不同目的

时间:2016-10-31 09:01:47

标签: c# unity3d

我在Unity中创建了一个2D虚拟桌面游戏,其中包含以下设置: enter image description here

这是手动放入gameObjects,当你需要创建多个机制时非常不方便。

现在我需要创建2个机制:

  • 能够确定玩家可以到达哪些牌(由骰子决定)
  • 能够通过其中心旋转任何3x3对象,如下所示:

enter image description here

注意:大的白色方块是角落,不会被用于任何机械师。

我目前的心态是制作一个瓷砖网格,然后是一个3x3网格。

  1. 这是解决这个问题的正确方法吗?
  2. 我如何首先创建一个平铺网格,然后创建一个基于该平铺网格的3x3网格?
  3. 我已经尝试过从gameObject或IEnumerator创建网格,这导致了不成功的尝试,或者我PC的极端性能问题。

1 个答案:

答案 0 :(得分:1)

这是我的想法。

  1. 拥有一个由所有游戏牌组成的NxN网格。
  2. 有一个3x3网格和9个预加载的磁贴,并在启动时禁用它。在运行时实例化游戏对象永远不是一个好主意。
  3. 当用户点击图块时(让我们从NxN网格中调用点击图块周围的9个图块,sub-grid):
    • 将3x3网格移动到子网格
    • 隐藏子网格中的9个图块
    • 启用3x3网格
    • 根据子网格图块启用/禁用3x3网格图块
    • 在3x3网格上启动动画(旋转整个3x3网格)(1)
    • 禁用3x3网格
    • 根据3x​​3网格图块启用/禁用子网格图块(*)
    • 再次显示子网格
    • 撤消3x3网格的旋转(*)
  4. 注意:

    (*)当旋转3x3网格时,每个图块的索引不再有效。因为3x3网格是旋转的而不是它的图块。所以你需要翻译3x3网格中的索引以匹配子网格索引。最好不要改变实际指数,而是在使用前转换它们。并且记得在完成后撤消旋转。

    我建议这种方法来翻译索引:

    struct XY { 
        public int x; 
        public int y; 
        public XY(int X, int Y){x=X;y=Y;}
    }
    
    //no need for this one, it's just here to have a better understanding
    static XY[,] _rotateNoneIdx = new XY { 
       { new XY(0,0), new XY(1,0), new XY(2,0) },
       { new XY(0,1), new XY(1,1), new XY(2,1) },
       { new XY(0,2), new XY(1,2), new XY(2,2) }
    };
    //translating matrix for translating left-rotated 3x3 grid tiles
    static XY[,] _rotateLeftIdx = new XY { 
       { new XY(2,0), new XY(2,1), new XY(2,2) },
       { new XY(1,0), new XY(1,1), new XY(1,2) },
       { new XY(0,0), new XY(0,1), new XY(0,2) }
    };
    //translating matrix for translating right-rotated 3x3 grid tiles
    static XY[,] _rotateRightIdx = new XY { 
       { new XY(0,2), new XY(0,1), new XY(0,0) },
       { new XY(1,2), new XY(1,1), new XY(1,0) },
       { new XY(2,2), new XY(2,1), new XY(2,0) }
    };
    
    //this method translates the rotated tile indices to actual indices
    static XY TranslateIndex(XY beforeRotateXY, bool isRotateLeft)
    {
        if(isRotateLeft) return _rotateLeftIdx[beforeRotateXY.x, beforeRotateXY.y];
        return _rotateRightIdx[beforeRotateXY.x, beforeRotateXY.y];
    }
    

    我还没有测试过此代码,因此您可能需要尝试左右交换。