コード例 #1
0
        void OnGUI()
        {
            if (!m_isInitialized)
            {
                return;
            }

            if (m_isGuiHidden)
            {
                m_rEditorRect  = new Rect(0, 0, 30, 32);
                m_rMapViewRect = new Rect(m_rEditorRect.x + m_rEditorRect.width, 0f, Screen.width - m_rEditorRect.width, Screen.height);
                if (GUI.Button(m_rEditorRect, ">"))
                {
                    m_isGuiHidden = false;
                }
                return;
            }

        #if UNITY_EDITOR
            m_isCtrlKeyHold = Event.current.shift;
        #else
            m_isCtrlKeyHold = Event.current.control || Event.current.shift;
        #endif
            Rect vRectTemp;

            float fPad                 = 4f;
            float fTilesetOffset       = m_isLayersMenuHidden? 64f : 128f;
            float fScrollBarWidth      = 16f;
            float fTileGroupGridHeight = 30f * (1 + (m_tileGroupNames.Length - 1) / 5);

            int tilesWidth  = k_visualTileWidth * m_autoTileMap.Tileset.AutoTilesPerRow;
            int tilesHeight = k_visualTileHeight * (256 / m_autoTileMap.Tileset.AutoTilesPerRow);

            m_rEditorRect          = new Rect(0f, 0f, tilesWidth + 2 * fPad + fScrollBarWidth, Screen.height);
            m_rMapViewRect         = new Rect(m_rEditorRect.x + m_rEditorRect.width, 0f, Screen.width - m_rEditorRect.width, Screen.height);
            m_rTilesetRect         = new Rect(fPad, fTilesetOffset + fPad, tilesWidth + fScrollBarWidth, Screen.height);
            m_rTilesetRect.height -= (m_rTilesetRect.y + fPad + fTileGroupGridHeight);
            float minimapRectW = Mathf.Min(m_rMapViewRect.width * 0.25f, m_autoTileMap.MinimapTexture.width);  // fix to limit the size of minimap for big maps
            float minimapRectH = m_autoTileMap.MinimapTexture.height * minimapRectW / m_autoTileMap.MinimapTexture.width;
            m_rMinimapRect = new Rect(Screen.width - minimapRectW, Screen.height - minimapRectH, minimapRectW, minimapRectH);

            //+++ Draw Tileset Selection Buttons
            vRectTemp       = new Rect(m_rTilesetRect.x, Screen.height - fTileGroupGridHeight, tilesWidth, fTileGroupGridHeight);
            m_subTilesetIdx = GUI.SelectionGrid(vRectTemp, m_subTilesetIdx, m_tileGroupNames, 5);
            //---

            GUI.Box(m_rEditorRect, "");

            if (GUI.Button(new Rect(0, 0, 130, 32), m_showCollisions? "Hide Collisions (C)" : "Show Collisions (C)"))
            {
                m_showCollisions = !m_showCollisions;
            }

            if (GUI.Button(new Rect(0, 32, 130, 32), m_showMinimap? "Hide Minimap (M)" : "Show Minimap (M)"))
            {
                m_showMinimap = !m_showMinimap;
                m_autoTileMap.BrushGizmo.IsRefreshMinimapEnabled = m_showMinimap;
                if (m_showMinimap)
                {
                    m_autoTileMap.RefreshMinimapTexture();
                }
            }

            if (GUI.Button(new Rect(130, 0, 120, 32), "Save"))
            {
                m_autoTileMap.ShowSaveDialog();
            }
            if (GUI.Button(new Rect(130, 32, 120, 32), "Load"))
            {
                m_autoTileMap.ShowLoadDialog();
            }
            if (GUI.Button(new Rect(250, 0, 30, 32), "<"))
            {
                m_isGuiHidden = true;
            }
            if (GUI.Button(new Rect(250, 32, 30, 32), "L"))
            {
                m_isLayersMenuHidden = !m_isLayersMenuHidden;
            }

            if (!m_isLayersMenuHidden)
            {
                if (GUI.Button(new Rect(0, 64, m_rTilesetRect.width, 32), m_autoTileMap.BrushGizmo.SmartBrushEnabled ? "Smart Brush Enabled" : "Smart Brush Disabled"))
                {
                    m_autoTileMap.BrushGizmo.SmartBrushEnabled = !m_autoTileMap.BrushGizmo.SmartBrushEnabled;
                }
                comboBoxControl.Rect.y                 = 96;
                comboBoxControl.Rect.width             = m_rTilesetRect.width;
                comboBoxControl.Rect.height            = 32;
                m_autoTileMap.BrushGizmo.SelectedLayer = comboBoxControl.Show();
            }

            if (!comboBoxControl.IsDropDownListVisible)
            {
                Rect viewRect = new Rect(0, 0, m_rTilesetRect.width - fScrollBarWidth, tilesHeight);
                m_scrollPos = GUI.BeginScrollView(m_rTilesetRect, m_scrollPos, viewRect);
                //+++ Draw Tiles Thumbnails
                {
                    float fTileRowNb = 32;
                    vRectTemp           = new Rect(0f, 0f, k_visualTileWidth * m_autoTileMap.Tileset.AutoTilesPerRow, k_visualTileHeight * fTileRowNb);
                    vRectTemp.position += m_rEditorRect.position;
                    int thumbIdx = 0;
                    GUI.DrawTexture(vRectTemp, m_thumbnailTextures[m_subTilesetIdx]);
                    for (int y = 0; thumbIdx < 256; ++y) //256 number of tileset for each tileset group
                    {
                        for (int x = 0; x < m_autoTileMap.Tileset.AutoTilesPerRow; ++x, ++thumbIdx)
                        {
                            Rect rDst = new Rect(x * k_visualTileWidth, y * k_visualTileHeight, k_visualTileWidth, k_visualTileHeight);
                            rDst.position += vRectTemp.position;
                            //if( MyAutoTileMap.IsAutoTileHasAlpha( x, y ) ) GUI.Box( rDst, "A" ); //for debug
                            if (m_isCtrlKeyHold)
                            {
                                string sCollision = "";
                                switch (m_autoTileMap.Tileset.AutotileCollType[m_subTilesetIdx * 256 + thumbIdx])
                                {
                                //NOTE: if you don't see the special characters properly, be sure this file is saved in UTF-8
                                case AutoTileMap.eTileCollisionType.BLOCK: sCollision = "■"; break;

                                case AutoTileMap.eTileCollisionType.FENCE: sCollision = "#"; break;

                                case AutoTileMap.eTileCollisionType.WALL: sCollision = "□"; break;

                                case AutoTileMap.eTileCollisionType.OVERLAY: sCollision = "★"; break;
                                }
                                if (sCollision.Length > 0)
                                {
                                    GUI.color = new Color(1f, 1f, 1f, 1f);
                                    GUIStyle style = new GUIStyle();
                                    style.fontSize         = 30;
                                    style.fontStyle        = FontStyle.Bold;
                                    style.alignment        = TextAnchor.MiddleCenter;
                                    style.normal.textColor = Color.white;
                                    GUI.Box(rDst, sCollision, style);
                                    GUI.color = Color.white;
                                }
                            }
                        }
                    }
                    Rect rSelected = new Rect(0, 0, k_visualTileWidth, k_visualTileHeight);

                    int tileWithSelectMark = m_selectedTileIdx;
                    tileWithSelectMark -= (m_subTilesetIdx * 256);
                    rSelected.position  = vRectTemp.position + new Vector2((tileWithSelectMark % m_autoTileMap.Tileset.AutoTilesPerRow) * k_visualTileWidth, (tileWithSelectMark / m_autoTileMap.Tileset.AutoTilesPerRow) * k_visualTileHeight);

                    UtilsGuiDrawing.DrawRectWithOutline(rSelected, new Color(0f, 0f, 0f, 0.1f), new Color(1f, 1f, 1f, 1f));
                }
                //----
                GUI.EndScrollView();
            }

            if (m_showMinimap)
            {
                float minimapScale = m_rMinimapRect.width / m_autoTileMap.MinimapTexture.width;

                //NOTE: the texture is drawn blurred in web player unless default quality is set to Fast in project settings
                // see here for solution http://forum.unity3d.com/threads/webplayer-gui-issue.100256/#post-868451
                GUI.DrawTexture(m_rMinimapRect, m_autoTileMap.MinimapTexture);
                UtilsGuiDrawing.DrawRectWithOutline(m_rMinimapRect, new Color(0, 0, 0, 0), Color.black);

                // Draw camera region on minimap
                Vector3 vCameraPos  = m_autoTileMap.ViewCamera.ScreenPointToRay(new Vector3(0, Screen.height - 1)).origin;
                int     camTileX    = (int)(vCameraPos.x / m_autoTileMap.Tileset.TileWorldWidth);
                int     camTileY    = (int)(-vCameraPos.y / m_autoTileMap.Tileset.TileWorldHeight);
                Rect    rMinimapCam = new Rect(camTileX, camTileY, minimapScale * Screen.width / (m_camera2D.Zoom * m_autoTileMap.Tileset.TileWidth), minimapScale * Screen.height / (m_camera2D.Zoom * m_autoTileMap.Tileset.TileHeight));
                rMinimapCam.position *= minimapScale;
                rMinimapCam.position += m_rMinimapRect.position;
                UtilsGuiDrawing.DrawRectWithOutline(rMinimapCam, new Color(0, 0, 0, 0), Color.white);

                // Draw player on minimap
                if (m_camera2DFollowBehaviour != null && m_camera2DFollowBehaviour.Target != null)
                {
                    int  plyTileX = -1 + (int)(m_camera2DFollowBehaviour.Target.transform.position.x / m_autoTileMap.Tileset.TileWorldWidth);
                    int  plyTileY = -1 + (int)(-m_camera2DFollowBehaviour.Target.transform.position.y / m_autoTileMap.Tileset.TileWorldHeight);
                    Rect rPlayer  = new Rect(plyTileX, plyTileY, 3, 3);
                    rPlayer.position *= minimapScale;
                    rPlayer.position += m_rMinimapRect.position;
                    UtilsGuiDrawing.DrawRectWithOutline(rPlayer, Color.yellow, Color.blue);
                }
            }

            #region Draw Selection Rect
            // Map Version
            if (m_drawSelectionRect)
            {
                Rect selRect = new Rect( );
                selRect.width  = (Mathf.Abs(m_dragTileX - m_startDragTileX) + 1) * m_autoTileMap.Tileset.TileWidth * m_camera2D.Zoom;
                selRect.height = (Mathf.Abs(m_dragTileY - m_startDragTileY) + 1) * m_autoTileMap.Tileset.TileHeight * m_camera2D.Zoom;
                float   worldX  = Mathf.Min(m_startDragTileX, m_dragTileX) * m_autoTileMap.Tileset.TileWorldWidth;
                float   worldY  = -Mathf.Min(m_startDragTileY, m_dragTileY) * m_autoTileMap.Tileset.TileWorldHeight;
                Vector3 vScreen = m_camera2D.Camera.WorldToScreenPoint(new Vector3(worldX, worldY) + m_autoTileMap.transform.position);
                selRect.position = new Vector2(vScreen.x, vScreen.y);
                selRect.y        = Screen.height - selRect.y;
                UtilsGuiDrawing.DrawRectWithOutline(selRect, new Color(0f, 1f, 0f, 0.2f), new Color(0f, 1f, 0f, 1f));
            }
            // Tileset Version
            if (m_tilesetSelStart >= 0 && m_tilesetSelEnd >= 0)
            {
                int  tilesetIdxStart = m_tilesetSelStart - (m_subTilesetIdx * 256);            // make it relative to selected tileset
                int  tilesetIdxEnd   = m_tilesetSelEnd - (m_subTilesetIdx * 256);              // make it relative to selected tileset
                Rect selRect         = new Rect( );
                int  TileStartX      = tilesetIdxStart % m_autoTileMap.Tileset.AutoTilesPerRow;
                int  TileStartY      = tilesetIdxStart / m_autoTileMap.Tileset.AutoTilesPerRow;
                int  TileEndX        = tilesetIdxEnd % m_autoTileMap.Tileset.AutoTilesPerRow;
                int  TileEndY        = tilesetIdxEnd / m_autoTileMap.Tileset.AutoTilesPerRow;
                selRect.width  = (Mathf.Abs(TileEndX - TileStartX) + 1) * k_visualTileWidth;
                selRect.height = (Mathf.Abs(TileEndY - TileStartY) + 1) * k_visualTileHeight;
                float scrX = Mathf.Min(TileStartX, TileEndX) * k_visualTileWidth;
                float scrY = Mathf.Min(TileStartY, TileEndY) * k_visualTileHeight;
                selRect.position  = new Vector2(scrX, scrY - m_scrollPos.y);
                selRect.position += m_rTilesetRect.position;
                //selRect.y = Screen.height - selRect.y;
                UtilsGuiDrawing.DrawRectWithOutline(selRect, new Color(0f, 1f, 0f, 0.2f), new Color(0f, 1f, 0f, 1f));
            }
            #endregion
        }