Example #1
0
    void LocateFirstBuildBrick()
    {
        RaycastHit _raycastHit;
        Ray        _ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(_ray, out _raycastHit, 256))
        {
            Vector3 _hitPoint = _raycastHit.point;
            IntVec3 _cubeIdx  = new IntVec3(_hitPoint);
            m_dragDir    = NoDir;
            m_dragIdx    = _cubeIdx;
            m_bCollision = false;

            //为brick对象且碰撞点法线不为Y轴正方向
            if (_raycastHit.collider.gameObject.name == "CubeBrick(Clone)" && _raycastHit.normal.y != 1.0f)
            {
                m_firstBrick     = m_buildBrickMap[new IntVec3(_raycastHit.collider.gameObject.transform.position)];
                m_bNewFirstBrick = false;
            }
            else
            {
                if (m_buildBrickMap.ContainsKey(_cubeIdx) == false)
                {
                    m_firstBrick      = new CubeBrick();
                    m_firstBrick.m_go = (GameObject)GameObject.Instantiate(m_prefabBrick, new Vector3(_cubeIdx.x + 0.5f, _cubeIdx.y + 0.5f, _cubeIdx.z + 0.5f), Quaternion.identity);
                    m_bNewFirstBrick  = true;
                }
                else
                {
                    m_firstBrick     = m_buildBrickMap[_cubeIdx];
                    m_bNewFirstBrick = false;
                }
            }
        }
    }
Example #2
0
 public void refreshPanels(CubeBrick c)
 {
     for (int i = 0; i < 6; i++)
     {
         Renderer rend = panels[i].GetComponent <Renderer>();
         rend.enabled        = true;
         rend.material.color = c.getColors()[i];
     }
 }
Example #3
0
    void DetachBrick(CubeBrick _cb)
    {
        _cb.m_go.rigidbody.isKinematic = false;
        _cb.m_go.rigidbody.AddForce(0.0f, -9.8f, 0.0f);
        IntVec3 _posIdx = _cb.GetIdx();

        m_buildBrickMap.Remove(_posIdx);
        m_checkListMap.Remove(_posIdx);
    }
Example #4
0
    // Use this for initialization

    /*
     * public RubiksCube(List<List<List<CubeBrick>>> cubeBrickMatrix)
     * {
     *  this.cubeMatrix = cubeBrickMatrix;
     *
     *  initColors();
     *
     * }
     *
     *
     * private void initColors()
     * {
     *
     * }
     *
     */
    public RubiksCube()
    {
        cubeMatrix = new List <List <List <CubeBrick> > >();

        for (int x = 0; x < 3; x++)
        {
            List <List <CubeBrick> > CubeRow = new List <List <CubeBrick> >();
            for (int y = 0; y < 3; y++)
            {
                List <CubeBrick> CubeColumn = new List <CubeBrick>();
                for (int z = 0; z < 3; z++)
                {
                    CubeBrick tempcube = new CubeBrick();
                    tempcube.setAllSideColors(CubeBrick.BLACKCOLOR);
                    CubeColumn.Add(tempcube);
                }
                CubeRow.Add(CubeColumn);
            }
            cubeMatrix.Add(CubeRow);
        }

        cubeMatrix[0][0][0].setSideColor(CubeBrick.sides.FRONT, CubeBrick.BLUECOLOR);

        //transform.rotation = Quaternion.Euler(new Vector3(45,0,45));
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                cubeMatrix[i][j][0].setSideColor(CubeBrick.sides.FRONT, CubeBrick.REDCOLOR);
                cubeMatrix[2][i][j].setSideColor(CubeBrick.sides.RIGHT, CubeBrick.BLUECOLOR);
                cubeMatrix[0][i][j].setSideColor(CubeBrick.sides.LEFT, CubeBrick.GREENCOLOR);
                cubeMatrix[i][j][2].setSideColor(CubeBrick.sides.BACK, CubeBrick.ORANGECOLOR);
                cubeMatrix[i][2][j].setSideColor(CubeBrick.sides.TOP, CubeBrick.WHITECOLOR);
                cubeMatrix[i][0][j].setSideColor(CubeBrick.sides.BOTTOM, CubeBrick.YELLOWCOLOR);
            }
        }
        cubeMatrix[1][1][1].setAllSideColors(CubeBrick.BLACKCOLOR);
    }
