using UnityEngine; #if !(UNITY_DASHBOARD_WIDGET || UNITY_WEBPLAYER || UNITY_WII || UNITY_WIIU || UNITY_NACL || UNITY_FLASH || UNITY_BLACKBERRY) // Disable under unsupported platforms. ////////////////////////////////////////////////////////////////////// // // Copyright (c) 2012 Audiokinetic Inc. / All Rights Reserved // ////////////////////////////////////////////////////////////////////// /// /// This class is responsible for determining the path where sound banks are located. When using custom platforms, this /// class needs to be extended. /// public partial class AkBasePathGetter { /// /// User hook called to retrieve the custom platform name used to determine the base path. Do not modify platformName /// to use default platform names. /// /// The custom platform name. Leave unaffected if the default location is acceptable. public delegate void CustomPlatformNameGetter(ref string platformName); public static CustomPlatformNameGetter GetCustomPlatformName; /// /// Determines the platform name which is also the sub-folder within the base path where sound banks are located for /// this platform. /// /// The platform name. public static string GetPlatformName() { var platformSubDir = string.Empty; GetCustomPlatformName?.Invoke(ref platformSubDir); if (!string.IsNullOrEmpty(platformSubDir)) return platformSubDir; return DefaultPlatformName; } } public partial class AkBasePathGetter { public static readonly string DefaultBasePath = System.IO.Path.Combine("Audio", "GeneratedSoundBanks"); private const string DecodedBankFolder = "DecodedBanks"; private static bool LogWarnings_Internal = true; public static bool LogWarnings { get { return LogWarnings_Internal; } set { LogWarnings_Internal = value; } } /// /// Returns the absolute path to the platform specific sound banks. /// /// The absolute path to the platform specific sound banks. public static string GetPlatformBasePath() { var platformName = GetPlatformName(); #if UNITY_EDITOR var platformBasePathEditor = GetPlatformBasePathEditor(platformName); if (!string.IsNullOrEmpty(platformBasePathEditor)) return platformBasePathEditor; var fullBasePath = AkWwiseEditorSettings.Instance.SoundbankPath; #else var fullBasePath = string.Empty; #endif if (string.IsNullOrEmpty(fullBasePath)) fullBasePath = AkWwiseInitializationSettings.ActivePlatformSettings.SoundbankPath; #if UNITY_EDITOR || !UNITY_ANDROID fullBasePath = System.IO.Path.Combine(UnityEngine.Application.streamingAssetsPath, fullBasePath); #endif #if UNITY_SWITCH if (fullBasePath.StartsWith("/")) fullBasePath = fullBasePath.Substring(1); #endif // Combine base path with platform sub-folder var platformBasePath = System.IO.Path.Combine(fullBasePath, platformName); AkUtilities.FixSlashes(ref platformBasePath); return platformBasePath; } #if UNITY_EDITOR public static bool GetSoundBankPaths(string platformName, out string sourcePlatformBasePath, out string destinationPlatformBasePath) { sourcePlatformBasePath = GetPlatformBasePathEditor(platformName); if (string.IsNullOrEmpty(sourcePlatformBasePath)) { if (LogWarnings) UnityEngine.Debug.LogErrorFormat("WwiseUnity: Could not find source folder for <{0}> platform. Did you remember to generate your banks?", platformName); destinationPlatformBasePath = string.Empty; return false; } destinationPlatformBasePath = System.IO.Path.Combine(GetFullSoundBankPathEditor(), platformName); if (string.IsNullOrEmpty(destinationPlatformBasePath)) { if (LogWarnings) UnityEngine.Debug.LogErrorFormat("WwiseUnity: Could not find destination folder for <{0}> platform", platformName); return false; } return true; } /// /// Returns the absolute path to the folder above the platform specific sound banks sub-folders. /// /// The absolute sound bank base path. public static string GetFullSoundBankPathEditor() { string fullBasePath = System.IO.Path.Combine(UnityEngine.Application.streamingAssetsPath, AkWwiseEditorSettings.Instance.SoundbankPath); AkUtilities.FixSlashes(ref fullBasePath); return fullBasePath; } public static string GetWwiseProjectPath() { var Settings = AkWwiseEditorSettings.Instance; return AkUtilities.GetFullPath(UnityEngine.Application.dataPath, Settings.WwiseProjectPath); } public static string GetWwiseProjectDirectory() { var projectPath= AkUtilities.GetFullPath(UnityEngine.Application.dataPath, AkWwiseEditorSettings.Instance.WwiseProjectPath); return System.IO.Path.GetDirectoryName(projectPath); } public static string GetDefaultGeneratedSoundbanksPath() { return System.IO.Path.Combine(GetWwiseProjectPath(), "GeneratedSoundBanks"); } /// /// Determines the platform base path for use within the Editor. /// /// The platform name. /// The full path to the sound banks for use within the Editor. private static string GetPlatformBasePathEditor(string platformName) { var WwiseProjectFullPath = GetWwiseProjectPath(); //var SoundBankDest = AkUtilities.GetWwiseSoundBankDestinationFolder(platformName); var bankPath = "SocAsset/Assets/Resources/WwiseAudio/GeneratedSoundBanks/Windows"; var SoundBankDest=System.IO.Path.Combine(Application.dataPath.Replace("SocClient/Assets", bankPath)); try { if (System.IO.Path.GetPathRoot(SoundBankDest) == "") { // Path is relative, make it full SoundBankDest = AkUtilities.GetFullPath(System.IO.Path.GetDirectoryName(WwiseProjectFullPath), SoundBankDest); } } catch { SoundBankDest = string.Empty; } if (LogWarnings) { if (string.IsNullOrEmpty(SoundBankDest)) { UnityEngine.Debug.LogWarning("WwiseUnity: The platform SoundBank subfolder within the Wwise project could not be found."); return null; } try { // Verify if there are banks in there var di = new System.IO.DirectoryInfo(SoundBankDest); var foundBanks = di.GetFiles("*.bnk", System.IO.SearchOption.AllDirectories); if (foundBanks.Length == 0) { return null; } if (!SoundBankDest.Contains(platformName)) { if (LogWarnings) UnityEngine.Debug.LogWarning("WwiseUnity: The platform SoundBank subfolder does not match your platform name. You will need to create a custom platform name getter for your game. See section \"Using Wwise Custom Platforms in Unity\" of the Wwise Unity integration documentation for more information"); } return SoundBankDest; } catch { return null; } } else { return SoundBankDest; } } #endif private static AkBasePathGetter Instance; public static AkBasePathGetter Get() { if (Instance == null) { Instance = new AkBasePathGetter(); Instance.EvaluateGamePaths(); } return Instance; } public void EvaluateGamePaths() { #if UNITY_SWITCH && !UNITY_EDITOR // Calling Application.persistentDataPath crashes Switch string tempPersistentDataPath = null; #else string tempPersistentDataPath = UnityEngine.Application.persistentDataPath; #endif PersistentDataPath = tempPersistentDataPath; var persistentDataSubfolder = AkWwiseInitializationSettings.ActivePlatformSettings.SoundBankPersistentDataPath; string tempSoundBankBasePath = null; if (!string.IsNullOrEmpty(tempPersistentDataPath) && !string.IsNullOrEmpty(persistentDataSubfolder)) { tempSoundBankBasePath = System.IO.Path.GetFullPath(System.IO.Path.Combine(tempPersistentDataPath, persistentDataSubfolder)); if (LogWarnings) UnityEngine.Debug.LogFormat("WwiseUnity: Using persistentDataPath. SoundBanks base path set to <{0}>.", tempSoundBankBasePath); } else { tempSoundBankBasePath = GetPlatformBasePath(); #if !AK_WWISE_ADDRESSABLES //Don't log this if we're using addressables #if !UNITY_EDITOR && UNITY_ANDROID // Can't use File.Exists on Android, assume banks are there var InitBnkFound = true; #else var InitBnkFound = System.IO.File.Exists(System.IO.Path.Combine(tempSoundBankBasePath, "Init.bnk")); #endif if (string.IsNullOrEmpty(tempSoundBankBasePath) || !InitBnkFound) { if (LogWarnings) { #if UNITY_EDITOR var format = "WwiseUnity: Could not locate the SoundBanks in {0}. Did you make sure to generate them?"; #else var format = "WwiseUnity: Could not locate the SoundBanks in {0}. Did you make sure to copy them to the StreamingAssets folder?"; #endif UnityEngine.Debug.LogErrorFormat(format, tempSoundBankBasePath); } } #endif } SoundBankBasePath = tempSoundBankBasePath; string tempDecodedBankFullPath = null; #if !UNITY_SWITCH || UNITY_EDITOR #if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR // This is for platforms that only have a specific file location for persistent data. tempDecodedBankFullPath = System.IO.Path.Combine(tempPersistentDataPath, DecodedBankFolder); #else tempDecodedBankFullPath = System.IO.Path.Combine(tempSoundBankBasePath, DecodedBankFolder); #endif #endif DecodedBankFullPath = tempDecodedBankFullPath; } public string SoundBankBasePath { get; private set; } public string PersistentDataPath { get; private set; } public string DecodedBankFullPath { get; private set; } } #endif // #if ! (UNITY_DASHBOARD_WIDGET || UNITY_WEBPLAYER || UNITY_WII || UNITY_WIIU || UNITY_NACL || UNITY_FLASH || UNITY_BLACKBERRY) // Disable under unsupported platforms.