using UnityEngine; using UnityEngine.UIElements; #if UNITY_EDITOR using UnityEditor; #endif /// /// This script helps set up the shop/inventory system. /// Attach this to a GameObject in your scene to get started with the shop system. /// public class ShopSystemSetup : MonoBehaviour { [Header("Instructions")] [TextArea(5, 10)] public string instructions = @"Setup Instructions: 1. Create a GameObject and attach SimpleShopManager script 2. Create a UI Document with ShopUI.uxml as the Visual Tree Asset 3. Attach the UI Document to the same GameObject as SimpleShopManager 4. The shop will automatically populate with default items 5. Click 'Add Weapon', 'Add Armor', or 'Add Misc' buttons in character inventory to open shop"; [Header("Quick Setup")] [SerializeField] private bool createShopGameObject = false; [Header("Manual Assignment")] [SerializeField] private VisualTreeAsset shopUIAsset; [Header("Testing")] [SerializeField] private bool testShopSystem = false; [SerializeField] private bool debugShopSetup = false; [SerializeField] private bool createPanelSettings = false; void Update() { // Handle inspector button presses if (testShopSystem) { testShopSystem = false; TestShopSystem(); } if (debugShopSetup) { debugShopSetup = false; DebugShopSetup(); } if (createPanelSettings) { createPanelSettings = false; CreatePanelSettings(); } } [ContextMenu("Create Panel Settings")] void CreatePanelSettings() { #if UNITY_EDITOR // Ensure UI directory exists if (!AssetDatabase.IsValidFolder("Assets/UI")) { AssetDatabase.CreateFolder("Assets", "UI"); } // Create Panel Settings asset var panelSettings = ScriptableObject.CreateInstance(); // Set default values panelSettings.themeStyleSheet = null; // You can assign a theme if you have one panelSettings.targetTexture = null; // Will render to screen panelSettings.scaleMode = PanelScaleMode.ConstantPixelSize; panelSettings.scale = 1.0f; panelSettings.referenceResolution = new Vector2Int(1920, 1080); panelSettings.screenMatchMode = PanelScreenMatchMode.MatchWidthOrHeight; panelSettings.match = 0.5f; panelSettings.sortingOrder = 10; // Set higher than main UI (which has sortingOrder 0) // Save the asset string panelSettingsPath = "Assets/UI/PanelSettings.asset"; AssetDatabase.CreateAsset(panelSettings, panelSettingsPath); AssetDatabase.SaveAssets(); Debug.Log($"Created Panel Settings at {panelSettingsPath}"); // Assign to existing shop manager var shopManager = FindFirstObjectByType(); if (shopManager != null) { var uiDocument = shopManager.GetComponent(); if (uiDocument != null) { uiDocument.panelSettings = panelSettings; Debug.Log("Assigned Panel Settings to ShopManager UIDocument!"); } } #else Debug.LogError("Panel Settings can only be created in the Editor!"); #endif } [ContextMenu("Test Shop UI Visibility")] void TestShopUIVisibility() { var shopManager = FindFirstObjectByType(); if (shopManager == null) { Debug.LogError("No ShopManager found in scene!"); return; } var uiDocument = shopManager.GetComponent(); if (uiDocument == null) { Debug.LogError("ShopManager has no UIDocument!"); return; } Debug.Log("=== Shop UI Visibility Test ==="); Debug.Log($"UIDocument sortingOrder: {uiDocument.sortingOrder}"); if (uiDocument.panelSettings != null) { Debug.Log($"Panel Settings sortingOrder: {uiDocument.panelSettings.sortingOrder}"); } else { Debug.LogWarning("No Panel Settings assigned!"); } // Compare with main UI var allUIDocuments = FindObjectsByType(FindObjectsSortMode.None); Debug.Log("All UIDocuments in scene:"); foreach (var doc in allUIDocuments) { var panelSort = doc.panelSettings?.sortingOrder ?? -999; Debug.Log($" '{doc.gameObject.name}' - UIDoc sortOrder: {doc.sortingOrder}, Panel sortOrder: {panelSort}"); } // Try to open the shop var mainTeamScript = FindFirstObjectByType(); if (mainTeamScript != null) { // Create a dummy character for testing var dummyCharacter = new TeamCharacter(); dummyCharacter.name = "Test Character"; shopManager.OpenShop(dummyCharacter); Debug.Log("Shop opened for testing - check if it's visible above other UI!"); } else { Debug.LogWarning("No MainTeamSelectScript found - cannot test shop opening"); } } [ContextMenu("Fix Panel Settings Sort Order")] void FixPanelSettingsSortOrder() { #if UNITY_EDITOR // Check if Panel Settings already exists string panelSettingsPath = "Assets/UI/PanelSettings.asset"; var existingPanelSettings = AssetDatabase.LoadAssetAtPath(panelSettingsPath); if (existingPanelSettings != null) { existingPanelSettings.sortingOrder = 10; // Set higher than main UI (which has sortingOrder 0) EditorUtility.SetDirty(existingPanelSettings); AssetDatabase.SaveAssets(); Debug.Log($"Updated Panel Settings sortingOrder to 10 for UI layering!"); } else { Debug.LogWarning("Panel Settings not found. Run 'Create Panel Settings' first."); } // Also update any UIDocument that might be using this Panel Settings var shopManager = FindFirstObjectByType(); if (shopManager != null) { var uiDocument = shopManager.GetComponent(); if (uiDocument != null && uiDocument.panelSettings != null) { uiDocument.panelSettings.sortingOrder = 10; EditorUtility.SetDirty(uiDocument.panelSettings); Debug.Log("Updated UIDocument Panel Settings sortingOrder!"); } } #else Debug.LogError("Panel Settings can only be modified in the Editor!"); #endif } [ContextMenu("Assign Shop UI Asset")] void AssignShopUIAsset() { var shopManager = FindFirstObjectByType(); if (shopManager == null) { Debug.LogError("No ShopManager found in scene. Create one first."); return; } var uiDocument = shopManager.GetComponent(); if (uiDocument == null) { Debug.LogError("ShopManager doesn't have a UIDocument component!"); return; } if (shopUIAsset != null) { uiDocument.visualTreeAsset = shopUIAsset; Debug.Log("Successfully assigned ShopUI.uxml to UIDocument!"); } else { Debug.LogError("No Shop UI Asset assigned! Please drag ShopUI.uxml to the Shop UI Asset field in the inspector."); } } void Start() { if (createShopGameObject) { CreateShopGameObject(); createShopGameObject = false; } // Always ensure shop system is properly set up EnsureShopSystemSetup(); } void EnsureShopSystemSetup() { var shopManager = FindFirstObjectByType(); if (shopManager == null) { Debug.Log("No ShopManager found, creating one..."); CreateShopGameObject(); shopManager = FindFirstObjectByType(); } if (shopManager != null) { var uiDocument = shopManager.GetComponent(); if (uiDocument != null) { // Check if Panel Settings is assigned if (uiDocument.panelSettings == null) { Debug.Log("No Panel Settings assigned to ShopManager, creating one..."); CreatePanelSettings(); } // Check if Visual Tree Asset is assigned if (uiDocument.visualTreeAsset == null) { Debug.Log("No Visual Tree Asset assigned to ShopManager, assigning ShopUI.uxml..."); AssignShopUIAsset(); } } } } [ContextMenu("Create Shop GameObject")] void CreateShopGameObject() { // Check if shop manager already exists var existingShop = FindFirstObjectByType(); if (existingShop != null) { Debug.LogWarning("ShopManager already exists in scene!"); return; } // Create shop GameObject GameObject shopGO = new GameObject("ShopManager"); // Add UIDocument component FIRST (before SimpleShopManager) var uiDocument = shopGO.AddComponent(); // Add SimpleShopManager component AFTER UIDocument var shopManager = shopGO.AddComponent(); Debug.Log("Created ShopManager GameObject. Now looking for ShopUI.uxml..."); // Try to find and assign the UXML file - try multiple potential paths VisualTreeAsset uiAsset = null; #if UNITY_EDITOR // Try to load from Assets folder directly (Editor only) uiAsset = AssetDatabase.LoadAssetAtPath("Assets/UI/TeamSelectOverview/ShopUI.uxml"); if (uiAsset != null) { Debug.Log("Found ShopUI.uxml in Assets/UI/TeamSelectOverview/"); uiDocument.visualTreeAsset = uiAsset; // Try to find and assign Panel Settings var panelSettings = AssetDatabase.LoadAssetAtPath("Assets/UI/PanelSettings.asset"); if (panelSettings == null) { // Try common locations for Panel Settings var panelSettingsGuids = AssetDatabase.FindAssets("t:PanelSettings"); if (panelSettingsGuids.Length > 0) { var panelSettingsPath = AssetDatabase.GUIDToAssetPath(panelSettingsGuids[0]); panelSettings = AssetDatabase.LoadAssetAtPath(panelSettingsPath); Debug.Log($"Found Panel Settings at: {panelSettingsPath}"); } else { // No Panel Settings found, create one Debug.Log("No Panel Settings found, creating one..."); CreatePanelSettings(); panelSettings = AssetDatabase.LoadAssetAtPath("Assets/UI/PanelSettings.asset"); } } if (panelSettings != null) { uiDocument.panelSettings = panelSettings; // Ensure the UIDocument also has a high sortingOrder for proper layering uiDocument.sortingOrder = 10; Debug.Log("Successfully assigned Panel Settings to UIDocument with sortingOrder 10!"); } else { Debug.LogError("Failed to create or find Panel Settings!"); } Debug.Log("Successfully assigned ShopUI.uxml to UIDocument!"); } else { // Try Resources folder uiAsset = Resources.Load("UI/TeamSelectOverview/ShopUI"); if (uiAsset != null) { Debug.Log("Found ShopUI.uxml in Resources folder"); uiDocument.visualTreeAsset = uiAsset; Debug.Log("Successfully assigned ShopUI.uxml to UIDocument!"); } else { Debug.LogError("Could not find ShopUI.uxml! Please check that the file exists at Assets/UI/TeamSelectOverview/ShopUI.uxml"); Debug.LogError("Manual assignment required: Select the ShopManager GameObject and assign ShopUI.uxml to the UIDocument component."); } } #else // In build, try Resources folder uiAsset = Resources.Load("UI/TeamSelectOverview/ShopUI"); if (uiAsset != null) { uiDocument.visualTreeAsset = uiAsset; Debug.Log("Successfully assigned ShopUI.uxml to UIDocument!"); } else { Debug.LogError("Could not find ShopUI.uxml in Resources folder!"); } #endif Debug.Log("The shop is now ready to use with the inventory system!"); // Select the created GameObject in the hierarchy for easy inspection #if UNITY_EDITOR UnityEditor.Selection.activeGameObject = shopGO; #endif } [ContextMenu("Test Shop System")] void TestShopSystem() { var shopManager = FindFirstObjectByType(); if (shopManager == null) { Debug.LogError("No ShopManager found in scene. Please create one first using 'Create Shop GameObject'."); return; } Debug.Log("Testing Shop System..."); // Check if UIDocument is assigned var uiDocument = shopManager.GetComponent(); if (uiDocument == null) { Debug.LogError("ShopManager doesn't have a UIDocument component!"); return; } // Check if UXML is assigned if (uiDocument.visualTreeAsset == null) { Debug.LogError("UIDocument doesn't have a Visual Tree Asset assigned! Please assign ShopUI.uxml manually or use 'Assign Shop UI Asset' context menu."); return; } Debug.Log($"UIDocument found with asset: {uiDocument.visualTreeAsset.name}"); // Check if UI elements can be found var root = uiDocument.rootVisualElement; var shopContainer = root.Q("ShopContainer"); Debug.Log($"ShopContainer found in root: {shopContainer != null}"); if (shopContainer == null) { Debug.LogError("ShopContainer not found! This means the UXML structure might be wrong or not loaded properly."); Debug.Log("Checking root element children..."); Debug.Log($"Root element has {root.childCount} children"); for (int i = 0; i < root.childCount; i++) { var child = root.ElementAt(i); Debug.Log($"Child {i}: {child.name} (type: {child.GetType().Name})"); } return; } // Test opening the shop var testCharacter = new TeamCharacter("Test Hero", true); testCharacter.gold = 100; // Give some starting money Debug.Log("Opening shop for test character..."); shopManager.OpenShop(testCharacter); // Check if shop is actually visible Debug.Log($"Shop container display style: {shopContainer.style.display}"); Debug.Log($"Shop container resolved style display: {shopContainer.resolvedStyle.display}"); Debug.Log($"Shop container world bound: {shopContainer.worldBound}"); Debug.Log($"Shop container local bound: {shopContainer.localBound}"); Debug.Log("Shop test completed! If you don't see the shop window, check that:"); Debug.Log("1. Panel Settings is assigned to the UIDocument"); Debug.Log("2. No other UI is covering the shop"); Debug.Log("3. The shop might be outside the camera view"); } [ContextMenu("Debug Shop Setup")] void DebugShopSetup() { Debug.Log("=== SHOP SETUP DEBUG ==="); var shopManager = FindFirstObjectByType(); Debug.Log($"ShopManager found: {shopManager != null}"); if (shopManager != null) { var uiDocument = shopManager.GetComponent(); Debug.Log($"UIDocument found: {uiDocument != null}"); if (uiDocument != null) { Debug.Log($"Visual Tree Asset assigned: {uiDocument.visualTreeAsset != null}"); if (uiDocument.visualTreeAsset != null) { Debug.Log($"Asset name: {uiDocument.visualTreeAsset.name}"); } } } // Check if UXML file exists #if UNITY_EDITOR var uiAsset = AssetDatabase.LoadAssetAtPath("Assets/UI/TeamSelectOverview/ShopUI.uxml"); Debug.Log($"ShopUI.uxml exists at expected path: {uiAsset != null}"); #endif Debug.Log("=== END DEBUG ==="); } }