Example #5
0
    void UpdateCheckList()
    {
        while (m_checkListMap.Count != 0)
        {
            Dictionary <IntVec3, CubeBrick> .Enumerator _enum = m_checkListMap.GetEnumerator();
            bool _b = _enum.MoveNext();
            KeyValuePair <IntVec3, CubeBrick> _it = _enum.Current;
            CubeBrick _cb = _it.Value;

            //如果为独立brick,无任何连接方向
            if (_cb.m_dirP == NoDir && _cb.m_dirN == NoDir)
            {
                IntVec3 _upIdx = _cb.GetPY();
                if (m_buildBrickMap.ContainsKey(_upIdx))
                {
                    m_checkListMap.Add(_upIdx, m_buildBrickMap[_upIdx]);
                }
                DetachBrick(_cb);
                break;
            }

            //如果为Y轴正方向
            if (_cb.m_dirP == PYAxis)
            {
                if (_cb.m_neighbour[_cb.m_dirP] != null)  //非Y轴最顶层
                {
                    m_checkListMap.Add(_cb.m_neighbour[_cb.m_dirP].GetIdx(), _cb.m_neighbour[_cb.m_dirP]);
                }
                else //为Y抽最顶层
                {
                    IntVec3 _upIdx = _cb.GetPY();
                    if (m_buildBrickMap.ContainsKey(_upIdx))
                    {
                        m_checkListMap.Add(_upIdx, m_buildBrickMap[_upIdx]);
                    }
                }

                DetachBrick(_cb);
                continue;
            }

            //如果为非Y轴队列:先检查每个brick下面是否存在支撑点,如果一个支撑点都没有,则detach改队列所有brick
            bool             _hasPillar  = false;
            List <CubeBrick> _brickGroup = new List <CubeBrick>();
            IntVec3          _downIdx    = _cb.GetNY();

            //首先检查当前brick下面是否存在支撑点
            if (m_buildBrickMap.ContainsKey(_downIdx))
            {
                _hasPillar = true;
            }
            else
            {
                _brickGroup.Add(_cb); //加入当前cubebrick
            }
            if (_hasPillar == false)
            {
                CubeBrick _cbNgb = _cb.m_neighbour[_cb.m_dirP];
                //检查正方向
                while (_cbNgb != null)
                {
                    _downIdx = _cbNgb.GetNY();
                    if (m_buildBrickMap.ContainsKey(_downIdx))
                    {
                        _hasPillar = true;
                        break;
                    }
                    else
                    {
                        _brickGroup.Add(_cbNgb);
                        _cbNgb = _cbNgb.m_neighbour[_cbNgb.m_dirP];
                    }
                }

                //检查负方向
                if (_hasPillar == false)
                {
                    _cbNgb = _cb.m_neighbour[_cb.m_dirN];
                    while (_cbNgb != null)
                    {
                        _downIdx = _cbNgb.GetNY();
                        if (m_buildBrickMap.ContainsKey(_downIdx))
                        {
                            _hasPillar = true;
                            break;
                        }
                        else
                        {
                            _brickGroup.Add(_cbNgb);
                            _cbNgb = _cbNgb.m_neighbour[_cbNgb.m_dirN];
                        }
                    }
                }
            }

            if (_hasPillar == false)
            {
                foreach (CubeBrick _brick in _brickGroup)
                {
                    m_buildBrickMap.Remove(_brick.GetIdx());
                    DetachBrick(_brick);
                    IntVec3 _upIdx = _brick.GetPY();
                    if (m_buildBrickMap.ContainsKey(_upIdx))
                    {
                        m_checkListMap.Add(_upIdx, m_buildBrickMap[_upIdx]);
                    }
                }
            }

            m_checkListMap.Remove(_cb.GetIdx());
        }
        //yield return 0;
    }
