Files
2026-03-16 14:38:46 +02:00

85 lines
2.6 KiB
C#

using System;
using FlappyBird.Core;
using UnityEngine;
using Zenject;
namespace FlappyBird.UI
{
public class GameUIController : IGameUIController, IInitializable, IDisposable
{
private readonly IGameManager _gameManager;
private readonly IScoreManager _scoreManager;
private readonly IObjectPoolManager _poolManager;
private readonly GameObject _popupPrefab;
private GameUIView _view;
[Inject]
public GameUIController(
IGameManager gameManager,
IScoreManager scoreManager,
IObjectPoolManager poolManager,
[Inject(Id = "ScorePopupPrefab")] GameObject popupPrefab)
{
_gameManager = gameManager;
_scoreManager = scoreManager;
_poolManager = poolManager;
_popupPrefab = popupPrefab;
}
public void Initialize()
{
_poolManager.RegisterPool<ScorePopupView>(_popupPrefab, 5);
_gameManager.OnGameStateChanged += HandleGameStateChanged;
_scoreManager.OnScoreChanged += HandleScoreChanged;
}
public void Dispose()
{
_gameManager.OnGameStateChanged -= HandleGameStateChanged;
_scoreManager.OnScoreChanged -= HandleScoreChanged;
}
public void Bind(GameUIView view)
{
_view = view;
RefreshView();
}
private void HandleScoreChanged(int score)
{
if (_view == null || score == 0) return;
_view.SetCurrentScore(score);
_view.ShowScoreGain();
// 1. Get from pool
var popup = _poolManager.Get<ScorePopupView>();
// 2. Use the container provided by the View
// 'worldPositionStays: false' is CRITICAL for UI elements
popup.transform.SetParent(_view.PopupContainer, false);
// 3. Reset local position to zero (the center of the container)
popup.transform.localPosition = Vector3.zero;
}
private void HandleGameStateChanged(GameState state) => ApplyState(state);
private void ApplyState(GameState state)
{
if (_view == null) return;
_view.SetTapToStartVisible(state == GameState.Menu);
_view.SetGameOverVisible(state == GameState.GameOver);
_view.SetCurrentScoreVisible(state == GameState.Playing);
}
private void RefreshView()
{
_view.SetCurrentScore(_scoreManager.CurrentScore);
_view.SetBestScore(_scoreManager.BestScore);
ApplyState(_gameManager.CurrentState);
}
}
}