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

119 lines
3.5 KiB
C#

using FlappyBird.Bird;
using FlappyBird.Core;
using FlappyBird.Environment;
using FlappyBird.Ground;
using FlappyBird.Pipes;
using FlappyBird.UI;
using UnityEngine;
using Zenject;
namespace FlappyBird.Installers
{
/// <summary>
/// Core Zenject installer for the game scene.
/// Handles binding of all game services, settings, and prefabs.
/// </summary>
public class GameInstaller : MonoInstaller
{
[Header("Bird")]
[SerializeField] private BirdSettings birdSettings;
[SerializeField] private BirdView birdPrefab;
[Header("Pipes")]
[SerializeField] private PipeSettings pipeSettings;
[SerializeField] private GameObject pipePairPrefab;
[Header("Environment")]
[SerializeField] private GroundSettings groundSettings;
[SerializeField] private GameObject groundPrefab;
[Header("UI & Effects")]
[SerializeField] private GameUIView gameUIPrefab;
[SerializeField] private GameObject scorePopupPrefab;
public override void InstallBindings()
{
InstallCore();
InstallEnvironment();
InstallBird();
InstallPipes();
InstallScoring();
InstallUI();
}
private void InstallCore()
{
Container.BindInterfacesTo<GameManager>().AsSingle();
Container.BindInterfacesTo<DeathManager>().AsSingle();
// Generic ObjectPoolManager handles all IPoolable types
Container.BindInterfacesTo<ObjectPoolManager>().AsSingle().NonLazy();
}
private void InstallEnvironment()
{
Container.BindInstance(groundSettings).AsSingle();
Container.Bind<GameObject>()
.WithId("GroundPrefab")
.FromInstance(groundPrefab)
.AsCached();
Container.BindInterfacesTo<GroundSpawner>()
.AsSingle()
.NonLazy();
}
private void InstallPipes()
{
Container.BindInstance(pipeSettings).AsSingle();
Container.Bind<GameObject>()
.WithId("PipePrefab")
.FromInstance(pipePairPrefab)
.AsCached();
Container.BindInterfacesTo<PipeSpawner>()
.AsSingle()
.NonLazy();
}
private void InstallBird()
{
Container.BindInstance(birdSettings).AsSingle();
Container.Bind<BirdView>()
.FromComponentInNewPrefab(birdPrefab)
.AsSingle()
.NonLazy();
Container.BindInterfacesTo<BirdController>()
.AsSingle()
.NonLazy();
}
private void InstallScoring()
{
Container.BindInterfacesTo<PlayerPrefsStorage>().AsSingle();
Container.BindInterfacesTo<ScoreManager>().AsSingle().NonLazy();
}
private void InstallUI()
{
// Binds the +1 popup prefab so GameUIController can resolve it
Container.Bind<GameObject>()
.WithId("ScorePopupPrefab")
.FromInstance(scorePopupPrefab)
.AsCached();
Container.Bind<GameUIView>()
.FromComponentInNewPrefab(gameUIPrefab)
.AsSingle()
.NonLazy();
Container.BindInterfacesTo<GameUIController>()
.AsSingle()
.NonLazy();
}
}
}