Example #6
0
    void DestroyTargetBrick()
    {
        RaycastHit _raycastHit;
        Ray        _ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(_ray, out _raycastHit, 256))
        {
            Vector3 _hitPoint = _raycastHit.point;
            if (_raycastHit.collider.gameObject.name != "CubeBrick(Clone)")
            {
                return;
            }

            IntVec3 _cubeIdx = new IntVec3(_raycastHit.collider.gameObject.transform.position);

            if (m_buildBrickMap.ContainsKey(_cubeIdx) == true)
            {
                CubeBrick _cb = m_buildBrickMap[_cubeIdx];

                //清理targetBrick
                m_buildBrickMap.Remove(_cubeIdx);
                Object.DestroyImmediate(_cb.m_go);

                CubeBrick _cbNgb = _cb.GetBrickDirP();
                if (_cbNgb != null)
                {
                    _cbNgb.SetBrickDirN(null);
                }

                _cbNgb = _cb.GetBrickDirN();
                if (_cbNgb != null)
                {
                    _cbNgb.SetBrickDirP(null);
                }

                //无论哪种情况都需要检查上面的brick
                IntVec3 _upIdx = new IntVec3(_cubeIdx);
                _upIdx.y += 1;
                if (m_buildBrickMap.ContainsKey(_upIdx) == true)
                {
                    m_checkListMap.Add(_upIdx, m_buildBrickMap[_upIdx]);
                }

                //如果targetBrick为PY方向 或者 targetBrick无相邻对象,则通知其上面的brick
                if ((_cb.m_dirP == PYAxis) || (_cb.m_dirN == NoDir && _cb.m_dirP == NoDir))
                {
                    return;
                }

                //如果targetBrick为其它方向,则通知其相邻方向和上面的brick
                if (_cb.m_dirP != NoDir)
                {
                    _cbNgb = _cb.GetBrickDirP();
                    if (_cbNgb != null)
                    {
                        m_checkListMap.Add(_cbNgb.GetIdx(), _cbNgb);
                    }
                }

                if (_cb.m_dirN != NoDir)
                {
                    _cbNgb = _cb.GetBrickDirN();
                    if (_cbNgb != null)
                    {
                        m_checkListMap.Add(_cbNgb.GetIdx(), _cbNgb);
                    }
                }
            }
        }
    }
Example #7
0
    void BuildDragBrick()
    {
        if (m_bNewFirstBrick == true)
        {
            IntVec3 _pos = new IntVec3(m_firstBrick.m_go.transform.position);
            m_buildBrickMap.Add(_pos, m_firstBrick);
        }

        for (int _i = 0; _i != m_dragBrickList.Count; ++_i)
        {
            CubeBrick _cb = m_dragBrickList[_i];
            if (m_dragDir == _cb.m_dirP)
            {
                int _nextP = _i + 1;
                int _nextN = _i - 1;
                if (_nextP < m_dragBrickList.Count)
                {
                    _cb.m_neighbour[_cb.m_dirP] = m_dragBrickList[_nextP];
                }
                if (_nextN >= 0)
                {
                    _cb.m_neighbour[_cb.m_dirN] = m_dragBrickList[_nextN];
                }
            }
            else
            {
                if (m_dragDir == _cb.m_dirN)
                {
                    int _nextP = _i - 1;
                    int _nextN = _i + 1;
                    if (_nextP >= 0)
                    {
                        _cb.m_neighbour[_cb.m_dirP] = m_dragBrickList[_nextP];
                    }
                    if (_nextN < m_dragBrickList.Count)
                    {
                        _cb.m_neighbour[_cb.m_dirN] = m_dragBrickList[_nextN];
                    }
                }
            }

            IntVec3 _pos = new IntVec3(_cb.m_go.transform.position);
            m_buildBrickMap.Add(_pos, _cb);
        }

        if (m_dragBrickList.Count != 0)
        {
            CubeBrick _cb = m_dragBrickList[0];
            m_firstBrick.m_dirP = _cb.m_dirP;
            m_firstBrick.m_dirN = _cb.m_dirN;
            if (m_dragDir == _cb.m_dirP)
            {
                m_firstBrick.SetBrickDirP(m_dragBrickList[0]);
                m_dragBrickList[0].SetBrickDirN(m_firstBrick);
            }
            else
            {
                if (m_dragDir == _cb.m_dirN)
                {
                    m_firstBrick.SetBrickDirN(m_dragBrickList[0]);
                    m_dragBrickList[0].SetBrickDirP(m_firstBrick);
                }
            }
        }
        m_dragBrickList.Clear();
        m_firstBrick = null;
    }
