using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace Beyond { public class EventVolume : MonoBehaviour { [SerializeField] private List streamingVolume = new List(); private int activeVolumesCount; [SerializeField] private List forceCloseVolume = new List(); private int activeForceCloseVolumesCount; private Activator activator; private bool isActive; private bool firstTimeTriggered; public List ForceCloseVolume { get => forceCloseVolume; set => forceCloseVolume = value; } private void Awake() { activator = GetComponentInChildren(); AssignToEvent(); } private void Start() { if (!firstTimeTriggered) { OnVolume(); } } private void OnDestroy() { if (streamingVolume != null) { foreach (var item in streamingVolume) { if (item != null) { item.OnVolume -= OnVolume; } } } if (forceCloseVolume != null) { foreach (var item in forceCloseVolume) { if (item != null) { item.OnVolume -= OnVolume; } } } } public void AssignToEvent() { if (streamingVolume != null) { foreach (var item in streamingVolume) { if (item != null) { item.OnVolume += OnVolume; } } } if (forceCloseVolume != null) { foreach (var item in forceCloseVolume) { if (item != null) { item.OnVolume += OnVolume; } } } } private int GetCountOfActiveVolumes() { int count = 0; for (int i = 0; i < streamingVolume.Count; i++) { if (streamingVolume[i].IsVolumeActive) { count++; } } return count; } private int GetCountOfActiveForceCloseVolumes() { int count = 0; for (int i = 0; i < forceCloseVolume.Count; i++) { if (forceCloseVolume[i] != null && forceCloseVolume[i].IsVolumeActive) { count++; } } return count; } private void OnVolume() { firstTimeTriggered = true; activeVolumesCount = GetCountOfActiveVolumes(); activeForceCloseVolumesCount = GetCountOfActiveForceCloseVolumes(); if (activeForceCloseVolumesCount > 0) { isActive = false; } else if (activeVolumesCount > 0) { isActive = true; } else { isActive = false; } if (activator != null) { activator.SetActive(isActive); } } } }