#if ! (UNITY_DASHBOARD_WIDGET || UNITY_WEBPLAYER || UNITY_WII || UNITY_WIIU || UNITY_NACL || UNITY_FLASH || UNITY_BLACKBERRY) // Disable under unsupported platforms. /******************************************************************************* The content of this file includes portions of the proprietary AUDIOKINETIC Wwise Technology released in source code form as part of the game integration package. The content of this file may not be used without valid licenses to the AUDIOKINETIC Wwise Technology. Note that the use of the game engine is subject to the Unity(R) Terms of Service at https://unity3d.com/legal/terms-of-service License Usage Licensees holding valid licenses to the AUDIOKINETIC Wwise Technology may use this file in accordance with the end user license agreement provided with the software or, alternatively, in accordance with the terms contained in a written agreement between you and Audiokinetic Inc. Copyright (c) 2025 Audiokinetic Inc. *******************************************************************************/ /// @brief Use this component to define an area that straddles two different AkEnvironment's zones and allow mixing between both zones. \ref unity_use_AkEnvironment_AkEnvironmentPortal [UnityEngine.AddComponentMenu("Wwise/AkEnvironmentPortal")] [UnityEngine.RequireComponent(typeof(UnityEngine.BoxCollider))] public class AkEnvironmentPortal : UnityEngine.MonoBehaviour { public const int MAX_ENVIRONMENTS_PER_PORTAL = 2; ///The axis used to find the contribution of each environment public UnityEngine.Vector3 axis = UnityEngine.Vector3.right; ///The array is already sorted by position. ///The first environment is on the negative side of the portal(opposite to the direction of the chosen axis) ///The second environment is on the positive side of the portal public AkEnvironment[] environments = new AkEnvironment[MAX_ENVIRONMENTS_PER_PORTAL]; private UnityEngine.BoxCollider m_BoxCollider; private UnityEngine.BoxCollider BoxCollider { get { if (!m_BoxCollider) m_BoxCollider = GetComponent(); return m_BoxCollider; } } public bool EnvironmentsShareAuxBus { get { if (environments[0] == null) return environments[1] == null; if (environments[1] == null) return false; if (environments[0].data == null) return environments[1].data == null; if (environments[1].data == null) return false; return environments[0].data.Id == environments[1].data.Id; } } public float GetAuxSendValueForPosition(UnityEngine.Vector3 in_position, int index) { //total length of the portal in the direction of axis var portalLength = UnityEngine.Vector3.Dot(UnityEngine.Vector3.Scale(BoxCollider.size, transform.lossyScale), axis); //transform axis to world coordinates var axisWorld = UnityEngine.Vector3.Normalize(transform.rotation * axis); //Get distance form left side of the portal(opposite to the direction of axis) to the game object in the direction of axisWorld var dist = UnityEngine.Vector3.Dot(in_position - (transform.position - portalLength * 0.5f * axisWorld), axisWorld); dist = UnityEngine.Mathf.Clamp(dist, 0, portalLength); //calculate value of the environment referred by index if (index == 0) return (portalLength - dist) * (portalLength - dist) / (portalLength * portalLength); return dist * dist / (portalLength * portalLength); } #if UNITY_EDITOR /// This enables us to detect intersections between portals and environments in the editor [System.Serializable] public class EnvListWrapper { public System.Collections.Generic.List list = new System.Collections.Generic.List(); } /// Unity can't serialize an array of list so we wrap the list in a serializable class public EnvListWrapper[] envList = { new EnvListWrapper(), //All environments on the negative side of each portal(opposite to the direction of the chosen axis) new EnvListWrapper() //All environments on the positive side of each portal(same direction as the chosen axis) }; #endif } #endif // #if ! (UNITY_DASHBOARD_WIDGET || UNITY_WEBPLAYER || UNITY_WII || UNITY_WIIU || UNITY_NACL || UNITY_FLASH || UNITY_BLACKBERRY) // Disable under unsupported platforms.