using UnityEngine;
///
/// Setup script for the enhanced perception and event system
/// Automatically adds required components and configures the spottable event system
///
public class PerceptionEventSystemSetup : MonoBehaviour
{
[Header("Auto Setup")]
[SerializeField] private bool autoSetupOnStart = true;
[Header("Event Marker Settings")]
[SerializeField] private GameObject eventMarkerPrefab;
[SerializeField] private Material eventMarkerMaterial;
[SerializeField] private Color eventMarkerColor = Color.red;
[SerializeField] private int maxActiveMarkers = 5;
[Header("Debug")]
[SerializeField] private bool showSetupLogs = true;
void Start()
{
if (autoSetupOnStart)
{
SetupPerceptionEventSystem();
}
}
///
/// Sets up the perception and event system components
///
[ContextMenu("Setup Perception Event System")]
public void SetupPerceptionEventSystem()
{
if (showSetupLogs)
Debug.Log("🔧 Setting up Perception Event System...");
// Ensure TeamPerceptionVisualizer exists
SetupPerceptionVisualizer();
// Setup EventMarkerVisualizer
SetupEventMarkerVisualizer();
// Verify TravelEventSystem integration
VerifyTravelEventSystem();
if (showSetupLogs)
Debug.Log("✅ Perception Event System setup complete!");
}
private void SetupPerceptionVisualizer()
{
var perceptionVisualizer = FindFirstObjectByType();
if (perceptionVisualizer == null)
{
// Find a suitable GameObject to add it to (prefer the one with SimpleTeamPlacement)
var teamPlacement = FindFirstObjectByType();
GameObject targetObject = teamPlacement?.gameObject ?? gameObject;
perceptionVisualizer = targetObject.AddComponent();
if (showSetupLogs)
Debug.Log($"✅ Added TeamPerceptionVisualizer to {targetObject.name}");
}
else if (showSetupLogs)
{
Debug.Log("✅ TeamPerceptionVisualizer already exists");
}
}
private void SetupEventMarkerVisualizer()
{
var markerVisualizer = FindFirstObjectByType();
if (markerVisualizer == null)
{
// Find a suitable GameObject to add it to (prefer the one with TravelEventSystem)
var eventSystem = FindFirstObjectByType();
GameObject targetObject = eventSystem?.gameObject ?? gameObject;
markerVisualizer = targetObject.AddComponent();
// Configure with our settings
if (eventMarkerPrefab != null)
{
// Use reflection to set private fields since they're SerializeField
var prefabField = markerVisualizer.GetType().GetField("eventMarkerPrefab",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
prefabField?.SetValue(markerVisualizer, eventMarkerPrefab);
}
if (eventMarkerMaterial != null)
{
var materialField = markerVisualizer.GetType().GetField("eventMarkerMaterial",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
materialField?.SetValue(markerVisualizer, eventMarkerMaterial);
}
var colorField = markerVisualizer.GetType().GetField("eventMarkerColor",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
colorField?.SetValue(markerVisualizer, eventMarkerColor);
var maxMarkersField = markerVisualizer.GetType().GetField("maxActiveMarkers",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
maxMarkersField?.SetValue(markerVisualizer, maxActiveMarkers);
if (showSetupLogs)
Debug.Log($"✅ Added EventMarkerVisualizer to {targetObject.name}");
}
else if (showSetupLogs)
{
Debug.Log("✅ EventMarkerVisualizer already exists");
}
}
private void VerifyTravelEventSystem()
{
var eventSystem = FindFirstObjectByType();
if (eventSystem == null)
{
if (showSetupLogs)
Debug.LogWarning("⚠️ No TravelEventSystem found. Please add one to use the event system.");
return;
}
if (showSetupLogs)
Debug.Log("✅ TravelEventSystem found and should integrate automatically");
}
///
/// Shows current system status
///
[ContextMenu("Show System Status")]
public void ShowSystemStatus()
{
Debug.Log("=== Perception Event System Status ===");
var perceptionVisualizer = FindFirstObjectByType();
Debug.Log($"TeamPerceptionVisualizer: {(perceptionVisualizer ? "✅ Found" : "❌ Missing")}");
var markerVisualizer = FindFirstObjectByType();
Debug.Log($"EventMarkerVisualizer: {(markerVisualizer ? "✅ Found" : "❌ Missing")}");
var eventSystem = FindFirstObjectByType();
Debug.Log($"TravelEventSystem: {(eventSystem ? "✅ Found" : "❌ Missing")}");
var teamPlacement = FindFirstObjectByType();
Debug.Log($"SimpleTeamPlacement: {(teamPlacement ? "✅ Found" : "❌ Missing")}");
if (markerVisualizer != null)
{
// Use reflection to get active marker count
var method = markerVisualizer.GetType().GetMethod("GetActiveMarkerCount");
if (method != null)
{
int activeMarkers = (int)method.Invoke(markerVisualizer, null);
Debug.Log($"Active Event Markers: {activeMarkers}");
}
}
Debug.Log("========================================");
}
}