using System.Collections; using Unity.Netcode; using UnityEngine; [DisallowMultipleComponent] [RequireComponent(typeof(NetworkRocketItem), typeof(NetworkShockwaveEmitter))] public sealed class RocketImpactExplosion : NetworkBehaviour { [SerializeField] private NetworkRocketItem rocket; [SerializeField] private NetworkShockwaveEmitter shockwave; [SerializeField] private bool despawnAfterExplosion = true; [SerializeField, Min(0f)] private float despawnDelay = 0.15f; private bool exploded; private void Reset() => ResolveReferences(); private void Awake() => ResolveReferences(); public override void OnNetworkSpawn() { rocket.CriticalImpact += HandleCriticalImpact; } public override void OnNetworkDespawn() { if (rocket != null) rocket.CriticalImpact -= HandleCriticalImpact; } private void HandleCriticalImpact() { if (!IsServer || exploded) return; exploded = true; shockwave.EmitShockwave(rocket.LastCriticalImpactPoint); if (despawnAfterExplosion) StartCoroutine(DespawnAfterDelay()); } private IEnumerator DespawnAfterDelay() { if (despawnDelay > 0f) yield return new WaitForSeconds(despawnDelay); if (IsServer && NetworkObject != null && NetworkObject.IsSpawned) NetworkObject.Despawn(true); } private void ResolveReferences() { if (rocket == null) rocket = GetComponent(); if (shockwave == null) shockwave = GetComponent(); } }