sea-battle-vr/Assets/Scripts/Gameplay/AirDropManager.cs

110 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
public class AirDropManager : MonoBehaviour
{
public static event Action<float, bool> AccuracyUpdated;
[SerializeField] InSignal airdropRequestButton = InSignal.UpLeft;
[SerializeField] int hitsCount;
public static float Accuracy { get; private set; }
public static float RequiredAccuracy => instance.GetRequiredAccuracy();
private static AirDropManager instance;
private int airdropsPerformed = 0;
[SerializeField] List<float> accuracyToAirdropList;
private GameObject playerGO;
private int totalAmmo;
[SerializeField] BezierWay airdropWay;
[SerializeField] Drone dronePrefab;
[SerializeField] Transform droneSpawnPoint;
[SerializeField] AudioClip launchSound;
public bool AirdropOnTheWay { get; private set; }
public void Init(GameObject player)
{
instance = this;
playerGO = player;
hitsCount = 0;
AirdropOnTheWay = false;
totalAmmo = 0;
var weapons = G.WeaponModel.Weapons;
foreach (var weapon in weapons)
{
totalAmmo += weapon.MaxAmmo;
}
Damager.OnCollideHitbox += OnProjectileHit;
AmmoBox.OnAmmoBoxConsumed += OnAirdropConsumed;
}
private void OnDestroy()
{
Damager.OnCollideHitbox -= OnProjectileHit;
AmmoBox.OnAmmoBoxConsumed -= OnAirdropConsumed;
}
private float GetRequiredAccuracy()
{
int index = Mathf.Min(airdropsPerformed, accuracyToAirdropList.Count-1);
float accuracy = accuracyToAirdropList[index];
return Mathf.Clamp01(accuracy);
}
private void OnProjectileHit(GameObject damagerOwner, GameObject hitboxOwner)
{
bool shootByPlayer = damagerOwner == playerGO;
bool hitToEnemy = hitboxOwner.TryGetComponent<EnemyShip>(out _);
if (shootByPlayer && hitToEnemy)
{
hitsCount++;
UpdateAccuracy();
}
}
private void OnAirdropConsumed()
{
AirdropOnTheWay = false;
hitsCount = 0;
UpdateAccuracy();
}
private void UpdateAccuracy()
{
Accuracy = totalAmmo > 0 ? (float)hitsCount / totalAmmo : 0f;
float requiredAccuracy = GetRequiredAccuracy();
bool canDrop = Accuracy >= requiredAccuracy;
AccuracyUpdated?.Invoke(Accuracy, canDrop);
}
private void Update()
{
if (In.GetButtonDown(airdropRequestButton))
{
LaunchDrone();
}
}
private void LaunchDrone()
{
if (AirdropOnTheWay) return;
if (Accuracy < GetRequiredAccuracy()) return;
SoundManager.PlayReplica(launchSound);
var go = Instantiate(dronePrefab, droneSpawnPoint.position, Quaternion.identity);
var drone = go.GetComponent<Drone>();
drone.Init(airdropWay);
airdropsPerformed++;
//AccuracyUpdated?.Invoke(Accuracy, false);
AirdropOnTheWay = true;
}
}