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

105 lines
2.8 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;
[SerializeField] float accuracy;
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)
{
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;
}
}