using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using TMPro;
using TheIsland.Network;
using TheIsland.Models;
namespace TheIsland.UI
{
///
/// Main UI Manager - Creates and manages the game's UI canvas programmatically.
/// Attach this to an empty GameObject, it will create all UI elements automatically.
///
public class UIManager : MonoBehaviour
{
#region Singleton
private static UIManager _instance;
public static UIManager Instance => _instance;
#endregion
#region UI References (Auto-created)
private Canvas _canvas;
private TextMeshProUGUI _connectionStatus;
private TextMeshProUGUI _goldDisplay;
private TextMeshProUGUI _tickInfo;
private TMP_InputField _commandInput;
private Button _sendButton;
private Button _resetButton;
private GameObject _notificationPanel;
private TextMeshProUGUI _notificationText;
// EventLog 现在自己管理初始化
#endregion
#region State
private int _playerGold = 100;
private int _currentDay = 1;
private int _currentTick = 0;
private int _aliveCount = 3;
#endregion
#region Unity Lifecycle
private void Awake()
{
if (_instance != null && _instance != this)
{
Destroy(gameObject);
return;
}
_instance = this;
CreateUI();
}
private void Start()
{
SubscribeToEvents();
UpdateAllUI();
// Check if already connected (in case we missed the event)
if (NetworkManager.Instance != null && NetworkManager.Instance.IsConnected)
{
OnConnected();
}
// Start periodic connection check
InvokeRepeating(nameof(CheckConnectionStatus), 1f, 1f);
}
private void CheckConnectionStatus()
{
if (NetworkManager.Instance != null && NetworkManager.Instance.IsConnected)
{
if (_connectionStatus != null && _connectionStatus.text.Contains("Disconnected"))
{
OnConnected();
Debug.Log("[UIManager] Connection detected via periodic check");
}
}
}
private void OnDestroy()
{
UnsubscribeFromEvents();
}
#endregion
#region Event Subscription
private void SubscribeToEvents()
{
var network = NetworkManager.Instance;
if (network == null)
{
Debug.LogError("[UIManager] NetworkManager.Instance is null!");
return;
}
Debug.Log($"[UIManager] Subscribing to NetworkManager events (Instance ID: {network.GetInstanceID()})");
network.OnConnected += OnConnected;
network.OnDisconnected += OnDisconnected;
network.OnTick += OnTick;
network.OnFeed += OnFeed;
network.OnUserUpdate += OnUserUpdate;
network.OnAgentDied += OnAgentDied;
network.OnSystemMessage += OnSystemMessage;
network.OnAgentsUpdate += OnAgentsUpdate;
}
private void UnsubscribeFromEvents()
{
var network = NetworkManager.Instance;
if (network == null) return;
network.OnConnected -= OnConnected;
network.OnDisconnected -= OnDisconnected;
network.OnTick -= OnTick;
network.OnFeed -= OnFeed;
network.OnUserUpdate -= OnUserUpdate;
network.OnAgentDied -= OnAgentDied;
network.OnSystemMessage -= OnSystemMessage;
network.OnAgentsUpdate -= OnAgentsUpdate;
}
#endregion
#region UI Creation
private void CreateUI()
{
// Create EventSystem if not exists (required for UI input)
if (FindAnyObjectByType() == null)
{
var eventSystemObj = new GameObject("EventSystem");
eventSystemObj.AddComponent();
eventSystemObj.AddComponent();
Debug.Log("[UIManager] Created EventSystem for UI input");
}
// Create Canvas
var canvasObj = new GameObject("GameCanvas");
canvasObj.transform.SetParent(transform);
_canvas = canvasObj.AddComponent