using System; using System.Collections.Generic; using AK.Wwise; using UnityEngine; using UnityEngine.Serialization; using Wwise.Wooduan.Core; using Wwise.Wooduan.Tools; using Event = AK.Wwise.Event; namespace Wwise.Wooduan.Components { public class AkOutdoor : AkSpatialAudioRoom { private int _currentGeometryIndex; internal override AkSpatialAudioRoom Room => this; internal override bool IsOutdoor => true; internal static readonly List PendingPortals = new List(); public static AkOutdoor GetInstance() { return _instance; } private static AkOutdoor _instance; #region LifeCycle protected override void Init() { if (_instance) DestroyImmediate(_instance); _instance = this; } private void Update() { var listenerPosition = ListenerManager.GetListenerLocation(); if (listenerPosition != Vector3.zero) { if (_currentGeometryIndex < _geometries.Count) { var geometry = _geometries[_currentGeometryIndex]; if (geometry) geometry.TryCull(listenerPosition); _currentGeometryIndex++; } else _currentGeometryIndex = 0; } } internal override void Refresh(bool active) { if (active) { RegisterInWwise(); PostRoomTone(); foreach (var portal in PendingPortals) { portal.Refresh(true); } PendingPortals.Clear(); } else { StopRoomTone(); UnregisterInWwise(); } foreach (var geometry in _geometries) { geometry.Refresh(active); } } #endregion #region Portal internal override AkRoomPortal FindNearestPortalOpenedToOutdoor(Vector3 position, out float distance) { distance = 0f; return null; } internal override AkRoomPortal FindPortalAtPosition(Vector3 position, PortalType portalType) { return null; } #endregion Portal protected override AkRoomParams GetRoomParams() { var roomParams = new AkRoomParams { Up = transform.up, Front = transform.forward, ReverbAuxBus = SpatialAudioManager.RoomEnabled ? reverbAuxBus.Id : AkSoundEngine.AK_INVALID_AUX_ID, ReverbLevel = SpatialAudioManager.RoomEnabled ? 1f : 0f, RoomGameObj_AuxSendLevelToSelf = 0f, TransmissionLoss = 0f, RoomGameObj_KeepRegistered = roomToneEvent.IsValid(), }; return roomParams; } internal override AkSpace FindSpaceAtPosition(Vector3 position) { return this; } } }