Initial commit: Unity WordConnect project
This commit is contained in:
@ -0,0 +1,167 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using WordsToolkit.Scripts.Gameplay.Managers;
|
||||
using WordsToolkit.Scripts.Levels;
|
||||
using WordsToolkit.Scripts.System;
|
||||
using VContainer;
|
||||
|
||||
namespace WordsToolkit.Scripts.Debugger
|
||||
{
|
||||
public class CrosswordWordsDebug : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private bool showDebugButton = true;
|
||||
[SerializeField] private bool showWordsList = false;
|
||||
private LevelManager levelManager;
|
||||
private StateManager stateManager;
|
||||
private Vector2 scrollPosition = Vector2.zero;
|
||||
|
||||
[Inject]
|
||||
public void Construct(LevelManager levelManager, StateManager stateManager)
|
||||
{
|
||||
this.levelManager = levelManager;
|
||||
this.stateManager = stateManager;
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
#if !UNITY_ANDROID && !UNITY_IOS
|
||||
if (!showDebugButton)
|
||||
return;
|
||||
|
||||
// Only show debug button when in Game state
|
||||
if (stateManager == null || stateManager.CurrentState != EScreenStates.Game)
|
||||
return;
|
||||
|
||||
// Debug button in the bottom-right corner - scale with screen width
|
||||
float buttonWidth = Screen.width * 0.16f; // 12% of screen width
|
||||
float buttonHeight = Screen.width * 0.06f; // 3% of screen width for proportional height
|
||||
float margin = Screen.width * 0.01f; // 1% of screen width for margin
|
||||
|
||||
// Create scaled button style
|
||||
int buttonFontSize = Mathf.RoundToInt(buttonHeight * 0.4f); // 40% of button height
|
||||
GUIStyle buttonStyle = new GUIStyle(UnityEngine.GUI.skin.button);
|
||||
buttonStyle.fontSize = buttonFontSize;
|
||||
|
||||
if (UnityEngine.GUI.Button(new Rect(Screen.width - buttonWidth - margin, Screen.height - buttonHeight - margin, buttonWidth, buttonHeight), "Show Words", buttonStyle))
|
||||
{
|
||||
showWordsList = !showWordsList;
|
||||
}
|
||||
|
||||
// Words list panel along the bottom border
|
||||
if (showWordsList)
|
||||
{
|
||||
// Scale everything based on screen width
|
||||
float panelWidth = Screen.width * 0.85f; // 85% of screen width
|
||||
float panelHeight = Screen.width * 0.15f; // 15% of screen width for consistent proportions
|
||||
float minPanelWidth = Screen.width * 0.3f; // Minimum 30% of screen width
|
||||
float minPanelHeight = Screen.width * 0.08f; // Minimum 8% of screen width
|
||||
|
||||
panelWidth = Mathf.Max(panelWidth, minPanelWidth);
|
||||
panelHeight = Mathf.Max(panelHeight, minPanelHeight);
|
||||
|
||||
// Position the panel down and to the left
|
||||
float panelX = (Screen.width - panelWidth) * 0.3f; // Move left (30% from left instead of centered)
|
||||
float panelY = Screen.height - panelHeight - (Screen.width * 0.02f); // Move down (smaller bottom margin)
|
||||
|
||||
// Ensure panel doesn't go off screen
|
||||
panelX = Mathf.Clamp(panelX, Screen.width * 0.005f, Screen.width - panelWidth - Screen.width * 0.005f);
|
||||
panelY = Mathf.Clamp(panelY, Screen.width * 0.005f, Screen.height - panelHeight - Screen.width * 0.005f);
|
||||
|
||||
// Background panel
|
||||
UnityEngine.GUI.Box(new Rect(panelX, panelY, panelWidth, panelHeight), "");
|
||||
|
||||
float padding = Screen.width * 0.005f; // Padding scaled to screen width
|
||||
GUILayout.BeginArea(new Rect(panelX + padding, panelY + padding, panelWidth - padding * 2, panelHeight - padding * 2));
|
||||
|
||||
// Compact header with close button - font sizes based on panel height
|
||||
GUILayout.BeginHorizontal();
|
||||
int headerFontSize = Mathf.RoundToInt(panelHeight * 0.15f); // 15% of panel height
|
||||
GUILayout.Label("Words", new GUIStyle(UnityEngine.GUI.skin.label)
|
||||
{
|
||||
fontSize = headerFontSize,
|
||||
fontStyle = FontStyle.Bold
|
||||
});
|
||||
GUILayout.FlexibleSpace();
|
||||
float closeButtonSize = panelHeight * 0.2f; // Close button size based on panel height
|
||||
if (GUILayout.Button("X", GUILayout.Width(closeButtonSize), GUILayout.Height(closeButtonSize)))
|
||||
{
|
||||
showWordsList = false;
|
||||
}
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
// Get current level and display words
|
||||
Level currentLevel = levelManager.GetCurrentLevel();
|
||||
if (currentLevel != null)
|
||||
{
|
||||
var languageData = currentLevel.GetLanguageData(levelManager.GetCurrentLanguage());
|
||||
|
||||
if (languageData != null && languageData.crosswordData != null && languageData.crosswordData.placements != null)
|
||||
{
|
||||
// Get words from crossword placements
|
||||
var words = languageData.crosswordData.placements
|
||||
.Where(p => !string.IsNullOrEmpty(p.word))
|
||||
.Select(p => p.word.ToUpper())
|
||||
.Distinct()
|
||||
.OrderBy(w => w)
|
||||
.ToList();
|
||||
|
||||
// Responsive scrollable word list
|
||||
float scrollViewHeight = panelHeight - (Screen.width * 0.04f); // Adjust based on panel height minus header, scaled
|
||||
scrollPosition = GUILayout.BeginScrollView(scrollPosition, GUILayout.Height(scrollViewHeight));
|
||||
|
||||
// Display words in horizontal rows, dynamically fitting the width
|
||||
int wordFontSize = Mathf.RoundToInt(panelHeight * 0.12f); // 12% of panel height
|
||||
|
||||
// Calculate approximate character width for font size estimation
|
||||
float charWidth = wordFontSize * 0.6f; // Approximate character width
|
||||
float separatorWidth = charWidth * 3; // Width for " • " separator
|
||||
|
||||
string currentLine = "";
|
||||
float currentLineWidth = 0;
|
||||
|
||||
foreach (var word in words)
|
||||
{
|
||||
float wordWidth = word.Length * charWidth;
|
||||
float totalWidth = currentLineWidth + (currentLine.Length > 0 ? separatorWidth : 0) + wordWidth;
|
||||
|
||||
// Check if adding this word would exceed the panel width
|
||||
if (currentLine.Length > 0 && totalWidth > panelWidth - 40) // 40px padding buffer
|
||||
{
|
||||
// Display current line and start new one
|
||||
GUILayout.Label(currentLine, new GUIStyle(UnityEngine.GUI.skin.label) { fontSize = wordFontSize });
|
||||
currentLine = word;
|
||||
currentLineWidth = wordWidth;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Add word to current line
|
||||
if (currentLine.Length > 0)
|
||||
{
|
||||
currentLine += " • " + word;
|
||||
currentLineWidth += separatorWidth + wordWidth;
|
||||
}
|
||||
else
|
||||
{
|
||||
currentLine = word;
|
||||
currentLineWidth = wordWidth;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Display the last line if it has content
|
||||
if (currentLine.Length > 0)
|
||||
{
|
||||
GUILayout.Label(currentLine, new GUIStyle(UnityEngine.GUI.skin.label) { fontSize = wordFontSize });
|
||||
}
|
||||
|
||||
|
||||
GUILayout.EndScrollView();
|
||||
}
|
||||
}
|
||||
GUILayout.EndArea();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ea38205d5b4fd1b468379715158c7e54
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user