Example #8
0
    void UpdateDragBrick()
    {
        Ray     _ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        Vector3 _pos = m_firstBrick.m_go.transform.position;

        Ray[] _rayGroup = new Ray[6];

        if (m_firstBrick.m_dirP != NoDir && m_firstBrick.m_dirN != NoDir)
        {
            if (m_firstBrick.m_dirP == PXAxis)
            {
                _rayGroup[PXAxis] = new Ray(_pos, m_axisPX);
            }

            if (m_firstBrick.m_dirN == NXAxis)
            {
                _rayGroup[NXAxis] = new Ray(_pos, m_axisNX);
            }

            if (m_firstBrick.m_dirP == PZAxis)
            {
                _rayGroup[PZAxis] = new Ray(_pos, m_axisPZ);
            }

            if (m_firstBrick.m_dirN == NZAxis)
            {
                _rayGroup[NZAxis] = new Ray(_pos, m_axisNZ);
            }

            if (m_firstBrick.m_dirP == PYAxis)
            {
                _rayGroup[PYAxis] = new Ray(_pos, m_axisPY);
            }

            if (m_firstBrick.m_dirN == NYAxis)
            {
                _rayGroup[NYAxis] = new Ray(_pos, m_axisNY);
            }
        }
        else
        {
            _rayGroup[PXAxis] = new Ray(_pos, m_axisPX);
            _rayGroup[NXAxis] = new Ray(_pos, m_axisNX);
            _rayGroup[PZAxis] = new Ray(_pos, m_axisPZ);
            _rayGroup[NZAxis] = new Ray(_pos, m_axisNZ);
            _rayGroup[PYAxis] = new Ray(_pos, m_axisPY);
            //_rayGroup[NYAxis] = new Ray(_pos, m_axisNY);
        }

        float _minDistSq = float.MaxValue;
        float _s = 0.0f, _t = 0.0f;
        int   _iDir = 0;

        for (int _i = 0; _i != 6; ++_i)
        {
            if (_rayGroup[_i].direction.x == 0.0f && _rayGroup[_i].direction.y == 0.0f && _rayGroup[_i].direction.z == 0.0f)
            {
                continue;
            }
            float _tempS = 0.0f, _tempT = 0.0f;
            float _distSq = AuxLib.Get().DistSqRayRay(ref _rayGroup[_i], ref _ray, ref _tempS, ref _tempT);
            if (_minDistSq > _distSq)
            {
                _minDistSq = _distSq;
                _s         = _tempS;
                _t         = _tempT;
                _iDir      = _i;
            }
        }

        if (m_dragDir != _iDir)
        {
            DestroyDragList();
            m_dragIdx    = new IntVec3(m_firstBrick.m_go.transform.position);
            m_bCollision = false;
        }
        m_dragDir = _iDir;

        Vector3 _destPos = new Vector3();

        _destPos = _rayGroup[_iDir].origin + _rayGroup[_iDir].direction * _s;
        IntVec3 _destIdx = new IntVec3(_destPos);

        if (m_dragIdx != _destIdx)
        {
            int  _iOffset = 0;
            bool _bInc    = true;
            switch (m_dragDir)
            {
            case PXAxis:
            {
                _iOffset = Mathf.Abs(_destIdx.x - m_dragIdx.x);
                if (_destIdx.x < m_dragIdx.x)
                {
                    _bInc = false;
                }

                for (int _i = 1; _i <= _iOffset; ++_i)
                {
                    IntVec3 _curIdx = new IntVec3(m_dragIdx);
                    if (_bInc == true)
                    {
                        if (m_bCollision == true)
                        {
                            break;
                        }
                        _curIdx.x += _i;
                        if (m_buildBrickMap.ContainsKey(_curIdx) == false)
                        {
                            CubeBrick _cb = new CubeBrick();
                            _cb.m_dirP = PXAxis;
                            _cb.m_dirN = NXAxis;

                            _cb.m_go = (GameObject)Instantiate(m_prefabBrick, new Vector3(_curIdx.x + 0.5f, _curIdx.y + 0.5f, _curIdx.z + 0.5f), Quaternion.identity);
                            m_dragBrickList.Add(_cb);
                        }
                        else
                        {
                            m_bCollision = true;
                        }
                    }
                    else
                    {
                        int _iPos = m_dragBrickList.Count - 1;
                        if (_iPos >= 0)
                        {
                            CubeBrick _cb = m_dragBrickList[_iPos];
                            Object.DestroyImmediate(_cb.m_go);
                            m_dragBrickList.RemoveAt(_iPos);
                        }
                    }
                }
                break;
            }

            case NXAxis:
            {
                _iOffset = Mathf.Abs(_destIdx.x - m_dragIdx.x);
                if (_destIdx.x > m_dragIdx.x)
                {
                    _bInc = false;
                }

                for (int _i = 1; _i <= _iOffset; ++_i)
                {
                    IntVec3 _curIdx = new IntVec3(m_dragIdx);
                    if (_bInc == true)
                    {
                        if (m_bCollision == true)
                        {
                            break;
                        }
                        _curIdx.x -= _i;
                        if (m_buildBrickMap.ContainsKey(_curIdx) == false)
                        {
                            CubeBrick _cb = new CubeBrick();
                            _cb.m_dirP = PXAxis;
                            _cb.m_dirN = NXAxis;
                            _cb.m_go   = (GameObject)Instantiate(m_prefabBrick, new Vector3(_curIdx.x + 0.5f, _curIdx.y + 0.5f, _curIdx.z + 0.5f), Quaternion.identity);
                            m_dragBrickList.Add(_cb);
                        }
                        else
                        {
                            m_bCollision = true;
                        }
                    }
                    else
                    {
                        int _iPos = m_dragBrickList.Count - 1;
                        if (_iPos >= 0)
                        {
                            CubeBrick _cb = m_dragBrickList[_iPos];
                            Object.DestroyImmediate(_cb.m_go);
                            m_dragBrickList.RemoveAt(_iPos);
                        }
                    }
                }
                break;
            }

            case PYAxis:
            {
                _iOffset = Mathf.Abs(_destIdx.y - m_dragIdx.y);
                if (_destIdx.y < m_dragIdx.y)
                {
                    _bInc = false;
                }

                for (int _i = 1; _i <= _iOffset; ++_i)
                {
                    IntVec3 _curIdx = new IntVec3(m_dragIdx);
                    if (_bInc == true)
                    {
                        if (m_bCollision == true)
                        {
                            break;
                        }
                        _curIdx.y += _i;
                        if (m_buildBrickMap.ContainsKey(_curIdx) == false)
                        {
                            CubeBrick _cb = new CubeBrick();
                            _cb.m_dirP = PYAxis;
                            _cb.m_dirN = NYAxis;
                            _cb.m_go   = (GameObject)Instantiate(m_prefabBrick, new Vector3(_curIdx.x + 0.5f, _curIdx.y + 0.5f, _curIdx.z + 0.5f), Quaternion.identity);
                            m_dragBrickList.Add(_cb);
                        }
                        else
                        {
                            m_bCollision = true;
                        }
                    }
                    else
                    {
                        int _iPos = m_dragBrickList.Count - 1;
                        if (_iPos >= 0)
                        {
                            CubeBrick _cb = m_dragBrickList[_iPos];
                            Object.DestroyImmediate(_cb.m_go);
                            m_dragBrickList.RemoveAt(_iPos);
                        }
                    }
                }
                break;
            }

            case NYAxis:
            {
                _iOffset = Mathf.Abs(_destIdx.y - m_dragIdx.y);
                if (_destIdx.y > m_dragIdx.y)
                {
                    _bInc = false;
                }

                for (int _i = 1; _i <= _iOffset; ++_i)
                {
                    IntVec3 _curIdx = new IntVec3(m_dragIdx);
                    if (_bInc == true)
                    {
                        if (m_bCollision == true)
                        {
                            break;
                        }
                        _curIdx.y -= _i;
                        if (m_buildBrickMap.ContainsKey(_curIdx) == false)
                        {
                            CubeBrick _cb = new CubeBrick();
                            _cb.m_dirP = PYAxis;
                            _cb.m_dirN = NYAxis;
                            _cb.m_go   = (GameObject)Instantiate(m_prefabBrick, new Vector3(_curIdx.x + 0.5f, _curIdx.y + 0.5f, _curIdx.z + 0.5f), Quaternion.identity);
                            m_dragBrickList.Add(_cb);
                        }
                        else
                        {
                            m_bCollision = true;
                        }
                    }
                    else
                    {
                        int _iPos = m_dragBrickList.Count - 1;
                        if (_iPos >= 0)
                        {
                            CubeBrick _cb = m_dragBrickList[_iPos];
                            Object.DestroyImmediate(_cb.m_go);
                            m_dragBrickList.RemoveAt(_iPos);
                        }
                    }
                }
                break;
            }

            case PZAxis:
            {
                _iOffset = Mathf.Abs(_destIdx.z - m_dragIdx.z);
                if (_destIdx.z < m_dragIdx.z)
                {
                    _bInc = false;
                }

                for (int _i = 1; _i <= _iOffset; ++_i)
                {
                    IntVec3 _curIdx = new IntVec3(m_dragIdx);
                    if (_bInc == true)
                    {
                        if (m_bCollision == true)
                        {
                            break;
                        }
                        _curIdx.z += _i;
                        if (m_buildBrickMap.ContainsKey(_curIdx) == false)
                        {
                            CubeBrick _cb = new CubeBrick();
                            _cb.m_dirP = PZAxis;
                            _cb.m_dirN = NZAxis;
                            _cb.m_go   = (GameObject)Instantiate(m_prefabBrick, new Vector3(_curIdx.x + 0.5f, _curIdx.y + 0.5f, _curIdx.z + 0.5f), Quaternion.identity);
                            m_dragBrickList.Add(_cb);
                        }
                        else
                        {
                            m_bCollision = true;
                        }
                    }
                    else
                    {
                        int _iPos = m_dragBrickList.Count - 1;
                        if (_iPos >= 0)
                        {
                            CubeBrick _cb = m_dragBrickList[_iPos];
                            Object.DestroyImmediate(_cb.m_go);
                            m_dragBrickList.RemoveAt(_iPos);
                        }
                    }
                }
                break;
            }

            case NZAxis:
            {
                _iOffset = Mathf.Abs(_destIdx.z - m_dragIdx.z);
                if (_destIdx.z > m_dragIdx.z)
                {
                    _bInc = false;
                }

                for (int _i = 1; _i <= _iOffset; ++_i)
                {
                    IntVec3 _curIdx = new IntVec3(m_dragIdx);
                    if (_bInc == true)
                    {
                        if (m_bCollision == true)
                        {
                            break;
                        }
                        _curIdx.z -= _i;
                        if (m_buildBrickMap.ContainsKey(_curIdx) == false)
                        {
                            CubeBrick _cb = new CubeBrick();
                            _cb.m_dirP = PZAxis;
                            _cb.m_dirN = NZAxis;
                            _cb.m_go   = (GameObject)Instantiate(m_prefabBrick, new Vector3(_curIdx.x + 0.5f, _curIdx.y + 0.5f, _curIdx.z + 0.5f), Quaternion.identity);
                            m_dragBrickList.Add(_cb);
                        }
                        else
                        {
                            m_bCollision = true;
                        }
                    }
                    else
                    {
                        int _iPos = m_dragBrickList.Count - 1;
                        if (_iPos >= 0)
                        {
                            CubeBrick _cb = m_dragBrickList[_iPos];
                            Object.DestroyImmediate(_cb.m_go);
                            m_dragBrickList.RemoveAt(_iPos);
                        }
                    }
                }
                break;
            }
            }

            m_dragIdx = _destIdx;
        }
    }
Example #9
0
 public void SetBrickDirN(CubeBrick _cb)
 {
     m_neighbour[m_dirN] = _cb;
 }