using UnityEngine; using UnityEngine.UIElements; #if UNITY_EDITOR using UnityEditor; #endif /// /// Quick setup component to add to any GameObject in the scene to automatically configure the shop /// Just add this component to any GameObject and it will set everything up for you /// public class QuickShopSetup : MonoBehaviour { [Header("Quick Setup")] [Tooltip("Click this in play mode to automatically setup the shop")] public bool autoSetupOnStart = true; [Header("Setup Results")] [SerializeField] private bool shopSetupComplete = false; [SerializeField] private string statusMessage = "Not setup yet"; /// /// Gets the current status message for debugging purposes /// public string GetStatusMessage() => statusMessage; void Start() { if (autoSetupOnStart) { SetupShop(); } } [ContextMenu("Setup Shop Now")] public void SetupShop() { Debug.Log("=== Quick Shop Setup Starting ==="); // Check if ItemShopManager already exists ItemShopManager existingShop = FindFirstObjectByType(); if (existingShop != null) { // Check if the UIDocument has the UXML assigned UIDocument uiDoc = existingShop.GetComponent(); if (uiDoc != null && uiDoc.visualTreeAsset == null) { Debug.Log("Found ItemShopManager but UIDocument needs UXML assignment..."); AssignShopUIXML(uiDoc); statusMessage = "Fixed UXML assignment for existing shop"; shopSetupComplete = true; return; } else if (uiDoc != null && uiDoc.visualTreeAsset != null) { statusMessage = "Shop already exists and is configured"; shopSetupComplete = true; Debug.Log("✓ ItemShopManager already exists and is properly configured on: " + existingShop.gameObject.name); return; } } // Check for old SimpleShopManager SimpleShopManager oldShop = FindFirstObjectByType(); if (oldShop != null) { Debug.Log("Found old SimpleShopManager, converting to ItemShopManager..."); ConvertOldShop(oldShop); statusMessage = "Converted old shop to new system"; shopSetupComplete = true; return; } // No shop exists, create new one Debug.Log("No shop found, creating new ItemShopManager..."); CreateNewShop(); statusMessage = "Created new shop system"; shopSetupComplete = true; } void ConvertOldShop(SimpleShopManager oldShop) { GameObject shopObject = oldShop.gameObject; string shopName = oldShop.shopName; // Remove old component DestroyImmediate(oldShop); // Add new component ItemShopManager newShop = shopObject.AddComponent(); newShop.shopName = shopName; // Set up UIDocument with proper panel settings UIDocument uiDoc = shopObject.GetComponent(); if (uiDoc == null) { uiDoc = shopObject.AddComponent(); } // Assign ShopUI.uxml AssignShopUIXML(uiDoc); // Set up panel settings SetupPanelSettings(uiDoc); Debug.Log("✓ Converted SimpleShopManager to ItemShopManager on: " + shopObject.name); } void CreateNewShop() { // Create shop GameObject GameObject shopObject = new GameObject("ShopManager"); // Add UIDocument UIDocument uiDoc = shopObject.AddComponent(); // Assign ShopUI.uxml AssignShopUIXML(uiDoc); // Assign Panel Settings and set proper sorting order SetupPanelSettings(uiDoc); // Add ItemShopManager ItemShopManager shopManager = shopObject.AddComponent(); shopManager.shopName = "General Store"; Debug.Log("✓ Created new shop system on: " + shopObject.name); } void AssignShopUIXML(UIDocument uiDoc) { // Try multiple paths to find ShopUI.uxml string[] possiblePaths = { "UI/TeamSelectOverview/ShopUI", "TeamSelectOverview/ShopUI", "UI/ShopUI", "ShopUI" }; VisualTreeAsset shopUI = null; string foundPath = ""; foreach (string path in possiblePaths) { shopUI = Resources.Load(path); if (shopUI != null) { foundPath = path; break; } } // If not found in Resources, try to load directly from Assets if (shopUI == null) { #if UNITY_EDITOR string[] guids = UnityEditor.AssetDatabase.FindAssets("ShopUI t:VisualTreeAsset"); if (guids.Length > 0) { string assetPath = UnityEditor.AssetDatabase.GUIDToAssetPath(guids[0]); shopUI = UnityEditor.AssetDatabase.LoadAssetAtPath(assetPath); foundPath = assetPath; Debug.Log($"Found ShopUI.uxml at: {assetPath}"); } #endif } if (shopUI != null) { uiDoc.visualTreeAsset = shopUI; Debug.Log($"✓ Assigned ShopUI.uxml from {foundPath} to UIDocument"); } else { Debug.LogError("❌ Could not find ShopUI.uxml! Please assign it manually in the UIDocument component."); } } void SetupPanelSettings(UIDocument uiDoc) { // First try to find and reuse existing panel settings from other UI var existingUI = GameObject.Find("TravelUI")?.GetComponent(); if (existingUI?.panelSettings != null) { uiDoc.panelSettings = existingUI.panelSettings; Debug.Log("✓ Panel Settings assigned from TravelUI"); } else { // Try to find from MainTeamSelectScript or other UI components var mainTeamSelect = FindFirstObjectByType(); if (mainTeamSelect != null) { var mainUIDoc = mainTeamSelect.GetComponent(); if (mainUIDoc?.panelSettings != null) { uiDoc.panelSettings = mainUIDoc.panelSettings; Debug.Log("✓ Panel Settings assigned from MainTeamSelectScript"); } } } // If still no panel settings, try to find any PanelSettings asset if (uiDoc.panelSettings == null) { #if UNITY_EDITOR var panelSettingsGuids = UnityEditor.AssetDatabase.FindAssets("t:PanelSettings"); if (panelSettingsGuids.Length > 0) { var path = UnityEditor.AssetDatabase.GUIDToAssetPath(panelSettingsGuids[0]); var settings = UnityEditor.AssetDatabase.LoadAssetAtPath(path); uiDoc.panelSettings = settings; Debug.Log($"✓ Panel Settings auto-assigned: {settings.name}"); } #endif } // Set proper sorting order (> 2 as requested) uiDoc.sortingOrder = 5; // Higher than 2 to ensure shop displays on top if (uiDoc.panelSettings != null) { // Make sure panel settings also have a high sorting order uiDoc.panelSettings.sortingOrder = 5; Debug.Log($"✓ Shop UI sorting order set to {uiDoc.sortingOrder}"); } else { Debug.LogWarning("⚠ Could not assign Panel Settings. You may need to assign it manually."); } } [ContextMenu("Create Sample Items")] public void CreateSampleItems() { Debug.Log("=== Creating Sample Items ==="); // Check if sample items already exist Item[] existingItems = Resources.LoadAll("Items"); if (existingItems.Length > 0) { Debug.Log($"Found {existingItems.Length} existing items - no need to create samples"); return; } // Create sample items programmatically CreateRuntimeItems(); Debug.Log("✓ Created sample items"); } void CreateRuntimeItems() { // Note: These are runtime items, not asset files // For permanent items, use the editor script: RPG > Create Sample Items var sword = ScriptableObject.CreateInstance(); sword.itemName = "Iron Sword"; sword.description = "A sturdy iron sword"; sword.goldCost = 15; sword.minDamage = 2; sword.maxDamage = 8; sword.weaponType = WeaponType.Sword; var bow = ScriptableObject.CreateInstance(); bow.itemName = "Hunting Bow"; bow.description = "A reliable hunting bow"; bow.goldCost = 12; bow.minDamage = 1; bow.maxDamage = 6; bow.range = 150; bow.weaponType = WeaponType.Bow; var armor = ScriptableObject.CreateInstance(); armor.itemName = "Leather Armor"; armor.description = "Basic leather protection"; armor.goldCost = 10; armor.armorClass = 1; armor.armorType = ArmorType.Light; armor.armorSlot = ArmorSlot.Chest; var potion = ScriptableObject.CreateInstance(); potion.itemName = "Health Potion"; potion.description = "Restores health"; potion.goldCost = 5; potion.isConsumable = true; potion.healthDiceCount = 1; potion.healthDiceType = 6; potion.healthBonus = 1; Debug.Log("Created runtime items: Iron Sword, Hunting Bow, Leather Armor, Health Potion"); Debug.Log("Note: These are temporary runtime items. For permanent items, use RPG > Create Sample Items menu"); } [ContextMenu("Test Shop")] public void TestShop() { ItemShopManager shop = FindFirstObjectByType(); if (shop == null) { Debug.LogError("No ItemShopManager found! Run Setup Shop first."); return; } // Try to find a character to test with var teamSelectScript = FindFirstObjectByType(); if (teamSelectScript != null) { Debug.Log("✓ Found MainTeamSelectScript - shop should work with character selection"); } else { Debug.LogWarning("⚠ No MainTeamSelectScript found - shop might not have character context"); } Debug.Log("Shop test complete - try clicking on character equipment slots to open shop"); } void OnValidate() { if (Application.isPlaying && autoSetupOnStart && !shopSetupComplete) { SetupShop(); } } }