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 }