110 lines
3.0 KiB
C#
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;
|
|
}
|
|
}
|