128 lines
3.1 KiB
C#
128 lines
3.1 KiB
C#
using System;
|
|
using UnityEngine;
|
|
using Zenject;
|
|
|
|
namespace FlappyBird.Core
|
|
{
|
|
public class DeathManager : IDeathManager, IInitializable, ITickable, IDisposable
|
|
{
|
|
private const float ShakeDuration = 0.2f;
|
|
private const float ShakeMagnitude = 0.18f;
|
|
|
|
private readonly IGameManager _gameManager;
|
|
|
|
private Transform _cameraTransform;
|
|
private Vector3 _cameraBaseLocalPosition;
|
|
private float _shakeTimeRemaining;
|
|
|
|
[Inject]
|
|
public DeathManager(IGameManager gameManager)
|
|
{
|
|
_gameManager = gameManager;
|
|
}
|
|
|
|
public bool IsDead { get; private set; }
|
|
|
|
public event Action OnDied;
|
|
|
|
public void Initialize()
|
|
{
|
|
_gameManager.OnGameStateChanged += HandleGameStateChanged;
|
|
CacheMainCamera();
|
|
IsDead = false;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
_gameManager.OnGameStateChanged -= HandleGameStateChanged;
|
|
ResetCameraPosition();
|
|
}
|
|
|
|
public void Tick()
|
|
{
|
|
if (_shakeTimeRemaining <= 0f)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!CacheMainCamera())
|
|
{
|
|
_shakeTimeRemaining = 0f;
|
|
return;
|
|
}
|
|
|
|
_shakeTimeRemaining -= Time.deltaTime;
|
|
if (_shakeTimeRemaining <= 0f)
|
|
{
|
|
ResetCameraPosition();
|
|
return;
|
|
}
|
|
|
|
float strength = ShakeMagnitude * (_shakeTimeRemaining / ShakeDuration);
|
|
Vector2 offset = UnityEngine.Random.insideUnitCircle * strength;
|
|
_cameraTransform.localPosition = _cameraBaseLocalPosition + new Vector3(offset.x, offset.y, 0f);
|
|
}
|
|
|
|
public void Die()
|
|
{
|
|
if (IsDead || _gameManager.CurrentState != GameState.Playing)
|
|
{
|
|
return;
|
|
}
|
|
|
|
IsDead = true;
|
|
StartCameraShake();
|
|
OnDied?.Invoke();
|
|
_gameManager.GameOver();
|
|
}
|
|
|
|
private void HandleGameStateChanged(GameState state)
|
|
{
|
|
if (state == GameState.Menu)
|
|
{
|
|
IsDead = false;
|
|
_shakeTimeRemaining = 0f;
|
|
ResetCameraPosition();
|
|
}
|
|
}
|
|
|
|
private void StartCameraShake()
|
|
{
|
|
if (!CacheMainCamera())
|
|
{
|
|
return;
|
|
}
|
|
|
|
_shakeTimeRemaining = ShakeDuration;
|
|
}
|
|
|
|
private bool CacheMainCamera()
|
|
{
|
|
if (_cameraTransform != null)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
Camera mainCamera = Camera.main;
|
|
if (mainCamera == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
_cameraTransform = mainCamera.transform;
|
|
_cameraBaseLocalPosition = _cameraTransform.localPosition;
|
|
return true;
|
|
}
|
|
|
|
private void ResetCameraPosition()
|
|
{
|
|
if (_cameraTransform == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
_cameraTransform.localPosition = _cameraBaseLocalPosition;
|
|
}
|
|
}
|
|
}
|