PerceptionEventSystemSetup.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. using UnityEngine;
  2. /// <summary>
  3. /// Setup script for the enhanced perception and event system
  4. /// Automatically adds required components and configures the spottable event system
  5. /// </summary>
  6. public class PerceptionEventSystemSetup : MonoBehaviour
  7. {
  8. [Header("Auto Setup")]
  9. [SerializeField] private bool autoSetupOnStart = true;
  10. [Header("Event Marker Settings")]
  11. [SerializeField] private GameObject eventMarkerPrefab;
  12. [SerializeField] private Material eventMarkerMaterial;
  13. [SerializeField] private Color eventMarkerColor = Color.red;
  14. [SerializeField] private int maxActiveMarkers = 5;
  15. [Header("Debug")]
  16. [SerializeField] private bool showSetupLogs = true;
  17. void Start()
  18. {
  19. if (autoSetupOnStart)
  20. {
  21. SetupPerceptionEventSystem();
  22. }
  23. }
  24. /// <summary>
  25. /// Sets up the perception and event system components
  26. /// </summary>
  27. [ContextMenu("Setup Perception Event System")]
  28. public void SetupPerceptionEventSystem()
  29. {
  30. if (showSetupLogs)
  31. Debug.Log("🔧 Setting up Perception Event System...");
  32. // Ensure TeamPerceptionVisualizer exists
  33. SetupPerceptionVisualizer();
  34. // Setup EventMarkerVisualizer
  35. SetupEventMarkerVisualizer();
  36. // Verify TravelEventSystem integration
  37. VerifyTravelEventSystem();
  38. if (showSetupLogs)
  39. Debug.Log("✅ Perception Event System setup complete!");
  40. }
  41. private void SetupPerceptionVisualizer()
  42. {
  43. var perceptionVisualizer = FindFirstObjectByType<TeamPerceptionVisualizer>();
  44. if (perceptionVisualizer == null)
  45. {
  46. // Find a suitable GameObject to add it to (prefer the one with SimpleTeamPlacement)
  47. var teamPlacement = FindFirstObjectByType<SimpleTeamPlacement>();
  48. GameObject targetObject = teamPlacement?.gameObject ?? gameObject;
  49. perceptionVisualizer = targetObject.AddComponent<TeamPerceptionVisualizer>();
  50. if (showSetupLogs)
  51. Debug.Log($"✅ Added TeamPerceptionVisualizer to {targetObject.name}");
  52. }
  53. else if (showSetupLogs)
  54. {
  55. Debug.Log("✅ TeamPerceptionVisualizer already exists");
  56. }
  57. }
  58. private void SetupEventMarkerVisualizer()
  59. {
  60. var markerVisualizer = FindFirstObjectByType<EventMarkerVisualizer>();
  61. if (markerVisualizer == null)
  62. {
  63. // Find a suitable GameObject to add it to (prefer the one with TravelEventSystem)
  64. var eventSystem = FindFirstObjectByType<TravelEventSystem>();
  65. GameObject targetObject = eventSystem?.gameObject ?? gameObject;
  66. markerVisualizer = targetObject.AddComponent<EventMarkerVisualizer>();
  67. // Configure with our settings
  68. if (eventMarkerPrefab != null)
  69. {
  70. // Use reflection to set private fields since they're SerializeField
  71. var prefabField = markerVisualizer.GetType().GetField("eventMarkerPrefab",
  72. System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
  73. prefabField?.SetValue(markerVisualizer, eventMarkerPrefab);
  74. }
  75. if (eventMarkerMaterial != null)
  76. {
  77. var materialField = markerVisualizer.GetType().GetField("eventMarkerMaterial",
  78. System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
  79. materialField?.SetValue(markerVisualizer, eventMarkerMaterial);
  80. }
  81. var colorField = markerVisualizer.GetType().GetField("eventMarkerColor",
  82. System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
  83. colorField?.SetValue(markerVisualizer, eventMarkerColor);
  84. var maxMarkersField = markerVisualizer.GetType().GetField("maxActiveMarkers",
  85. System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
  86. maxMarkersField?.SetValue(markerVisualizer, maxActiveMarkers);
  87. if (showSetupLogs)
  88. Debug.Log($"✅ Added EventMarkerVisualizer to {targetObject.name}");
  89. }
  90. else if (showSetupLogs)
  91. {
  92. Debug.Log("✅ EventMarkerVisualizer already exists");
  93. }
  94. }
  95. private void VerifyTravelEventSystem()
  96. {
  97. var eventSystem = FindFirstObjectByType<TravelEventSystem>();
  98. if (eventSystem == null)
  99. {
  100. if (showSetupLogs)
  101. Debug.LogWarning("⚠️ No TravelEventSystem found. Please add one to use the event system.");
  102. return;
  103. }
  104. if (showSetupLogs)
  105. Debug.Log("✅ TravelEventSystem found and should integrate automatically");
  106. }
  107. /// <summary>
  108. /// Creates example spottable events for testing
  109. /// </summary>
  110. [ContextMenu("Create Example Spottable Events")]
  111. public void CreateExampleSpottableEvents()
  112. {
  113. if (showSetupLogs)
  114. Debug.Log("🎭 Creating example spottable events...");
  115. // This would create ScriptableObject assets in the project
  116. // For now, just log what would be created
  117. Debug.Log("📋 Example events to create:");
  118. Debug.Log("- SpottableSkeletonPatrol: Skeleton warriors that can be spotted and avoided");
  119. Debug.Log("- SpottableBanditCamp: Bandit camps visible from a distance");
  120. Debug.Log("- SpottableTreasureCache: Hidden treasure that can be spotted with good perception");
  121. Debug.Log("💡 Tip: Right-click in Project → Create → RPG → Travel Events → Spottable → [Event Type]");
  122. }
  123. /// <summary>
  124. /// Shows current system status
  125. /// </summary>
  126. [ContextMenu("Show System Status")]
  127. public void ShowSystemStatus()
  128. {
  129. Debug.Log("=== Perception Event System Status ===");
  130. var perceptionVisualizer = FindFirstObjectByType<TeamPerceptionVisualizer>();
  131. Debug.Log($"TeamPerceptionVisualizer: {(perceptionVisualizer ? "✅ Found" : "❌ Missing")}");
  132. var markerVisualizer = FindFirstObjectByType<EventMarkerVisualizer>();
  133. Debug.Log($"EventMarkerVisualizer: {(markerVisualizer ? "✅ Found" : "❌ Missing")}");
  134. var eventSystem = FindFirstObjectByType<TravelEventSystem>();
  135. Debug.Log($"TravelEventSystem: {(eventSystem ? "✅ Found" : "❌ Missing")}");
  136. var teamPlacement = FindFirstObjectByType<SimpleTeamPlacement>();
  137. Debug.Log($"SimpleTeamPlacement: {(teamPlacement ? "✅ Found" : "❌ Missing")}");
  138. if (markerVisualizer != null)
  139. {
  140. // Use reflection to get active marker count
  141. var method = markerVisualizer.GetType().GetMethod("GetActiveMarkerCount");
  142. if (method != null)
  143. {
  144. int activeMarkers = (int)method.Invoke(markerVisualizer, null);
  145. Debug.Log($"Active Event Markers: {activeMarkers}");
  146. }
  147. }
  148. Debug.Log("========================================");
  149. }
  150. }