using System; using System.Collections.Generic; using UnityEngine; using Wwise.Wooduan.Core; namespace Wwise.Wooduan.Components { [AddComponentMenu("Wwise/AkSubRoom")] [RequireComponent(typeof(BoxCollider))] [DisallowMultipleComponent] //Sub room, used for making composite geometry rooms by combining multiple rooms together. public class AkSubRoom : AkSpace { internal override AkSpatialAudioRoom Room => _mainRoom ? _mainRoom : transform.parent.GetComponent(); private AkRoom _mainRoom; public bool overrideFloor; public int floor; internal override int GetFloor(Vector3 position) { if (overrideFloor) return floor; return _mainRoom ? _mainRoom.GetFloor(position) : AkSpace.AK_INVALID_FLOOR; } protected override void Init() { _mainRoom = transform.parent.GetComponent(); if (_mainRoom) _mainRoom.RegisterSubRoom(this); } protected override void Dispose() { if (_mainRoom) _mainRoom.UnregisterSubRoom(this); } internal override AkSpace FindSpaceAtPosition(Vector3 position) { if (!isActiveAndEnabled) return null; if (GetClosestPointToPosition(position) == position) return this; return null; } internal override void OnEmitterEntered(AkGameObj emitter) { _mainRoom.OnEmitterEntered(emitter); } internal override void OnEmitterExited(AkGameObj emitter) { _mainRoom.OnEmitterExited(emitter); } public override bool IsValid() { return Room; } #if UNITY_EDITOR public void AutoRename() { if (!Room) { Debug.LogError($"AkSubRoom {name} has no main room!"); return; } var newName = Room.name.Replace("AkRoom", "AkSubRoom"); if (overrideFloor) newName = newName.Remove(newName.Length - 4) + $"({floor + 1}F)"; gameObject.name = newName; } #endif } }