string PlatformLabel(FMODPlatform platform) { switch(platform) { case FMODPlatform.Linux: return "Linux"; case FMODPlatform.Desktop: return "Desktop"; case FMODPlatform.Console: return "Console"; case FMODPlatform.iOS: return "iOS"; case FMODPlatform.Mac: return "OSX"; case FMODPlatform.Mobile: return "Mobile"; case FMODPlatform.PS4: return "PS4"; case FMODPlatform.Windows: return "Windows"; case FMODPlatform.WindowsPhone: return "Windows Phone 8.1"; case FMODPlatform.UWP: return "UWP"; case FMODPlatform.XboxOne: return "XBox One"; case FMODPlatform.WiiU: return "Wii U"; case FMODPlatform.PSVita: return "PS Vita"; case FMODPlatform.Android: return "Android"; case FMODPlatform.AppleTV: return "Apple TV"; case FMODPlatform.MobileHigh: return "High-End Mobile"; case FMODPlatform.MobileLow: return "Low-End Mobile"; } return "Unknown"; }
void DisplayChildBool(string label, List<PlatformBoolSetting> settings, FMODPlatform platform) { bool overriden = Settings.HasSetting(settings, platform); bool current = Settings.GetSetting(settings, platform, false); string[] toggleChild = new string[ToggleParent.Length + 1]; Array.Copy(ToggleParent, 0, toggleChild, 1, ToggleParent.Length); toggleChild[0] = String.Format("Inherit ({0})", ToggleParent[current ? 1 : 0]); int next = EditorGUILayout.Popup(label, overriden ? (current ? 2 : 1) : 0, toggleChild); if (next == 0) { if (overriden) { Settings.RemoveSetting(settings, platform); } } else { Settings.SetSetting(settings, platform, next == 2); } }
void DisplayParentBool(string label, List<PlatformBoolSetting> settings, FMODPlatform platform) { TriStateBool current = Settings.GetSetting(settings, platform, TriStateBool.Disabled); int next = EditorGUILayout.Popup(label, (int)current, ToggleParent); Settings.SetSetting(settings, platform, (TriStateBool)next); }
// -------- Virtual channels ---------------------- public int GetVirtualChannels(FMODPlatform platform) { return(GetSetting(VirtualChannelSettings, platform, 128)); }
void DisplayChildFreq(string label, List<PlatformIntSetting> settings, FMODPlatform platform) { bool overriden = Settings.HasSetting(settings, platform); int current = Settings.GetSetting(settings, platform, 0); int inherit = Settings.GetSetting(settings, Settings.GetParent(platform), 0); int currentIndex = Array.IndexOf(FrequencyValues, current); int inheritIndex = Array.IndexOf(FrequencyValues, inherit); string[] valuesChild = new string[FrequencyDisplay.Length + 1]; Array.Copy(FrequencyDisplay, 0, valuesChild, 1, FrequencyDisplay.Length); valuesChild[0] = String.Format("Inherit ({0})", FrequencyDisplay[inheritIndex]); int next = EditorGUILayout.Popup(label, overriden ? currentIndex + 1 : 0, valuesChild); if (next == 0) { Settings.RemoveSetting(settings, platform); } else { Settings.SetSetting(settings, platform, FrequencyValues[next-1]); } }
// -------- Live Update ---------------------- public bool IsLiveUpdateEnabled(FMODPlatform platform) { return(GetSetting(LiveUpdateSettings, platform, false)); }
public static void RemoveSetting <T>(List <T> list, FMODPlatform platform) where T : PlatformSettingBase { list.RemoveAll((x) => x.Platform == platform); }
void DisplayParentFreq(string label, List<PlatformIntSetting> settings, FMODPlatform platform) { int current = Settings.GetSetting(settings, platform, 0); int index = Array.IndexOf(FrequencyValues, current); int next = EditorGUILayout.Popup(label, index, FrequencyDisplay); Settings.SetSetting(settings, platform, FrequencyValues[next]); }
void DisplayChildBuildDirectories(string label, List<PlatformStringSetting> settings, FMODPlatform platform) { string[] buildDirectories = EditorUtils.GetBankPlatforms(); bool overriden = Settings.HasSetting(settings, platform); string current = Settings.GetSetting(settings, platform, "Desktop"); int index = Array.IndexOf(buildDirectories, current); if (index < 0) index = 0; string[] valuesChild = new string[buildDirectories.Length + 1]; Array.Copy(buildDirectories, 0, valuesChild, 1, buildDirectories.Length); valuesChild[0] = String.Format("Inherit ({0})", buildDirectories[index]); int next = EditorGUILayout.Popup(label, overriden ? index + 1 : 0, valuesChild); if (next == 0) { Settings.RemoveSetting(settings, platform); Settings.RemoveSetting(((Settings)target).SpeakerModeSettings, platform); } else { Settings.SetSetting(settings, platform, buildDirectories[next - 1]); } }
public static void CopyToStreamingAssets() { if (string.IsNullOrEmpty(Settings.Instance.SourceBankPath)) { return; } FMODPlatform platform = RuntimeUtils.GetEditorFMODPlatform(); if (platform == FMODPlatform.None) { UnityEngine.Debug.LogWarning(string.Format("FMOD Studio: copy banks for platform {0} : Unsupported platform", EditorUserBuildSettings.activeBuildTarget.ToString())); return; } string bankTargetFolder = Settings.Instance.ImportType == ImportType.StreamingAssets ? Application.dataPath + "/StreamingAssets" : Application.dataPath + (string.IsNullOrEmpty(Settings.Instance.TargetAssetPath) ? "" : '/' + Settings.Instance.TargetAssetPath); bankTargetFolder = RuntimeUtils.GetCommonPlatformPath(bankTargetFolder); Directory.CreateDirectory(bankTargetFolder); string bankTargetExension = Settings.Instance.ImportType == ImportType.StreamingAssets ? "bank" : "bytes"; string bankSourceFolder = Settings.Instance.HasPlatforms ? Settings.Instance.SourceBankPath + '/' + Settings.Instance.GetBankPlatform(platform) : Settings.Instance.SourceBankPath; bankSourceFolder = RuntimeUtils.GetCommonPlatformPath(bankSourceFolder); if (Path.GetFullPath(bankTargetFolder).TrimEnd('/').ToUpperInvariant() == Path.GetFullPath(bankSourceFolder).TrimEnd('/').ToUpperInvariant()) { return; } bool madeChanges = false; try { // Clean out any stale .bank files string[] currentBankFiles = Directory.GetFiles(bankTargetFolder, "*." + bankTargetExension, SearchOption.AllDirectories); List <string> directories = new List <string>(); foreach (var bankFileName in currentBankFiles) { var targetShortName = RuntimeUtils.GetCommonPlatformPath(bankFileName).Replace(bankTargetFolder + '/', ""); if (!eventCache.EditorBanks.Exists((x) => targetShortName == x.Name + "." + bankTargetExension)) { File.Delete(bankFileName); madeChanges = true; } directories.Add(RuntimeUtils.GetCommonPlatformPath(Path.GetDirectoryName(bankFileName))); } if (madeChanges) { AssetDatabase.Refresh(); foreach (var dir in directories) { if (Directory.Exists(dir) && Directory.GetFiles(dir).Length <= 0) { Directory.Delete(dir); } } } // Copy over any files that don't match timestamp or size or don't exist foreach (var bankRef in eventCache.EditorBanks) { var dirName = RuntimeUtils.GetCommonPlatformPath(Path.GetDirectoryName(bankRef.Path)); string subDir = dirName.Replace(bankSourceFolder, ""); bankRef.SubDir = subDir.TrimStart('/'); string sourcePath = bankSourceFolder + '/' + bankRef.Name + ".bank"; string targetPath = bankTargetFolder + '/' + bankRef.Name + "." + bankTargetExension; FileInfo sourceInfo = new FileInfo(sourcePath); FileInfo targetInfo = new FileInfo(targetPath); if (!targetInfo.Exists || sourceInfo.Length != targetInfo.Length || sourceInfo.LastWriteTime != targetInfo.LastWriteTime) { if (!targetInfo.Directory.Exists) { targetInfo.Directory.Create(); } else if (targetInfo.Exists) { targetInfo.IsReadOnly = false; } File.Copy(sourcePath, targetPath, true); targetInfo = new FileInfo(targetPath); targetInfo.IsReadOnly = false; targetInfo.LastWriteTime = sourceInfo.LastWriteTime; madeChanges = true; } } } catch (Exception exception) { UnityEngine.Debug.LogError(string.Format("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2}", platform.ToString(), bankSourceFolder, bankTargetFolder)); UnityEngine.Debug.LogException(exception); return; } if (madeChanges) { AssetDatabase.Refresh(); UnityEngine.Debug.Log(string.Format("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2} succeeded", platform.ToString(), bankSourceFolder, bankTargetFolder)); } }
public static void CopyToStreamingAssets() { if (string.IsNullOrEmpty(Settings.Instance.SourceBankPath)) { return; } FMODPlatform platform = RuntimeUtils.GetEditorFMODPlatform(); if (platform == FMODPlatform.None) { UnityEngine.Debug.LogWarning(string.Format("FMOD Studio: copy banks for platform {0} : Unsupported platform", EditorUserBuildSettings.activeBuildTarget.ToString())); return; } string bankTargetFolder = Settings.Instance.ImportType == ImportType.StreamingAssets ? Application.dataPath + "/StreamingAssets" : Application.dataPath + (string.IsNullOrEmpty(Settings.Instance.TargetAssetPath) ? "" : '/' + Settings.Instance.TargetAssetPath); bankTargetFolder = RuntimeUtils.GetCommonPlatformPath(bankTargetFolder); Directory.CreateDirectory(bankTargetFolder); string bankTargetExension = Settings.Instance.ImportType == ImportType.StreamingAssets ? "bank" : "bytes"; string bankSourceFolder = Settings.Instance.HasPlatforms ? Settings.Instance.SourceBankPath + '/' + Settings.Instance.GetBankPlatform(platform) : Settings.Instance.SourceBankPath; bankSourceFolder = RuntimeUtils.GetCommonPlatformPath(bankSourceFolder); if (Path.GetFullPath(bankTargetFolder).TrimEnd('/').ToUpperInvariant() == Path.GetFullPath(bankSourceFolder).TrimEnd('/').ToUpperInvariant()) { return; } bool madeChanges = false; if (removeBanks) { string oldBankTargetFolder = Settings.Instance.ImportType == ImportType.AssetBundle ? Application.dataPath + "/StreamingAssets" : Application.dataPath + "/" + Settings.Instance.TargetAssetPath; RemoveBanks(oldBankTargetFolder); madeChanges = true; } try { // Clean out any stale .bank files string[] currentBankFiles = Directory.GetFiles(bankTargetFolder, "*." + bankTargetExension); foreach (var bankFileName in currentBankFiles) { string bankName = Path.GetFileNameWithoutExtension(bankFileName); if (!eventCache.EditorBanks.Exists((x) => bankName == x.Name)) { string assetString = bankFileName.Replace(Application.dataPath, "Assets"); AssetDatabase.ImportAsset(assetString); UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(assetString); string[] labels = AssetDatabase.GetLabels(obj); bool containsLabel = false; foreach (string label in labels) { if (label.Equals("FMOD")) { containsLabel = true; break; } } if (containsLabel) { File.Delete(bankFileName); madeChanges = true; } } } // Copy over any files that don't match timestamp or size or don't exist foreach (var bankRef in eventCache.EditorBanks) { string sourcePath = bankSourceFolder + "/" + bankRef.Name + ".bank"; string targetPath = bankTargetFolder + "/" + bankRef.Name + "." + bankTargetExension; FileInfo sourceInfo = new FileInfo(sourcePath); FileInfo targetInfo = new FileInfo(targetPath); if (!targetInfo.Exists || sourceInfo.Length != targetInfo.Length || sourceInfo.LastWriteTime != targetInfo.LastWriteTime) { if (targetInfo.Exists) { targetInfo.IsReadOnly = false; } File.Copy(sourcePath, targetPath, true); targetInfo = new FileInfo(targetPath); targetInfo.IsReadOnly = false; targetInfo.LastWriteTime = sourceInfo.LastWriteTime; madeChanges = true; string assetString = targetPath.Replace(Application.dataPath, "Assets"); AssetDatabase.ImportAsset(assetString); UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(assetString); AssetDatabase.SetLabels(obj, new string[] { "FMOD" }); } } } catch (Exception exception) { UnityEngine.Debug.LogError(string.Format("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2}", platform.ToString(), bankSourceFolder, bankTargetFolder)); UnityEngine.Debug.LogException(exception); return; } if (madeChanges) { AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); UnityEngine.Debug.Log(string.Format("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2} succeeded", platform.ToString(), bankSourceFolder, bankTargetFolder)); } }
public override void OnInspectorGUI() { Settings settings = target as Settings; DrawLinks(); EditorGUI.BeginChangeCheck(); hasBankSourceChanged = false; bool hasBankTargetChanged = false; GUIStyle style = new GUIStyle(GUI.skin.label); style.richText = true; GUI.skin.FindStyle("HelpBox").richText = true; SourceType sourceType = settings.HasSourceProject ? SourceType.Project : (settings.HasPlatforms ? SourceType.Multi : SourceType.Single); EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginVertical(); sourceType = GUILayout.Toggle(sourceType == SourceType.Project, "Project", "Button") ? 0 : sourceType; sourceType = GUILayout.Toggle(sourceType == SourceType.Single, "Single Platform Build", "Button") ? SourceType.Single : sourceType; sourceType = GUILayout.Toggle(sourceType == SourceType.Multi, "Multiple Platform Build", "Button") ? SourceType.Multi : sourceType; EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(); EditorGUILayout.HelpBox( "<size=11>Select the way you wish to connect Unity to the FMOD Studio content:\n" + "<b>• Project</b>\t\tIf you have the complete FMOD Studio project avaliable\n" + "<b>• Single Platform</b>\tIf you have only the contents of the <i>Build</i> folder for a single platform\n" + "<b>• Multiple Platforms</b>\tIf you have only the contents of the <i>Build</i> folder for multiple platforms, each platform in it's own sub directory\n" + "</size>" , MessageType.Info, true); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); if (sourceType == SourceType.Project) { EditorGUILayout.BeginHorizontal(); string oldPath = settings.SourceProjectPath; EditorGUILayout.PrefixLabel("Studio Project Path", GUI.skin.textField, style); EditorGUI.BeginChangeCheck(); string newPath = EditorGUILayout.TextField(GUIContent.none, settings.SourceProjectPath); if (EditorGUI.EndChangeCheck()) { if (newPath.EndsWith(".fspro")) { settings.SourceProjectPath = newPath; } } if (GUILayout.Button("Browse", GUILayout.ExpandWidth(false))) { GUI.FocusControl(null); string path = EditorUtility.OpenFilePanel("Locate Studio Project", oldPath, "fspro"); if (!string.IsNullOrEmpty(path)) { settings.SourceProjectPath = MakePathRelative(path); Repaint(); } } EditorGUILayout.EndHorizontal(); // Cache in settings for runtime access in play-in-editor mode string bankPath = EditorUtils.GetBankDirectory(); settings.SourceBankPath = bankPath; settings.HasPlatforms = true; settings.HasSourceProject = true; // First time project path is set or changes, copy to streaming assets if (settings.SourceProjectPath != oldPath) { hasBankSourceChanged = true; } } else if (sourceType == SourceType.Single || sourceType == SourceType.Multi) { EditorGUILayout.BeginHorizontal(); string oldPath = settings.SourceBankPath; EditorGUILayout.PrefixLabel("Build Path", GUI.skin.textField, style); EditorGUI.BeginChangeCheck(); string tempPath = EditorGUILayout.TextField(GUIContent.none, settings.SourceBankPath); if (EditorGUI.EndChangeCheck()) { settings.SourceBankPath = tempPath; } if (GUILayout.Button("Browse", GUILayout.ExpandWidth(false))) { GUI.FocusControl(null); string newPath = EditorUtility.OpenFolderPanel("Locate Build Folder", oldPath, null); if (!string.IsNullOrEmpty(newPath)) { settings.SourceBankPath = MakePathRelative(newPath); Repaint(); } } EditorGUILayout.EndHorizontal(); settings.HasPlatforms = (sourceType == SourceType.Multi); settings.HasSourceProject = false; // First time project path is set or changes, copy to streaming assets if (settings.SourceBankPath != oldPath) { hasBankSourceChanged = true; } } bool validBanks; string failReason; EditorUtils.ValidateSource(out validBanks, out failReason); if (!validBanks) { failReason += "\n\nFor detailed setup instructions, please see the getting started guide linked above."; EditorGUILayout.HelpBox(failReason, MessageType.Error, true); if (EditorGUI.EndChangeCheck()) { EditorUtility.SetDirty(settings); } return; } if (!RuntimeUtils.VerifyPlatformLibsExist()) { string errMsg = "Unable to find the FMOD '" + RuntimeUtils.GetEditorFMODPlatform() + "' libs. See console for details."; EditorGUILayout.HelpBox(errMsg, MessageType.Error, true); if (EditorGUI.EndChangeCheck()) { EditorUtility.SetDirty(settings); } return; } ImportType importType = (ImportType)EditorGUILayout.EnumPopup("Import Type", settings.ImportType); if (importType != settings.ImportType) { hasBankTargetChanged = true; settings.ImportType = importType; bool deleteBanks = EditorUtility.DisplayDialog( "FMOD Bank Import Type Changed", "Do you want to delete the " + (importType == ImportType.AssetBundle ? "StreamingAssets" : "AssetBundle") + " banks in " + (importType == ImportType.AssetBundle ? Application.streamingAssetsPath : Application.dataPath + '/' + settings.TargetAssetPath) , "Yes", "No"); if (deleteBanks) { // Delete the old banks EventManager.removeBanks = true; EventManager.RefreshBanks(); } } // ----- Text Assets ------------- if (settings.ImportType == ImportType.AssetBundle) { GUI.SetNextControlName("targetAssetPath"); targetAssetPath = EditorGUILayout.TextField("FMOD Asset Folder", string.IsNullOrEmpty(targetAssetPath) ? settings.TargetAssetPath : targetAssetPath); if (GUI.GetNameOfFocusedControl() == "targetAssetPath") { focused = true; if (Event.current.isKey) { switch (Event.current.keyCode) { case KeyCode.Return: case KeyCode.KeypadEnter: if (settings.TargetAssetPath != targetAssetPath) { EventManager.RemoveBanks(Application.dataPath + '/' + settings.TargetAssetPath); settings.TargetAssetPath = targetAssetPath; hasBankTargetChanged = true; } break; } } } else if (focused) { if (settings.TargetAssetPath != targetAssetPath) { EventManager.RemoveBanks(Application.dataPath + '/' + settings.TargetAssetPath); settings.TargetAssetPath = targetAssetPath; hasBankTargetChanged = true; } } } // ----- Logging ----------------- EditorGUILayout.Separator(); EditorGUILayout.LabelField("<b>Logging</b>", style); EditorGUI.indentLevel++; settings.LoggingLevel = (FMOD.DEBUG_FLAGS)EditorGUILayout.EnumPopup("Logging Level", settings.LoggingLevel); EditorGUI.indentLevel--; // ----- Loading ----------------- EditorGUI.BeginDisabledGroup(settings.ImportType == ImportType.AssetBundle); EditorGUILayout.Separator(); EditorGUILayout.LabelField("<b>Initialization</b>", style); EditorGUI.indentLevel++; settings.EnableMemoryTracking = EditorGUILayout.Toggle("Enable Memory Tracking", settings.EnableMemoryTracking); settings.BankLoadType = (BankLoadType)EditorGUILayout.EnumPopup("Load Banks", settings.BankLoadType); switch (settings.BankLoadType) { case BankLoadType.All: break; case BankLoadType.Specified: settings.AutomaticEventLoading = false; Texture upArrowTexture = EditorGUIUtility.Load("FMOD/ArrowUp.png") as Texture; Texture downArrowTexture = EditorGUIUtility.Load("FMOD/ArrowDown.png") as Texture; bankFoldOutState = EditorGUILayout.Foldout(bankFoldOutState, "Specified Banks", true); if (bankFoldOutState) { for (int i = 0; i < settings.BanksToLoad.Count; i++) { EditorGUILayout.BeginHorizontal(); EditorGUI.indentLevel++; var bankName = settings.BanksToLoad[i]; EditorGUILayout.TextField(bankName.Replace(".bank", "")); if (GUILayout.Button(upArrowTexture, GUILayout.ExpandWidth(false))) { if (i > 0) { var temp = settings.BanksToLoad[i]; settings.BanksToLoad[i] = settings.BanksToLoad[i - 1]; settings.BanksToLoad[i - 1] = temp; } continue; } if (GUILayout.Button(downArrowTexture, GUILayout.ExpandWidth(false))) { if (i < settings.BanksToLoad.Count - 1) { var temp = settings.BanksToLoad[i]; settings.BanksToLoad[i] = settings.BanksToLoad[i + 1]; settings.BanksToLoad[i + 1] = temp; } continue; } if (GUILayout.Button("Browse", GUILayout.ExpandWidth(false))) { GUI.FocusControl(null); string path = EditorUtility.OpenFilePanel("Locate Bank", Application.streamingAssetsPath, "bank"); if (!string.IsNullOrEmpty(path)) { settings.BanksToLoad[i] = path.Replace(Application.streamingAssetsPath + Path.AltDirectorySeparatorChar, ""); Repaint(); } } if (GUILayout.Button("Remove", GUILayout.ExpandWidth(false))) { Settings.Instance.BanksToLoad.RemoveAt(i); continue; } EditorGUILayout.EndHorizontal(); EditorGUI.indentLevel--; } GUILayout.BeginHorizontal(); GUILayout.Space(30); if (GUILayout.Button("Add Bank", GUILayout.ExpandWidth(false))) { settings.BanksToLoad.Add(""); } if (GUILayout.Button("Add All Banks", GUILayout.ExpandWidth(false))) { FMODPlatform platform = RuntimeUtils.GetEditorFMODPlatform(); if (platform == FMODPlatform.None) { platform = FMODPlatform.PlayInEditor; } string sourceDir = RuntimeUtils.GetCommonPlatformPath(settings.SourceBankPath + '/' + (settings.HasSourceProject ? settings.GetBankPlatform(platform) + '/' : "")); var banksFound = new List <string>(Directory.GetFiles(sourceDir, "*.bank", SearchOption.AllDirectories)); for (int i = 0; i < banksFound.Count; i++) { string bankShortName = RuntimeUtils.GetCommonPlatformPath(Path.GetFullPath(banksFound[i])).Replace(sourceDir, ""); if (!settings.BanksToLoad.Contains(bankShortName)) { settings.BanksToLoad.Add(bankShortName); } } Repaint(); } if (GUILayout.Button("Clear", GUILayout.ExpandWidth(false))) { settings.BanksToLoad.Clear(); } GUILayout.EndHorizontal(); } break; case BankLoadType.None: settings.AutomaticEventLoading = false; break; default: break; } EditorGUI.BeginDisabledGroup(settings.BankLoadType == BankLoadType.None); settings.AutomaticSampleLoading = EditorGUILayout.Toggle("Load Bank Sample Data", settings.AutomaticSampleLoading); EditorGUI.EndDisabledGroup(); settings.EncryptionKey = EditorGUILayout.TextField("Bank Encryption Key", settings.EncryptionKey); EditorGUI.indentLevel--; EditorGUI.EndDisabledGroup(); // ----- PIE ---------------------------------------------- EditorGUILayout.Separator(); EditorGUILayout.LabelField("<b>Play In Editor Settings</b>", style); EditorGUI.indentLevel++; DisplayEditorBool("Live Update", settings.LiveUpdateSettings, FMODPlatform.PlayInEditor); if (settings.IsLiveUpdateEnabled(FMODPlatform.PlayInEditor)) { EditorGUILayout.BeginHorizontal(); settings.LiveUpdatePort = ushort.Parse(EditorGUILayout.TextField("Live Update Port:", settings.LiveUpdatePort.ToString())); if (GUILayout.Button("Reset", GUILayout.ExpandWidth(false))) { settings.LiveUpdatePort = 9264; } EditorGUILayout.EndHorizontal(); } DisplayEditorBool("Debug Overlay", settings.OverlaySettings, FMODPlatform.PlayInEditor); DisplayChildFreq("Sample Rate", settings.SampleRateSettings, FMODPlatform.PlayInEditor); if (settings.HasPlatforms) { DisplayPIEBuildDirectory("Bank Platform", settings.BankDirectorySettings, FMODPlatform.PlayInEditor); } DisplayPIESpeakerMode("Speaker Mode", settings.SpeakerModeSettings, FMODPlatform.PlayInEditor); if (settings.HasPlatforms) { EditorGUILayout.HelpBox(string.Format("Match the speaker mode to the setting of the platform <b>{0}</b> inside FMOD Studio", settings.GetBankPlatform(FMODPlatform.PlayInEditor)), MessageType.Info, false); } else { EditorGUILayout.HelpBox("Match the speaker mode to the setting inside FMOD Studio", MessageType.Info, false); } EditorGUI.indentLevel--; // ----- Default ---------------------------------------------- EditorGUILayout.Separator(); EditorGUILayout.LabelField("<b>Default Settings</b>", style); EditorGUI.indentLevel++; DisplayParentBool("Live Update", settings.LiveUpdateSettings, FMODPlatform.Default); if (settings.IsLiveUpdateEnabled(FMODPlatform.Default)) { EditorGUILayout.BeginHorizontal(); settings.LiveUpdatePort = ushort.Parse(EditorGUILayout.TextField("Live Update Port:", settings.LiveUpdatePort.ToString())); if (GUILayout.Button("Reset", GUILayout.ExpandWidth(false))) { settings.LiveUpdatePort = 9264; } EditorGUILayout.EndHorizontal(); } DisplayParentBool("Debug Overlay", settings.OverlaySettings, FMODPlatform.Default); DisplayParentFreq("Sample Rate", settings.SampleRateSettings, FMODPlatform.Default); if (settings.HasPlatforms) { bool prevChanged = GUI.changed; DisplayParentBuildDirectory("Bank Platform", settings.BankDirectorySettings, FMODPlatform.Default); hasBankSourceChanged |= !prevChanged && GUI.changed; } DisplayParentSpeakerMode("Speaker Mode", settings.SpeakerModeSettings, FMODPlatform.Default); if (settings.HasPlatforms) { EditorGUILayout.HelpBox(string.Format("Match the speaker mode to the setting of the platform <b>{0}</b> inside FMOD Studio", settings.GetBankPlatform(FMODPlatform.Default)), MessageType.Info, false); } else { EditorGUILayout.HelpBox("Match the speaker mode to the setting inside FMOD Studio", MessageType.Info, false); } DisplayParentInt("Virtual Channel Count", settings.VirtualChannelSettings, FMODPlatform.Default, 1, 2048); DisplayParentInt("Real Channel Count", settings.RealChannelSettings, FMODPlatform.Default, 1, 256); EditorGUI.indentLevel--; // ----- Plugins ---------------------------------------------- EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("<b>Plugins</b>", GUI.skin.button, style); if (GUILayout.Button("Add Plugin", GUILayout.ExpandWidth(false))) { settings.Plugins.Add(""); } EditorGUILayout.EndHorizontal(); EditorGUI.indentLevel++; for (int count = 0; count < settings.Plugins.Count; count++) { EditorGUILayout.BeginHorizontal(); settings.Plugins[count] = EditorGUILayout.TextField("Plugin " + (count + 1).ToString() + ":", settings.Plugins[count]); if (GUILayout.Button("Delete Plugin", GUILayout.ExpandWidth(false))) { settings.Plugins.RemoveAt(count); } EditorGUILayout.EndHorizontal(); } EditorGUI.indentLevel--; // ----- Windows ---------------------------------------------- DisplayPlatform(FMODPlatform.Desktop, null); DisplayPlatform(FMODPlatform.Mobile, new FMODPlatform[] { FMODPlatform.MobileHigh, FMODPlatform.MobileLow, FMODPlatform.AppleTV }); DisplayPlatform(FMODPlatform.Console, new FMODPlatform[] { FMODPlatform.XboxOne, FMODPlatform.PS4, FMODPlatform.Switch, FMODPlatform.Stadia }); if (EditorGUI.EndChangeCheck()) { EditorUtility.SetDirty(settings); } if (hasBankSourceChanged) { EventManager.RefreshBanks(); } if (hasBankTargetChanged) { EventManager.RefreshBanks(); } }
FMOD.RESULT Initialize() { #if UNITY_EDITOR AssemblyReloadEvents.beforeAssemblyReload += HandleBeforeAssemblyReload; EditorApplication.playModeStateChanged += HandlePlayModeStateChange; #endif // UNITY_EDITOR FMOD.RESULT result = FMOD.RESULT.OK; FMOD.RESULT initResult = FMOD.RESULT.OK; Settings fmodSettings = Settings.Instance; fmodPlatform = RuntimeUtils.GetCurrentPlatform(); int sampleRate = fmodSettings.GetSampleRate(fmodPlatform); int realChannels = Math.Min(fmodSettings.GetRealChannels(fmodPlatform), 256); int virtualChannels = fmodSettings.GetVirtualChannels(fmodPlatform); FMOD.SPEAKERMODE speakerMode = (FMOD.SPEAKERMODE)fmodSettings.GetSpeakerMode(fmodPlatform); FMOD.OUTPUTTYPE outputType = FMOD.OUTPUTTYPE.AUTODETECT; FMOD.ADVANCEDSETTINGS advancedSettings = new FMOD.ADVANCEDSETTINGS(); advancedSettings.randomSeed = (uint)DateTime.Now.Ticks; #if UNITY_EDITOR || UNITY_STANDALONE advancedSettings.maxVorbisCodecs = realChannels; #elif UNITY_XBOXONE advancedSettings.maxXMACodecs = realChannels; #elif UNITY_PS4 advancedSettings.maxAT9Codecs = realChannels; #else advancedSettings.maxFADPCMCodecs = realChannels; #endif SetThreadAffinity(); #if UNITY_EDITOR || DEVELOPMENT_BUILD result = FMOD.Debug.Initialize(fmodSettings.LoggingLevel, FMOD.DEBUG_MODE.CALLBACK, DEBUG_CALLBACK, null); CheckInitResult(result, "FMOD.Debug.Initialize"); #endif FMOD.Studio.INITFLAGS studioInitFlags = FMOD.Studio.INITFLAGS.NORMAL | FMOD.Studio.INITFLAGS.DEFERRED_CALLBACKS; if (fmodSettings.IsLiveUpdateEnabled(fmodPlatform)) { studioInitFlags |= FMOD.Studio.INITFLAGS.LIVEUPDATE; advancedSettings.profilePort = fmodSettings.LiveUpdatePort; } retry: result = FMOD.Studio.System.create(out studioSystem); CheckInitResult(result, "FMOD.Studio.System.create"); result = studioSystem.getCoreSystem(out coreSystem); CheckInitResult(result, "FMOD.Studio.System.getCoreSystem"); result = coreSystem.setOutput(outputType); CheckInitResult(result, "FMOD.System.setOutput"); result = coreSystem.setSoftwareChannels(realChannels); CheckInitResult(result, "FMOD.System.setSoftwareChannels"); result = coreSystem.setSoftwareFormat(sampleRate, speakerMode, 0); CheckInitResult(result, "FMOD.System.setSoftwareFormat"); result = coreSystem.setAdvancedSettings(ref advancedSettings); CheckInitResult(result, "FMOD.System.setAdvancedSettings"); if (!string.IsNullOrEmpty(Settings.Instance.EncryptionKey)) { FMOD.Studio.ADVANCEDSETTINGS studioAdvancedSettings = new FMOD.Studio.ADVANCEDSETTINGS(); result = studioSystem.setAdvancedSettings(studioAdvancedSettings, Settings.Instance.EncryptionKey); CheckInitResult(result, "FMOD.Studio.System.setAdvancedSettings"); } result = studioSystem.initialize(virtualChannels, studioInitFlags, FMOD.INITFLAGS.NORMAL, IntPtr.Zero); if (result != FMOD.RESULT.OK && initResult == FMOD.RESULT.OK) { initResult = result; // Save this to throw at the end (we'll attempt NO SOUND to shield ourselves from unexpected device failures) outputType = FMOD.OUTPUTTYPE.NOSOUND; UnityEngine.Debug.LogErrorFormat("[FMOD] Studio::System::initialize returned {0}, defaulting to no-sound mode.", result.ToString()); goto retry; } CheckInitResult(result, "Studio::System::initialize"); // Test network functionality triggered during System::update if ((studioInitFlags & FMOD.Studio.INITFLAGS.LIVEUPDATE) != 0) { studioSystem.flushCommands(); // Any error will be returned through Studio.System.update result = studioSystem.update(); if (result == FMOD.RESULT.ERR_NET_SOCKET_ERROR) { studioInitFlags &= ~FMOD.Studio.INITFLAGS.LIVEUPDATE; UnityEngine.Debug.LogWarning("[FMOD] Cannot open network port for Live Update (in-use), restarting with Live Update disabled."); result = studioSystem.release(); CheckInitResult(result, "FMOD.Studio.System.Release"); goto retry; } } LoadPlugins(fmodSettings); LoadBanks(fmodSettings); #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR RegisterSuspendCallback(HandleInterrupt); #endif return(initResult); }
// -------- Bank Platform ---------------------- public string GetBankPlatform(FMODPlatform platform) { return(HasPlatforms ? GetSetting(BankDirectorySettings, platform, "Desktop") : ""); }
// -------- Speaker Mode ---------------------- public int GetSpeakerMode(FMODPlatform platform) { return(GetSetting(SpeakerModeSettings, platform, 0)); }
// -------- Logging ---------------------- public bool IsLoggingEnabled(FMODPlatform platform) { return(GetSetting(LoggingSettings, platform, false)); }
void DisplayPIESpeakerMode(string label, List<PlatformIntSetting> settings, FMODPlatform platform) { int buildTargetSetting = Settings.GetSetting(settings, RuntimeUtils.GetEditorFMODPlatform(), (int)FMOD.SPEAKERMODE.STEREO); int buildTargetIndex = Array.IndexOf(SpeakerModeValues, buildTargetSetting); string[] speakerModes = new string[SpeakerModeDisplay.Length + 1]; Array.Copy(SpeakerModeDisplay, 0, speakerModes, 1, SpeakerModeDisplay.Length); speakerModes[0] = String.Format("Current Unity Platform ({0})", SpeakerModeDisplay[buildTargetIndex]); bool useCurrentUnity = !Settings.HasSetting(settings, platform); int current = Settings.GetSetting(settings, platform, (int)FMOD.SPEAKERMODE.STEREO); int index = Array.IndexOf(SpeakerModeValues, current) + 1; if (useCurrentUnity || index < 0) index = 0; int next = EditorGUILayout.Popup(label, index, speakerModes); if (next != 0) { Settings.SetSetting(settings, platform, SpeakerModeValues[next - 1]); } else { Settings.RemoveSetting(settings, platform); } }
static public void UpdateCache() { // Deserialize the cache from the unity resources if (eventCache == null) { eventCache = AssetDatabase.LoadAssetAtPath(CacheAssetFullName, typeof(EventCache)) as EventCache; if (eventCache == null || eventCache.cacheVersion != EventCache.CurrentCacheVersion) { UnityEngine.Debug.Log("FMOD Studio: Cannot find serialized event cache or cache in old format, creating new instance"); eventCache = ScriptableObject.CreateInstance <EventCache>(); eventCache.cacheVersion = EventCache.CurrentCacheVersion; Directory.CreateDirectory(Path.GetDirectoryName(CacheAssetFullName)); AssetDatabase.CreateAsset(eventCache, CacheAssetFullName); } } var settings = Settings.Instance; if (string.IsNullOrEmpty(settings.SourceBankPath)) { ClearCache(); return; } string defaultBankFolder = null; if (!Settings.Instance.HasPlatforms) { defaultBankFolder = settings.SourceBankPath; } else { FMODPlatform platform = RuntimeUtils.GetEditorFMODPlatform(); if (platform == FMODPlatform.None) { platform = FMODPlatform.PlayInEditor; } defaultBankFolder = RuntimeUtils.GetCommonPlatformPath(Path.Combine(settings.SourceBankPath, Settings.Instance.GetBankPlatform(platform))); } string[] bankPlatforms = EditorUtils.GetBankPlatforms(); string[] bankFolders = new string[bankPlatforms.Length]; for (int i = 0; i < bankPlatforms.Length; i++) { bankFolders[i] = RuntimeUtils.GetCommonPlatformPath(Path.Combine(settings.SourceBankPath, bankPlatforms[i])); } List <string> stringBanks = new List <string>(0); try { var files = Directory.GetFiles(defaultBankFolder, "*." + StringBankExtension, SearchOption.AllDirectories); stringBanks = new List <string>(files); } catch { } // Strip out OSX resource-fork files that appear on FAT32 stringBanks.RemoveAll((x) => Path.GetFileName(x).StartsWith("._")); if (stringBanks.Count == 0) { bool wasValid = eventCache.StringsBankWriteTime != DateTime.MinValue; ClearCache(); if (wasValid) { UnityEngine.Debug.LogError(string.Format("FMOD Studio: Directory {0} doesn't contain any banks. Build the banks in Studio or check the path in the settings.", defaultBankFolder)); } return; } // If we have multiple .strings.bank files find the most recent stringBanks.Sort((a, b) => File.GetLastWriteTime(b).CompareTo(File.GetLastWriteTime(a))); // Use the most recent string bank timestamp as a marker for the most recent build of any bank because it gets exported every time DateTime lastWriteTime = File.GetLastWriteTime(stringBanks[0]); if (lastWriteTime == eventCache.StringsBankWriteTime) { countdownTimer = CountdownTimerReset; return; } if (EditorUtils.IsFileOpenByStudio(stringBanks[0])) { countdownTimer = CountdownTimerReset; return; } // Most recent strings bank is newer than last cache update time, recache. // Get a list of all banks List <string> bankFileNames = new List <string>(); List <string> reducedStringBanksList = new List <string>(); HashSet <Guid> stringBankGuids = new HashSet <Guid>(); foreach (string stringBankPath in stringBanks) { FMOD.Studio.Bank stringBank; EditorUtils.CheckResult(EditorUtils.System.loadBankFile(stringBankPath, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out stringBank)); if (!stringBank.isValid()) { countdownTimer = CountdownTimerReset; return; } else { // Unload the strings bank stringBank.unload(); } Guid stringBankGuid; EditorUtils.CheckResult(stringBank.getID(out stringBankGuid)); if (!stringBankGuids.Add(stringBankGuid)) { // If we encounter multiple string banks with the same GUID then only use the first. This handles the scenario where // a Studio project is cloned and extended for DLC with a new master bank name. continue; } reducedStringBanksList.Add(stringBankPath); } bankFileNames = new List <string>(Directory.GetFiles(defaultBankFolder, "*.bank", SearchOption.AllDirectories)); bankFileNames.RemoveAll(x => x.Contains(".strings")); stringBanks = reducedStringBanksList; if (!UnityEditorInternal.InternalEditorUtility.inBatchMode) { // Check if any of the files are still being written by studio foreach (string bankFileName in bankFileNames) { EditorBankRef bankRef = eventCache.EditorBanks.Find((x) => RuntimeUtils.GetCommonPlatformPath(bankFileName) == x.Path); if (bankRef == null) { if (EditorUtils.IsFileOpenByStudio(bankFileName)) { countdownTimer = CountdownTimerReset; return; } continue; } if (bankRef.LastModified != File.GetLastWriteTime(bankFileName)) { if (EditorUtils.IsFileOpenByStudio(bankFileName)) { countdownTimer = CountdownTimerReset; return; } } } // Count down the timer in case we catch studio in-between updating two files. if (countdownTimer-- > 0) { return; } } eventCache.StringsBankWriteTime = lastWriteTime; // All files are finished being modified by studio so update the cache // Stop editor preview so no stale data being held EditorUtils.PreviewStop(); // Reload the strings banks List <FMOD.Studio.Bank> loadedStringsBanks = new List <FMOD.Studio.Bank>(); try { AssetDatabase.StartAssetEditing(); eventCache.EditorBanks.ForEach((x) => x.Exists = false); HashSet <string> masterBankFileNames = new HashSet <string>(); foreach (string stringBankPath in stringBanks) { FMOD.Studio.Bank stringBank; EditorUtils.CheckResult(EditorUtils.System.loadBankFile(stringBankPath, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out stringBank)); if (!stringBank.isValid()) { ClearCache(); return; } loadedStringsBanks.Add(stringBank); FileInfo stringBankFileInfo = new FileInfo(stringBankPath); string masterBankFileName = Path.GetFileName(stringBankPath).Replace(StringBankExtension, BankExtension); masterBankFileNames.Add(masterBankFileName); EditorBankRef stringsBankRef = eventCache.StringsBanks.Find(x => RuntimeUtils.GetCommonPlatformPath(stringBankPath) == x.Path); if (stringsBankRef == null) { stringsBankRef = ScriptableObject.CreateInstance <EditorBankRef>(); stringsBankRef.FileSizes = new List <EditorBankRef.NameValuePair>(); AssetDatabase.AddObjectToAsset(stringsBankRef, eventCache); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(stringsBankRef)); eventCache.EditorBanks.Add(stringsBankRef); eventCache.StringsBanks.Add(stringsBankRef); } stringsBankRef.Path = RuntimeUtils.GetCommonPlatformPath(stringBankPath); stringsBankRef.name = "bank:/" + Path.GetFileName(stringsBankRef.Path); stringsBankRef.LastModified = stringBankFileInfo.LastWriteTime; stringsBankRef.Exists = true; stringsBankRef.FileSizes.Clear(); if (Settings.Instance.HasPlatforms) { for (int i = 0; i < bankPlatforms.Length; i++) { stringsBankRef.FileSizes.Add(new EditorBankRef.NameValuePair(bankPlatforms[i], stringBankFileInfo.Length)); } } else { stringsBankRef.FileSizes.Add(new EditorBankRef.NameValuePair("", stringBankFileInfo.Length)); } } eventCache.EditorParameters.ForEach((x) => x.Exists = false); foreach (string bankFileName in bankFileNames) { FileInfo bankFileInfo = new FileInfo(bankFileName); EditorBankRef bankRef = eventCache.EditorBanks.Find((x) => RuntimeUtils.GetCommonPlatformPath(bankFileInfo.FullName) == x.Path); // New bank we've never seen before if (bankRef == null) { bankRef = ScriptableObject.CreateInstance <EditorBankRef>(); AssetDatabase.AddObjectToAsset(bankRef, eventCache); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(bankRef)); bankRef.Path = RuntimeUtils.GetCommonPlatformPath(bankFileName); bankRef.name = "bank:/" + Path.GetFileName(bankRef.Path); bankRef.LastModified = DateTime.MinValue; bankRef.FileSizes = new List <EditorBankRef.NameValuePair>(); eventCache.EditorBanks.Add(bankRef); } bankRef.Exists = true; // Timestamp check - if it doesn't match update events from that bank if (bankRef.LastModified != bankFileInfo.LastWriteTime) { bankRef.LastModified = bankFileInfo.LastWriteTime; UpdateCacheBank(bankRef); } // Update file sizes bankRef.FileSizes.Clear(); if (Settings.Instance.HasPlatforms) { for (int i = 0; i < bankPlatforms.Length; i++) { string platformBankPath = RuntimeUtils.GetCommonPlatformPath(Path.Combine(bankFolders[i], bankFileName)); var fileInfo = new FileInfo(platformBankPath); if (fileInfo.Exists) { bankRef.FileSizes.Add(new EditorBankRef.NameValuePair(bankPlatforms[i], fileInfo.Length)); } } } else { string platformBankPath = RuntimeUtils.GetCommonPlatformPath(Path.Combine(Settings.Instance.SourceBankPath, bankFileName)); var fileInfo = new FileInfo(platformBankPath); if (fileInfo.Exists) { bankRef.FileSizes.Add(new EditorBankRef.NameValuePair("", fileInfo.Length)); } } if (masterBankFileNames.Contains(bankFileInfo.Name)) { if (!eventCache.MasterBanks.Exists(x => RuntimeUtils.GetCommonPlatformPath(bankFileInfo.FullName) == x.Path)) { eventCache.MasterBanks.Add(bankRef); } } } // Remove any stale entries from bank, event and parameter lists eventCache.EditorBanks.FindAll((x) => !x.Exists).ForEach(RemoveCacheBank); eventCache.EditorBanks.RemoveAll((x) => !x.Exists); eventCache.EditorEvents.RemoveAll((x) => x.Banks.Count == 0); eventCache.EditorParameters.RemoveAll((x) => !x.Exists); eventCache.MasterBanks.RemoveAll((x) => !x.Exists); eventCache.StringsBanks.RemoveAll((x) => !x.Exists); } finally { // Unload the strings banks loadedStringsBanks.ForEach(x => x.unload()); AssetDatabase.StopAssetEditing(); } }
void DisplayParentInt(string label, List<PlatformIntSetting> settings, FMODPlatform platform, int min, int max) { int current = Settings.GetSetting(settings, platform, 0); int next = EditorGUILayout.IntSlider(label, current, min, max); Settings.SetSetting(settings, platform, next); }
static public void UpdateCache() { // Deserialize the cache from the unity resources if (eventCache == null) { eventCache = AssetDatabase.LoadAssetAtPath(CacheAssetFullName, typeof(EventCache)) as EventCache; if (eventCache == null || eventCache.cacheVersion != EventCache.CurrentCacheVersion) { UnityEngine.Debug.Log("FMOD Studio: Cannot find serialized event cache or cache in old format, creating new instance"); eventCache = ScriptableObject.CreateInstance <EventCache>(); eventCache.cacheVersion = EventCache.CurrentCacheVersion; AssetDatabase.CreateAsset(eventCache, CacheAssetFullName); } } if (EditorUtils.GetBankDirectory() == null) { ClearCache(); return; } string defaultBankFolder = null; if (!Settings.Instance.HasPlatforms) { defaultBankFolder = EditorUtils.GetBankDirectory(); } else { FMODPlatform platform = RuntimeUtils.GetEditorFMODPlatform(); if (platform == FMODPlatform.None) { platform = FMODPlatform.PlayInEditor; } defaultBankFolder = Path.Combine(EditorUtils.GetBankDirectory(), Settings.Instance.GetBankPlatform(platform)); } string[] bankPlatforms = EditorUtils.GetBankPlatforms(); string[] bankFolders = new string[bankPlatforms.Length]; for (int i = 0; i < bankPlatforms.Length; i++) { bankFolders[i] = Path.Combine(EditorUtils.GetBankDirectory(), bankPlatforms[i]); } List <String> stringBanks = new List <string>(0); try { var files = Directory.GetFiles(defaultBankFolder, "*." + StringBankExtension); stringBanks = new List <string>(files); } catch { } // Strip out OSX resource-fork files that appear on FAT32 stringBanks.RemoveAll((x) => Path.GetFileName(x).StartsWith("._")); if (stringBanks.Count == 0) { bool wasValid = eventCache.StringsBankWriteTime != DateTime.MinValue; ClearCache(); if (wasValid) { UnityEngine.Debug.LogError(String.Format("FMOD Studio: Directory {0} doesn't contain any banks. Build from the tool or check the path in the settings", defaultBankFolder)); } return; } // If we have multiple .strings.bank files find the most recent stringBanks.Sort((a, b) => File.GetLastWriteTime(b).CompareTo(File.GetLastWriteTime(a))); // Use the most recent string bank timestamp as a marker for the most recent build of any bank because it gets exported every time DateTime lastWriteTime = File.GetLastWriteTime(stringBanks[0]); if (lastWriteTime == eventCache.StringsBankWriteTime) { countdownTimer = CountdownTimerReset; return; } if (EditorUtils.IsFileOpenByStudio(stringBanks[0])) { countdownTimer = CountdownTimerReset; return; } // Most recent strings bank is newer than last cache update time, recache. // Get a list of all banks HashSet <string> bankFileNames = new HashSet <string>(); List <string> reducedStringBanksList = new List <string>(); HashSet <Guid> stringBankGuids = new HashSet <Guid>(); foreach (string stringBankPath in stringBanks) { FMOD.Studio.Bank stringBank; EditorUtils.CheckResult(EditorUtils.System.loadBankFile(stringBankPath, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out stringBank)); if (!stringBank.isValid()) { countdownTimer = CountdownTimerReset; return; } try { Guid stringBankGuid; EditorUtils.CheckResult(stringBank.getID(out stringBankGuid)); if (!stringBankGuids.Add(stringBankGuid)) { // If we encounter multiple string banks with the same GUID then only use the first. This handles the scenario where // a Studio project is cloned and extended for DLC with a new master bank name. continue; } reducedStringBanksList.Add(stringBankPath); // Iterate every string in the strings bank and look for any that identify banks int stringCount; stringBank.getStringCount(out stringCount); for (int stringIndex = 0; stringIndex < stringCount; stringIndex++) { string currentString; Guid currentGuid; stringBank.getStringInfo(stringIndex, out currentGuid, out currentString); const string BankPrefix = "bank:/"; int BankPrefixLength = BankPrefix.Length; if (currentString.StartsWith(BankPrefix)) { string bankFileName = currentString.Substring(BankPrefixLength) + "." + BankExtension; if (!bankFileName.Contains(StringBankExtension)) // filter out the strings bank { bankFileNames.Add(bankFileName); } } } } finally { // Unload the strings bank stringBank.unload(); } } stringBanks = reducedStringBanksList; // Check if any of the files are still being written by studio foreach (string bankFileName in bankFileNames) { string bankPath = Path.Combine(defaultBankFolder, bankFileName); if (!File.Exists(bankPath)) { // TODO: this is meant to catch the case where we're in the middle of a build and a bank is being built // for the first time. But it also stops someone trying to import an incomplete set of banks without any error message. countdownTimer = CountdownTimerReset; return; } EditorBankRef bankRef = eventCache.EditorBanks.Find((x) => bankPath == x.Path); if (bankRef == null) { if (EditorUtils.IsFileOpenByStudio(bankPath)) { countdownTimer = CountdownTimerReset; return; } continue; } if (bankRef.LastModified != File.GetLastWriteTime(bankPath)) { if (EditorUtils.IsFileOpenByStudio(bankPath)) { countdownTimer = CountdownTimerReset; return; } } } // Count down the timer in case we catch studio in-between updating two files. if (countdownTimer-- > 0) { return; } eventCache.StringsBankWriteTime = lastWriteTime; // All files are finished being modified by studio so update the cache // Stop editor preview so no stale data being held EditorUtils.PreviewStop(); // Reload the strings banks List <FMOD.Studio.Bank> loadedBanks = new List <FMOD.Studio.Bank>(); try { AssetDatabase.StartAssetEditing(); eventCache.EditorBanks.ForEach((x) => x.Exists = false); HashSet <string> masterBankFileNames = new HashSet <string>(); foreach (string stringBankPath in stringBanks) { FMOD.Studio.Bank stringBank; EditorUtils.CheckResult(EditorUtils.System.loadBankFile(stringBankPath, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out stringBank)); if (!stringBank.isValid()) { ClearCache(); return; } loadedBanks.Add(stringBank); FileInfo stringBankFileInfo = new FileInfo(stringBankPath); string masterBankFileName = Path.GetFileName(stringBankPath).Replace(StringBankExtension, BankExtension); masterBankFileNames.Add(masterBankFileName); EditorBankRef stringsBankRef = eventCache.StringsBanks.Find(x => stringBankPath == x.Path); if (stringsBankRef == null) { stringsBankRef = ScriptableObject.CreateInstance <EditorBankRef>(); stringsBankRef.FileSizes = new List <EditorBankRef.NameValuePair>(); eventCache.EditorBanks.Add(stringsBankRef); AssetDatabase.AddObjectToAsset(stringsBankRef, eventCache); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(stringsBankRef)); eventCache.StringsBanks.Add(stringsBankRef); } stringsBankRef.Path = stringBankPath; stringsBankRef.LastModified = stringBankFileInfo.LastWriteTime; stringsBankRef.Exists = true; stringsBankRef.FileSizes.Clear(); if (Settings.Instance.HasPlatforms) { for (int i = 0; i < bankPlatforms.Length; i++) { stringsBankRef.FileSizes.Add(new EditorBankRef.NameValuePair(bankPlatforms[i], stringBankFileInfo.Length)); } } else { stringsBankRef.FileSizes.Add(new EditorBankRef.NameValuePair("", stringBankFileInfo.Length)); } } string[] folderContents = Directory.GetFiles(defaultBankFolder); foreach (string bankFileName in bankFileNames) { // Get the true file path, can't trust the character case we got from the string bank string bankPath = ArrayUtility.Find(folderContents, x => (string.Equals(bankFileName, Path.GetFileName(x), StringComparison.CurrentCultureIgnoreCase))); FileInfo bankFileInfo = new FileInfo(bankPath); EditorBankRef bankRef = eventCache.EditorBanks.Find((x) => bankFileInfo.FullName == x.Path); // New bank we've never seen before if (bankRef == null) { bankRef = ScriptableObject.CreateInstance <EditorBankRef>(); AssetDatabase.AddObjectToAsset(bankRef, eventCache); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(bankRef)); bankRef.Path = bankFileInfo.FullName; bankRef.LastModified = DateTime.MinValue; bankRef.FileSizes = new List <EditorBankRef.NameValuePair>(); eventCache.EditorBanks.Add(bankRef); } bankRef.Exists = true; // Timestamp check - if it doesn't match update events from that bank if (bankRef.LastModified != bankFileInfo.LastWriteTime) { bankRef.LastModified = bankFileInfo.LastWriteTime; UpdateCacheBank(bankRef); } // Update file sizes bankRef.FileSizes.Clear(); if (Settings.Instance.HasPlatforms) { for (int i = 0; i < bankPlatforms.Length; i++) { string platformBankPath = Path.Combine(bankFolders[i], bankFileName); var fileInfo = new FileInfo(platformBankPath); if (fileInfo.Exists) { bankRef.FileSizes.Add(new EditorBankRef.NameValuePair(bankPlatforms[i], fileInfo.Length)); } } } else { string platformBankPath = Path.Combine(EditorUtils.GetBankDirectory(), bankFileName); var fileInfo = new FileInfo(platformBankPath); if (fileInfo.Exists) { bankRef.FileSizes.Add(new EditorBankRef.NameValuePair("", fileInfo.Length)); } } if (masterBankFileNames.Contains(bankFileInfo.Name)) { if (!eventCache.MasterBanks.Exists(x => bankFileInfo.FullName == x.Path)) { eventCache.MasterBanks.Add(bankRef); } } } // Remove any stale entries from bank and event lists eventCache.EditorBanks.FindAll((x) => !x.Exists).ForEach(RemoveCacheBank); eventCache.EditorBanks.RemoveAll((x) => !x.Exists); eventCache.EditorEvents.RemoveAll((x) => x.Banks.Count == 0); OnCacheChange(); } finally { // Unload the strings banks loadedBanks.ForEach(x => x.unload()); AssetDatabase.StopAssetEditing(); } }
void DisplayChildSpeakerMode(string label, List<PlatformIntSetting> settings, FMODPlatform platform) { bool overriden = Settings.HasSetting(settings, platform); int current = Settings.GetSetting(settings, platform, 0); int index = Array.IndexOf(SpeakerModeValues, current); string[] valuesChild = new string[SpeakerModeDisplay.Length + 1]; Array.Copy(SpeakerModeDisplay, 0, valuesChild, 1, SpeakerModeDisplay.Length); valuesChild[0] = String.Format("Inherit ({0})", SpeakerModeDisplay[index]); int next = EditorGUILayout.Popup(label, overriden ? index + 1 : 0, valuesChild); if (next == 0) { Settings.RemoveSetting(settings, platform); } else { Settings.SetSetting(settings, platform, SpeakerModeValues[next - 1]); } }
FMOD.RESULT Initialize() { #if UNITY_EDITOR #if UNITY_2017_2_OR_NEWER EditorApplication.playModeStateChanged += HandlePlayModeStateChange; #elif UNITY_2017_1_OR_NEWER EditorApplication.playmodeStateChanged += HandleOnPlayModeChanged; #endif // UNITY_2017_2_OR_NEWER #endif // UNITY_EDITOR FMOD.RESULT result = FMOD.RESULT.OK; FMOD.RESULT initResult = FMOD.RESULT.OK; Settings fmodSettings = Settings.Instance; fmodPlatform = RuntimeUtils.GetCurrentPlatform(); int sampleRate = fmodSettings.GetSampleRate(fmodPlatform); int realChannels = Math.Min(fmodSettings.GetRealChannels(fmodPlatform), 256); // Prior to 1.08.10 we didn't clamp this properly in the settings screen int virtualChannels = fmodSettings.GetVirtualChannels(fmodPlatform); FMOD.SPEAKERMODE speakerMode = (FMOD.SPEAKERMODE)fmodSettings.GetSpeakerMode(fmodPlatform); FMOD.OUTPUTTYPE outputType = FMOD.OUTPUTTYPE.AUTODETECT; FMOD.ADVANCEDSETTINGS advancedSettings = new FMOD.ADVANCEDSETTINGS(); advancedSettings.randomSeed = (uint)DateTime.Now.Ticks; #if UNITY_EDITOR || UNITY_STANDALONE advancedSettings.maxVorbisCodecs = realChannels; #elif UNITY_XBOXONE advancedSettings.maxXMACodecs = realChannels; #elif UNITY_PS4 advancedSettings.maxAT9Codecs = realChannels; #else advancedSettings.maxFADPCMCodecs = realChannels; #endif SetThreadAffinity(); #if UNITY_EDITOR || ((UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX) && DEVELOPMENT_BUILD) result = FMOD.Debug.Initialize(fmodSettings.LoggingLevel, FMOD.DEBUG_MODE.CALLBACK, DEBUG_CALLBACK, null); CheckInitResult(result, "FMOD.Debug.Initialize"); #endif FMOD.Studio.INITFLAGS studioInitFlags = FMOD.Studio.INITFLAGS.NORMAL | FMOD.Studio.INITFLAGS.DEFERRED_CALLBACKS; if (fmodSettings.IsLiveUpdateEnabled(fmodPlatform)) { studioInitFlags |= FMOD.Studio.INITFLAGS.LIVEUPDATE; #if UNITY_5_0 || UNITY_5_1 // These versions of Unity shipped with FMOD4 profiling enabled consuming our port number. UnityEngine.Debug.LogWarning("[FMOD] Live Update port in-use by Unity, switching to port 9265"); advancedSettings.profilePort = 9265; #endif } retry: result = FMOD.Studio.System.create(out studioSystem); CheckInitResult(result, "FMOD.Studio.System.create"); result = studioSystem.getLowLevelSystem(out lowlevelSystem); CheckInitResult(result, "FMOD.Studio.System.getLowLevelSystem"); result = lowlevelSystem.setOutput(outputType); CheckInitResult(result, "FMOD.System.setOutput"); result = lowlevelSystem.setSoftwareChannels(realChannels); CheckInitResult(result, "FMOD.System.setSoftwareChannels"); result = lowlevelSystem.setSoftwareFormat(sampleRate, speakerMode, 0); CheckInitResult(result, "FMOD.System.setSoftwareFormat"); result = lowlevelSystem.setAdvancedSettings(ref advancedSettings); CheckInitResult(result, "FMOD.System.setAdvancedSettings"); result = studioSystem.initialize(virtualChannels, studioInitFlags, FMOD.INITFLAGS.NORMAL, IntPtr.Zero); if (result != FMOD.RESULT.OK && initResult == FMOD.RESULT.OK) { initResult = result; // Save this to throw at the end (we'll attempt NO SOUND to shield ourselves from unexpected device failures) outputType = FMOD.OUTPUTTYPE.NOSOUND; UnityEngine.Debug.LogErrorFormat("[FMOD] Studio::System::initialize returned {0}, defaulting to no-sound mode.", result.ToString()); goto retry; } CheckInitResult(result, "Studio::System::initialize"); // Test network functionality triggered during System::update if ((studioInitFlags & FMOD.Studio.INITFLAGS.LIVEUPDATE) != 0) { studioSystem.flushCommands(); // Any error will be returned through Studio.System.update result = studioSystem.update(); if (result == FMOD.RESULT.ERR_NET_SOCKET_ERROR) { studioInitFlags &= ~FMOD.Studio.INITFLAGS.LIVEUPDATE; UnityEngine.Debug.LogWarning("[FMOD] Cannot open network port for Live Update (in-use), restarting with Live Update disabled."); result = studioSystem.release(); CheckInitResult(result, "FMOD.Studio.System.Release"); goto retry; } } LoadPlugins(fmodSettings); LoadBanks(fmodSettings); return(initResult); }
private bool AllowBankChange(FMODPlatform platform) { // Can't do these settings on pseudo-platforms if (platform == FMODPlatform.MobileLow || platform == FMODPlatform.MobileHigh) { return false; } return true; }
void Initialiase(bool forceNoNetwork) { // UnityEngine.Debug.Log("FMOD Studio: Creating runtime system instance"); FMOD.RESULT result; result = FMOD.Studio.System.create(out studioSystem); CheckInitResult(result, "Creating System Object"); studioSystem.getLowLevelSystem(out lowlevelSystem); Settings fmodSettings = Settings.Instance; fmodPlatform = RuntimeUtils.GetCurrentPlatform(); #if UNITY_EDITOR || ((UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX) && DEVELOPMENT_BUILD) result = FMOD.Debug.Initialize(FMOD.DEBUG_FLAGS.LOG, FMOD.DEBUG_MODE.FILE, null, RuntimeUtils.LogFileName); if (result == FMOD.RESULT.ERR_FILE_NOTFOUND) { UnityEngine.Debug.LogWarningFormat("FMOD Studio: Cannot open FMOD debug log file '{0}', logs will be missing for this session.", System.IO.Path.Combine(Application.dataPath, RuntimeUtils.LogFileName)); } else { CheckInitResult(result, "Applying debug settings"); } #endif int realChannels = fmodSettings.GetRealChannels(fmodPlatform); realChannels = Math.Min(realChannels, 256); // Prior to 1.08.10 we didn't clamp this properly in the settings screen result = lowlevelSystem.setSoftwareChannels(realChannels); CheckInitResult(result, "Set software channels"); result = lowlevelSystem.setSoftwareFormat( fmodSettings.GetSampleRate(fmodPlatform), (FMOD.SPEAKERMODE)fmodSettings.GetSpeakerMode(fmodPlatform), 0 // raw not supported ); CheckInitResult(result, "Set software format"); // Setup up the platforms recommended codec to match the real channel count FMOD.ADVANCEDSETTINGS advancedsettings = new FMOD.ADVANCEDSETTINGS(); #if UNITY_EDITOR || UNITY_STANDALONE advancedsettings.maxVorbisCodecs = realChannels; #elif UNITY_IOS || UNITY_ANDROID || UNITY_WP8_1 || UNITY_PSP2 || UNITY_WII advancedsettings.maxFADPCMCodecs = realChannels; #elif UNITY_XBOXONE advancedsettings.maxXMACodecs = realChannels; #elif UNITY_PS4 advancedsettings.maxAT9Codecs = realChannels; #endif #if UNITY_5_0 || UNITY_5_1 if (fmodSettings.IsLiveUpdateEnabled(fmodPlatform) && !forceNoNetwork) { UnityEngine.Debug.LogWarning("FMOD Studio: Detected Unity 5, running on port 9265"); advancedsettings.profilePort = 9265; } #endif advancedsettings.randomSeed = (uint)DateTime.Now.Ticks; result = lowlevelSystem.setAdvancedSettings(ref advancedsettings); CheckInitResult(result, "Set advanced settings"); FMOD.INITFLAGS lowlevelInitFlags = FMOD.INITFLAGS.NORMAL; FMOD.Studio.INITFLAGS studioInitFlags = FMOD.Studio.INITFLAGS.NORMAL | FMOD.Studio.INITFLAGS.DEFERRED_CALLBACKS; if (fmodSettings.IsLiveUpdateEnabled(fmodPlatform) && !forceNoNetwork) { studioInitFlags |= FMOD.Studio.INITFLAGS.LIVEUPDATE; } FMOD.RESULT initResult = studioSystem.initialize( fmodSettings.GetVirtualChannels(fmodPlatform), studioInitFlags, lowlevelInitFlags, IntPtr.Zero ); CheckInitResult(initResult, "Calling initialize"); // Dummy flush and update to get network state studioSystem.flushCommands(); FMOD.RESULT updateResult = studioSystem.update(); // Restart without liveupdate if there was a socket error if (updateResult == FMOD.RESULT.ERR_NET_SOCKET_ERROR) { studioSystem.release(); UnityEngine.Debug.LogWarning("FMOD Studio: Cannot open network port for Live Update, restarting with Live Update disabled. Check for other applications that are running FMOD Studio"); Initialiase(true); } else { // Load plugins (before banks) #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR FmodUnityNativePluginInit(lowlevelSystem.getRaw()); #else foreach (var pluginName in fmodSettings.Plugins) { string pluginPath = RuntimeUtils.GetPluginPath(pluginName); uint handle; result = lowlevelSystem.loadPlugin(pluginPath, out handle); #if UNITY_64 || UNITY_EDITOR_64 // Add a "64" suffix and try again if (result == FMOD.RESULT.ERR_FILE_BAD || result == FMOD.RESULT.ERR_FILE_NOTFOUND) { string pluginPath64 = RuntimeUtils.GetPluginPath(pluginName + "64"); result = lowlevelSystem.loadPlugin(pluginPath64, out handle); } #endif CheckInitResult(result, String.Format("Loading plugin '{0}' from '{1}'", pluginName, pluginPath)); loadedPlugins.Add(pluginName, handle); } #endif if (fmodSettings.ImportType == ImportType.StreamingAssets) { // Always load strings bank try { LoadBank(fmodSettings.MasterBank + ".strings", fmodSettings.AutomaticSampleLoading); } catch (BankLoadException e) { UnityEngine.Debug.LogException(e); } if (fmodSettings.AutomaticEventLoading) { try { LoadBank(fmodSettings.MasterBank, fmodSettings.AutomaticSampleLoading); } catch (BankLoadException e) { UnityEngine.Debug.LogException(e); } foreach (var bank in fmodSettings.Banks) { try { LoadBank(bank, fmodSettings.AutomaticSampleLoading); } catch (BankLoadException e) { UnityEngine.Debug.LogException(e); } } WaitForAllLoads(); } } }; FMOD.ChannelGroup master; lowlevelSystem.getMasterChannelGroup(out master); master.getDSP(0, out mixerHead); mixerHead.setMeteringEnabled(false, true); }
public static bool HasSetting <T>(List <T> list, FMODPlatform platform) where T : PlatformSettingBase { return(list.Exists((x) => x.Platform == platform)); }
void DisplayParentSpeakerMode(string label, List <PlatformIntSetting> settings, FMODPlatform platform) { int current = Settings.GetSetting(settings, platform, (int)FMOD.SPEAKERMODE.STEREO); int index = Array.IndexOf(SpeakerModeValues, current); int next = EditorGUILayout.Popup(label, index, SpeakerModeDisplay); Settings.SetSetting(settings, platform, SpeakerModeValues[next]); }
// -------- Real channels ---------------------- public int GetRealChannels(FMODPlatform platform) { return(GetSetting(RealChannelSettings, platform, 64)); }
void DisplayChildSpeakerMode(string label, List <PlatformIntSetting> settings, FMODPlatform platform) { bool overriden = Settings.HasSetting(settings, platform); int current = Settings.GetSetting(settings, platform, 0); int inherit = Settings.GetSetting(settings, Settings.GetParent(platform), 0); int currentIndex = Array.IndexOf(SpeakerModeValues, current); int inheritIndex = Array.IndexOf(SpeakerModeValues, inherit); string[] valuesChild = new string[SpeakerModeDisplay.Length + 1]; Array.Copy(SpeakerModeDisplay, 0, valuesChild, 1, SpeakerModeDisplay.Length); valuesChild[0] = String.Format("Inherit ({0})", SpeakerModeDisplay[inheritIndex]); int next = EditorGUILayout.Popup(label, overriden ? currentIndex + 1 : 0, valuesChild); if (next == 0) { Settings.RemoveSetting(settings, platform); } else { Settings.SetSetting(settings, platform, SpeakerModeValues[next - 1]); } }
void DisplayChildBool(string label, List<PlatformBoolSetting> settings, FMODPlatform platform) { bool overriden = Settings.HasSetting(settings, platform); TriStateBool parent = Settings.GetSetting(settings, Settings.GetParent(platform), TriStateBool.Disabled); TriStateBool current = Settings.GetSetting(settings, platform, TriStateBool.Disabled); string[] toggleChild = new string[ToggleParent.Length + 1]; Array.Copy(ToggleParent, 0, toggleChild, 1, ToggleParent.Length); toggleChild[0] = String.Format("Inherit ({0})", ToggleParent[(int)parent]); int next = EditorGUILayout.Popup(label, overriden ? (int)current + 1: 0, toggleChild); if (next == 0) { if (overriden) { Settings.RemoveSetting(settings, platform); } } else { Settings.SetSetting(settings, platform, (TriStateBool)(next-1)); } }
void DisplayParentBuildDirectory(string label, List <PlatformStringSetting> settings, FMODPlatform platform) { string[] buildDirectories = EditorUtils.GetBankPlatforms(); String current = Settings.GetSetting(settings, platform, "Desktop"); int index = Array.IndexOf(buildDirectories, current); if (index < 0) { index = 0; } int next = EditorGUILayout.Popup(label, index, buildDirectories); Settings.SetSetting(settings, platform, buildDirectories[next]); }
void DisplayEditorBool(string label, List<PlatformBoolSetting> settings, FMODPlatform platform) { int current = Settings.GetSetting(settings, platform, TriStateBool.Disabled) != TriStateBool.Disabled ? 0 : 1; int next = EditorGUILayout.Popup(label, (int)current, ToggleEditor); Settings.SetSetting(settings, platform, next == 0 ? TriStateBool.Enabled : TriStateBool.Disabled); }
void DisplayPIEBuildDirectory(string label, List <PlatformStringSetting> settings, FMODPlatform platform) { String buildTargetSetting = Settings.GetSetting(settings, RuntimeUtils.GetEditorFMODPlatform(), "Desktop"); string[] buildDirectories = new string[EditorUtils.GetBankPlatforms().Length + 1]; Array.Copy(EditorUtils.GetBankPlatforms(), 0, buildDirectories, 1, EditorUtils.GetBankPlatforms().Length); buildDirectories[0] = String.Format("Current Unity Platform ({0})", buildTargetSetting); bool useCurrentUnity = !Settings.HasSetting(settings, platform); String current = Settings.GetSetting(settings, platform, "Desktop"); int index = Array.IndexOf(buildDirectories, current); if (useCurrentUnity || index < 0) { index = 0; } int next = EditorGUILayout.Popup(label, index, buildDirectories); if (next != 0) { Settings.SetSetting(settings, platform, buildDirectories[next]); } else { Settings.RemoveSetting(settings, platform); } }
void DisplayPIEBuildDirectory(string label, List<PlatformStringSetting> settings, FMODPlatform platform) { String buildTargetSetting = Settings.GetSetting(settings, RuntimeUtils.GetEditorFMODPlatform(), "Desktop"); string[] buildDirectories = new string[EditorUtils.GetBankPlatforms().Length + 1]; Array.Copy(EditorUtils.GetBankPlatforms(), 0, buildDirectories, 1, EditorUtils.GetBankPlatforms().Length); buildDirectories[0] = String.Format("Current Unity Platform ({0})", buildTargetSetting); bool useCurrentUnity = !Settings.HasSetting(settings, platform); String current = Settings.GetSetting(settings, platform, "Desktop"); int index = Array.IndexOf(buildDirectories, current); if (useCurrentUnity || index < 0) index = 0; int next = EditorGUILayout.Popup(label, index, buildDirectories); if (next != 0) { Settings.SetSetting(settings, platform, buildDirectories[next]); } else { Settings.RemoveSetting(settings, platform); } }
void DisplayChildBuildDirectories(string label, List <PlatformStringSetting> settings, FMODPlatform platform) { string[] buildDirectories = EditorUtils.GetBankPlatforms(); bool overriden = Settings.HasSetting(settings, platform); string current = Settings.GetSetting(settings, platform, "Desktop"); string inherit = Settings.GetSetting(settings, Settings.GetParent(platform), "Desktop"); int index = Array.IndexOf(buildDirectories, current); if (index < 0) { index = 0; } string[] valuesChild = new string[buildDirectories.Length + 1]; Array.Copy(buildDirectories, 0, valuesChild, 1, buildDirectories.Length); valuesChild[0] = String.Format("Inherit ({0})", inherit); int next = EditorGUILayout.Popup(label, overriden ? index + 1 : 0, valuesChild); if (next == 0) { Settings.RemoveSetting(settings, platform); Settings.RemoveSetting(((Settings)target).SpeakerModeSettings, platform); } else { Settings.SetSetting(settings, platform, buildDirectories[next - 1]); } }
void Initialiase(bool forceNoNetwork) { UnityEngine.Debug.Log("FMOD Studio: Creating runtime system instance"); FMOD.RESULT result; result = FMOD.Studio.System.create(out studioSystem); CheckInitResult(result, "Creating System Object"); studioSystem.getLowLevelSystem(out lowlevelSystem); Settings fmodSettings = Settings.Instance; fmodPlatform = RuntimeUtils.GetCurrentPlatform(); #if UNITY_EDITOR || ((UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX) && DEVELOPMENT_BUILD) result = FMOD.Debug.Initialize(FMOD.DEBUG_FLAGS.LOG, FMOD.DEBUG_MODE.FILE, null, RuntimeUtils.LogFileName); CheckInitResult(result, "Applying debug settings"); #endif int realChannels = fmodSettings.GetRealChannels(fmodPlatform); result = lowlevelSystem.setSoftwareChannels(realChannels); CheckInitResult(result, "Set software channels"); result = lowlevelSystem.setSoftwareFormat( fmodSettings.GetSampleRate(fmodPlatform), (FMOD.SPEAKERMODE)fmodSettings.GetSpeakerMode(fmodPlatform), 0 // raw not supported ); CheckInitResult(result, "Set software format"); // Setup up the platforms recommended codec to match the real channel count FMOD.ADVANCEDSETTINGS advancedsettings = new FMOD.ADVANCEDSETTINGS(); #if UNITY_EDITOR || UNITY_STANDALONE advancedsettings.maxVorbisCodecs = realChannels; #elif UNITY_IOS || UNITY_ANDROID || UNITY_WP8_1 || UNITY_PSP2 || UNITY_WII advancedsettings.maxFADPCMCodecs = realChannels; #elif UNITY_XBOXONE advancedsettings.maxXMACodecs = realChannels; #elif UNITY_PS4 advancedsettings.maxAT9Codecs = realChannels; #endif #if UNITY_5_0 || UNITY_5_1 if (fmodSettings.IsLiveUpdateEnabled(fmodPlatform) && !forceNoNetwork) { UnityEngine.Debug.LogWarning("FMOD Studio: Detected Unity 5, running on port 9265"); advancedsettings.profilePort = 9265; } #endif advancedsettings.randomSeed = (uint) DateTime.Now.Ticks; result = lowlevelSystem.setAdvancedSettings(ref advancedsettings); CheckInitResult(result, "Set advanced settings"); FMOD.INITFLAGS lowlevelInitFlags = FMOD.INITFLAGS.NORMAL; FMOD.Studio.INITFLAGS studioInitFlags = FMOD.Studio.INITFLAGS.NORMAL | FMOD.Studio.INITFLAGS.DEFERRED_CALLBACKS; if (fmodSettings.IsLiveUpdateEnabled(fmodPlatform) && !forceNoNetwork) { studioInitFlags |= FMOD.Studio.INITFLAGS.LIVEUPDATE; } FMOD.RESULT initResult = studioSystem.initialize( fmodSettings.GetVirtualChannels(fmodPlatform), studioInitFlags, lowlevelInitFlags, IntPtr.Zero ); CheckInitResult(initResult, "Calling initialize"); // Dummy flush and update to get network state studioSystem.flushCommands(); FMOD.RESULT updateResult = studioSystem.update(); // Restart without liveupdate if there was a socket error if (updateResult == FMOD.RESULT.ERR_NET_SOCKET_ERROR) { studioSystem.release(); UnityEngine.Debug.LogWarning("FMOD Studio: Cannot open network port for Live Update, restarting with Live Update disabled. Check for other applications that are running FMOD Studio"); Initialiase(true); } else { // Load plugins (before banks) foreach (var pluginName in fmodSettings.Plugins) { string pluginPath = RuntimeUtils.GetPluginPath(pluginName); uint handle; result = lowlevelSystem.loadPlugin(pluginPath, out handle); #if UNITY_64 || UNITY_EDITOR_64 // Add a "64" suffix and try again if (result == FMOD.RESULT.ERR_FILE_BAD || result == FMOD.RESULT.ERR_FILE_NOTFOUND) { pluginPath = RuntimeUtils.GetPluginPath(pluginName + "64"); result = lowlevelSystem.loadPlugin(pluginPath, out handle); } #endif CheckInitResult(result, String.Format("Loading plugin '{0}' from '{1}'", pluginName, pluginPath)); loadedPlugins.Add(pluginName, handle); } // Always load strings bank try { LoadBank(fmodSettings.MasterBank + ".strings", fmodSettings.AutomaticSampleLoading); } catch (BankLoadException e) { UnityEngine.Debug.LogException(e); } if (fmodSettings.AutomaticEventLoading) { try { LoadBank(fmodSettings.MasterBank, fmodSettings.AutomaticSampleLoading); } catch (BankLoadException e) { UnityEngine.Debug.LogException(e); } foreach (var bank in fmodSettings.Banks) { try { LoadBank(bank, fmodSettings.AutomaticSampleLoading); } catch (BankLoadException e) { UnityEngine.Debug.LogException(e); } } } }; FMOD.ChannelGroup master; lowlevelSystem.getMasterChannelGroup(out master); master.getDSP(0, out mixerHead); mixerHead.setMeteringEnabled(false, true); }
void DisplayPlatform(FMODPlatform platform, FMODPlatform[] children = null) { Settings settings = target as Settings; var label = new global::System.Text.StringBuilder(); label.AppendFormat("<b>{0}</b>", (PlatformLabel(platform))); if (children != null) { label.Append(" ("); foreach (var child in children) { label.Append(PlatformLabel(child)); label.Append(", "); } label.Remove(label.Length - 2, 2); label.Append(")"); } GUIStyle style = new GUIStyle(GUI.skin.FindStyle("Foldout")); style.richText = true; foldoutState[(int)platform] = EditorGUILayout.Foldout(foldoutState[(int)platform], new GUIContent(label.ToString()), style); if (foldoutState[(int)platform]) { EditorGUI.indentLevel++; DisplayChildBool("Live Update", settings.LiveUpdateSettings, platform); if (settings.IsLiveUpdateEnabled(platform)) { GUIStyle style2 = new GUIStyle(GUI.skin.label); style2.richText = true; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel(" "); #if UNITY_5_0 || UNITY_5_1 GUILayout.Label("Unity 5.0 or 5.1 detected: Live update will listen on port <b>9265</b>", style2); #else GUILayout.Label("Live update will listen on port <b>9264</b>", style2); #endif EditorGUILayout.EndHorizontal(); } DisplayChildBool("Debug Overlay", settings.OverlaySettings, platform); DisplayChildFreq("Sample Rate", settings.SampleRateSettings, platform); if (settings.HasPlatforms && AllowBankChange(platform)) { bool prevChanged = GUI.changed; DisplayChildBuildDirectories("Bank Platform", settings.BankDirectorySettings, platform); hasBankSourceChanged |= !prevChanged && GUI.changed; if (Settings.HasSetting(settings.BankDirectorySettings, platform)) { DisplayChildSpeakerMode("Speaker Mode", settings.SpeakerModeSettings, platform); EditorGUILayout.HelpBox(String.Format("Match the speaker mode to the setting of the platform <b>{0}</b> inside FMOD Studio", settings.GetBankPlatform(platform)), MessageType.Info, false); } else { EditorGUI.BeginDisabledGroup(true); DisplayChildSpeakerMode("Speaker Mode", settings.SpeakerModeSettings, platform); EditorGUI.EndDisabledGroup(); } } DisplayChildInt("Virtual Channel Count", settings.VirtualChannelSettings, platform, 1, 2048); DisplayChildInt("Real Channel Count", settings.RealChannelSettings, platform, 1, 256); if (children != null) { foreach (var child in children) { DisplayPlatform(child); } } EditorGUI.indentLevel--; } }
void DisplayChildInt(string label, List<PlatformIntSetting> settings, FMODPlatform platform, int min, int max) { bool overriden = Settings.HasSetting(settings, platform); int current = Settings.GetSetting(settings, platform, 0); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel(label); overriden = !GUILayout.Toggle(!overriden, "Inherit"); EditorGUI.BeginDisabledGroup(!overriden); int next = EditorGUILayout.IntSlider(current, min, max); EditorGUI.EndDisabledGroup(); EditorGUILayout.EndHorizontal(); if (overriden) { Settings.SetSetting(settings, platform, next); } else { Settings.RemoveSetting(settings, platform); } }
public static bool HasSetting <T>(List <T> list, FMODPlatform platform) where T : PlatformSettingBase { return(FindSetting(list, platform) != null); }
void DisplayParentSpeakerMode(string label, List<PlatformIntSetting> settings, FMODPlatform platform) { int current = Settings.GetSetting(settings, platform, (int)FMOD.SPEAKERMODE.STEREO); int index = Array.IndexOf(SpeakerModeValues, current); int next = EditorGUILayout.Popup(label, index, SpeakerModeDisplay); Settings.SetSetting(settings, platform, SpeakerModeValues[next]); }
// -------- Sample Rate ---------------------- public int GetSampleRate(FMODPlatform platform) { return(GetSetting(SampleRateSettings, platform, 48000)); }
void DisplayParentBuildDirectory(string label, List<PlatformStringSetting> settings, FMODPlatform platform) { string[] buildDirectories = EditorUtils.GetBankPlatforms(); String current = Settings.GetSetting(settings, platform, "Desktop"); int index = Array.IndexOf(buildDirectories, current); if (index < 0) index = 0; int next = EditorGUILayout.Popup(label, index, buildDirectories); Settings.SetSetting(settings, platform, buildDirectories[next]); }
void DisplayParentBool(string label, List<PlatformBoolSetting> settings, FMODPlatform platform) { bool current = Settings.GetSetting(settings, platform, false); int next = EditorGUILayout.Popup(label, current ? 1 : 0, ToggleParent); Settings.SetSetting(settings, platform, next == 1); }
void DisplayPlatform(FMODPlatform platform, FMODPlatform[] children = null) { Settings settings = target as Settings; var label = new global::System.Text.StringBuilder(); label.AppendFormat("<b>{0}</b>", (PlatformLabel(platform))); if (children != null) { label.Append(" ("); foreach (var child in children) { label.Append(PlatformLabel(child)); label.Append(", "); } label.Remove(label.Length - 2, 2); label.Append(")"); } GUIStyle style = new GUIStyle(GUI.skin.FindStyle("Foldout")); style.richText = true; foldoutState[(int)platform] = EditorGUILayout.Foldout(foldoutState[(int)platform], new GUIContent(label.ToString()), style); if (foldoutState[(int)platform]) { EditorGUI.indentLevel++; DisplayChildBool("Live Update", settings.LiveUpdateSettings, platform); if (settings.IsLiveUpdateEnabled(platform)) { GUIStyle style2 = new GUIStyle(GUI.skin.label); style2.richText = true; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel(" "); #if UNITY_5_0 || UNITY_5_1 GUILayout.Label("Unity 5.0 or 5.1 detected: Live update will listen on port <b>9265</b>", style2); #else GUILayout.Label("Live update will listen on port <b>9264</b>", style2); #endif EditorGUILayout.EndHorizontal(); } DisplayChildBool("Debug Overlay", settings.LiveUpdateSettings, platform); DisplayChildFreq("Sample Rate", settings.SampleRateSettings, platform); if (settings.HasPlatforms && AllowBankChange(platform)) { bool prevChanged = GUI.changed; DisplayChildBuildDirectories("Bank Platform", settings.BankDirectorySettings, platform); hasBankSourceChanged |= !prevChanged && GUI.changed; if (Settings.HasSetting(settings.BankDirectorySettings, platform)) { DisplayChildSpeakerMode("Speaker Mode", settings.SpeakerModeSettings, platform); EditorGUILayout.HelpBox(String.Format("Match the speaker mode to the setting of the platform <b>{0}</b> inside FMOD Studio", settings.GetBankPlatform(platform)), MessageType.Info, false); } else { EditorGUI.BeginDisabledGroup(true); DisplayChildSpeakerMode("Speaker Mode", settings.SpeakerModeSettings, platform); EditorGUI.EndDisabledGroup(); } } DisplayChildInt("Virtual Channel Count", settings.VirtualChannelSettings, platform, 0, 2048); DisplayChildInt("Real Channel Count", settings.RealChannelSettings, platform, 0, 2048); if (children != null) { foreach (var child in children) { DisplayPlatform(child); } } EditorGUI.indentLevel--; } }
// -------- Speaker Mode ---------------------- public int GetSpeakerMode(FMODPlatform platform) { return(GetSetting(SpeakerModeSettings, platform, (int)FMOD.SPEAKERMODE.STEREO)); }
static public void UpdateCache() { // Deserialize the cache from the unity resources if (eventCache == null) { eventCache = AssetDatabase.LoadAssetAtPath(CacheAssetFullName, typeof(EventCache)) as EventCache; if (eventCache == null || eventCache.cacheVersion != EventCache.CurrentCacheVersion) { UnityEngine.Debug.Log("FMOD Studio: Cannot find serialized event cache or cache in old format, creating new instance"); eventCache = ScriptableObject.CreateInstance <EventCache>(); eventCache.cacheVersion = EventCache.CurrentCacheVersion; AssetDatabase.CreateAsset(eventCache, CacheAssetFullName); } } if (EditorUtils.GetBankDirectory() == null) { ClearCache(); return; } string defaultBankFolder = null; if (!Settings.Instance.HasPlatforms) { defaultBankFolder = EditorUtils.GetBankDirectory(); } else { FMODPlatform platform = EditorUtils.GetFMODPlatform(); if (platform == FMODPlatform.None) { platform = FMODPlatform.PlayInEditor; } defaultBankFolder = Path.Combine(EditorUtils.GetBankDirectory(), Settings.Instance.GetBankPlatform(platform)); } string[] bankPlatforms = EditorUtils.GetBankPlatforms(); string[] bankFolders = new string[bankPlatforms.Length]; for (int i = 0; i < bankPlatforms.Length; i++) { bankFolders[i] = Path.Combine(EditorUtils.GetBankDirectory(), bankPlatforms[i]); } List <String> stringBanks = new List <string>(0); try { var files = Directory.GetFiles(defaultBankFolder, "*." + StringBankExtension); stringBanks = new List <string>(files); } catch { } // Strip out OSX resource-fork files that appear on FAT32 stringBanks.RemoveAll((x) => Path.GetFileName(x).StartsWith("._")); if (stringBanks.Count == 0) { bool wasValid = eventCache.StringsBankWriteTime != DateTime.MinValue; ClearCache(); if (wasValid) { UnityEngine.Debug.LogError(String.Format("FMOD Studio: Directory {0} doesn't contain any banks. Build from the tool or check the path in the settings", defaultBankFolder)); } return; } // If we have multiple .strings.bank files find the most recent stringBanks.Sort((a, b) => File.GetLastWriteTime(b).CompareTo(File.GetLastWriteTime(a))); string stringBankPath = stringBanks[0]; // Use the string bank timestamp as a marker for the most recent build of any bank because it gets exported every time if (File.GetLastWriteTime(stringBankPath) == eventCache.StringsBankWriteTime) { countdownTimer = 1; return; } if (EditorUtils.IsFileOpenByStudio(stringBankPath)) { countdownTimer = 1; return; } FMOD.Studio.Bank stringBank = null; EditorUtils.CheckResult(EditorUtils.System.loadBankFile(stringBankPath, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out stringBank)); if (stringBank == null) { countdownTimer = 1; return; } // Iterate every string in the strings bank and look for any that identify banks int stringCount; stringBank.getStringCount(out stringCount); List <string> bankFileNames = new List <string>(); for (int stringIndex = 0; stringIndex < stringCount; stringIndex++) { string currentString; Guid currentGuid; stringBank.getStringInfo(stringIndex, out currentGuid, out currentString); const string BankPrefix = "bank:/"; int BankPrefixLength = BankPrefix.Length; if (currentString.StartsWith(BankPrefix)) { string bankFileName = currentString.Substring(BankPrefixLength) + "." + BankExtension; if (!bankFileName.Contains(StringBankExtension)) // filter out the strings bank { bankFileNames.Add(bankFileName); } } } // Unload the strings bank stringBank.unload(); // Check if any of the files are still being written by studio foreach (string bankFileName in bankFileNames) { string bankPath = Path.Combine(defaultBankFolder, bankFileName); if (!File.Exists(bankPath)) { countdownTimer = 1; return; } EditorBankRef bankRef = eventCache.EditorBanks.Find((x) => bankPath == x.Path); if (bankRef == null) { if (EditorUtils.IsFileOpenByStudio(bankPath)) { countdownTimer = 1; return; } continue; } if (bankRef.LastModified != File.GetLastWriteTime(bankPath)) { if (EditorUtils.IsFileOpenByStudio(bankPath)) { countdownTimer = 1; return; } } } // Do one extra loop through the in-use check in case we catch studio exactly in-between updating two files. if (countdownTimer-- > 0) { return; } // All files are finished being modified by studio so update the cache // Reload the strings bank EditorUtils.CheckResult(EditorUtils.System.loadBankFile(stringBankPath, FMOD.Studio.LOAD_BANK_FLAGS.NORMAL, out stringBank)); if (stringBank == null) { ClearCache(); return; } eventCache.StringsBankWriteTime = File.GetLastWriteTime(stringBankPath); string masterBankFileName = Path.GetFileName(stringBankPath).Replace(StringBankExtension, BankExtension); AssetDatabase.StartAssetEditing(); eventCache.EditorBanks.ForEach((x) => x.Exists = false); foreach (string bankFileName in bankFileNames) { string bankPath = Path.Combine(defaultBankFolder, bankFileName); EditorBankRef bankRef = eventCache.EditorBanks.Find((x) => bankPath == x.Path); // New bank we've never seen before if (bankRef == null) { bankRef = ScriptableObject.CreateInstance <EditorBankRef>(); AssetDatabase.AddObjectToAsset(bankRef, eventCache); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(bankRef)); bankRef.Path = bankPath; bankRef.LastModified = DateTime.MinValue; bankRef.FileSizes = new List <EditorBankRef.NameValuePair>(); eventCache.EditorBanks.Add(bankRef); } bankRef.Exists = true; // Timestamp check - if it doesn't match update events from that bank if (bankRef.LastModified != File.GetLastWriteTime(bankPath)) { bankRef.LastModified = File.GetLastWriteTime(bankPath); UpdateCacheBank(bankRef); } // Update file sizes bankRef.FileSizes.Clear(); for (int i = 0; i < bankPlatforms.Length; i++) { string platformBankPath = Path.Combine(bankFolders[i], bankFileName); var fileInfo = new FileInfo(platformBankPath); if (fileInfo.Exists) { bankRef.FileSizes.Add(new EditorBankRef.NameValuePair(bankPlatforms[i], fileInfo.Length)); } } if (bankFileName == masterBankFileName) { eventCache.MasterBankRef = bankRef; } } // Unload the strings bank stringBank.unload(); // Remove any stale entries from bank and event lists eventCache.EditorBanks.FindAll((x) => !x.Exists).ForEach(RemoveCacheBank); eventCache.EditorBanks.RemoveAll((x) => !x.Exists); eventCache.EditorEvents.RemoveAll((x) => x.Banks.Count == 0); OnCacheChange(); AssetDatabase.StopAssetEditing(); }
// -------- Overlay Update ---------------------- public bool IsOverlayEnabled(FMODPlatform platform) { return(GetSetting(OverlaySettings, platform, false)); }
public static void CopyToStreamingAssets() { FMODPlatform platform = EditorUtils.GetFMODPlatform(); if (platform == FMODPlatform.None) { UnityEngine.Debug.LogWarning(String.Format("FMOD Studio: copy banks for platform {0} : Unsupported platform", EditorUserBuildSettings.activeBuildTarget.ToString())); return; } string bankTargetFolder = Application.dataPath + "/StreamingAssets"; Directory.CreateDirectory(bankTargetFolder); string bankSourceFolder = EditorUtils.GetBankDirectory() + "/" + Settings.Instance.GetBankPlatform(platform); if (Path.GetFullPath(bankTargetFolder).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar).ToUpperInvariant() == Path.GetFullPath(bankSourceFolder).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar).ToUpperInvariant()) { return; } bool madeChanges = !true; try { // Clean out any stale .bank files string[] currentBankFiles = Directory.GetFiles(bankTargetFolder, "*.bank"); foreach (var bankFileName in currentBankFiles) { string bankName = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(bankFileName)); if (!eventCache.EditorBanks.Exists((x) => bankName == x.Name)) { File.Delete(bankFileName); madeChanges = true; } } // Copy over any files that don't match timestamp or size or don't exist foreach (var bankRef in eventCache.EditorBanks) { string sourcePath = bankSourceFolder + "/" + bankRef.Name + ".bank"; string targetPath = bankTargetFolder + "/" + bankRef.Name + ".bank"; FileInfo sourceInfo = new FileInfo(sourcePath); FileInfo targetInfo = new FileInfo(targetPath); if (!targetInfo.Exists || sourceInfo.Length != targetInfo.Length || sourceInfo.LastWriteTime != targetInfo.LastWriteTime) { File.Copy(sourcePath, targetPath, true); if (bankRef == eventCache.MasterBankRef) { sourcePath = bankSourceFolder + "/" + bankRef.Name + ".strings.bank"; targetPath = bankTargetFolder + "/" + bankRef.Name + ".strings.bank"; File.Copy(sourcePath, targetPath, true); } madeChanges = true; } } } catch (Exception exception) { UnityEngine.Debug.LogError(String.Format("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2}", platform.ToString(), bankSourceFolder, bankTargetFolder)); UnityEngine.Debug.LogException(exception); return; } if (madeChanges) { UnityEngine.Debug.Log(String.Format("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2} succeeded", platform.ToString(), bankSourceFolder, bankTargetFolder)); } }
public static void CopyToStreamingAssets() { FMODPlatform platform = RuntimeUtils.GetEditorFMODPlatform(); if (platform == FMODPlatform.None) { UnityEngine.Debug.LogWarning(string.Format("FMOD Studio: copy banks for platform {0} : Unsupported platform", EditorUserBuildSettings.activeBuildTarget.ToString())); return; } string bankTargetFolder = Settings.Instance.ImportType == ImportType.StreamingAssets ? Application.dataPath + "/StreamingAssets" : Application.dataPath + Path.DirectorySeparatorChar + Settings.Instance.TargetAssetPath; Directory.CreateDirectory(bankTargetFolder); string bankTargetExension = Settings.Instance.ImportType == ImportType.StreamingAssets ? "bank" : "bytes"; string bankSourceFolder = EditorUtils.GetBankDirectory() + Path.DirectorySeparatorChar + Settings.Instance.GetBankPlatform(platform); if (Path.GetFullPath(bankTargetFolder).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar).ToUpperInvariant() == Path.GetFullPath(bankSourceFolder).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar).ToUpperInvariant()) { return; } bool madeChanges = false; try { // Clean out any stale .bank files string[] currentBankFiles = Directory.GetFiles(bankTargetFolder, "*." + bankTargetExension, SearchOption.AllDirectories); foreach (var bankFileName in currentBankFiles) { string bankName = Path.GetFileNameWithoutExtension(bankFileName); if (!eventCache.EditorBanks.Exists((x) => bankName == x.Name)) { File.Delete(bankFileName); madeChanges = true; } } // Copy over any files that don't match timestamp or size or don't exist foreach (var bankRef in eventCache.EditorBanks) { var subDir = Path.GetDirectoryName(bankRef.Path).Replace(bankSourceFolder, ""); string sourcePath = bankSourceFolder + subDir + Path.DirectorySeparatorChar + bankRef.Name + ".bank"; string targetPath = bankTargetFolder + subDir + Path.DirectorySeparatorChar + bankRef.Name + "." + bankTargetExension; FileInfo sourceInfo = new FileInfo(sourcePath); FileInfo targetInfo = new FileInfo(targetPath); if (!targetInfo.Exists || sourceInfo.Length != targetInfo.Length || sourceInfo.LastWriteTime != targetInfo.LastWriteTime) { if (!targetInfo.Directory.Exists) { targetInfo.Directory.Create(); } else if (targetInfo.Exists) { targetInfo.IsReadOnly = false; } File.Copy(sourcePath, targetPath, true); targetInfo = new FileInfo(targetPath); targetInfo.IsReadOnly = false; targetInfo.LastWriteTime = sourceInfo.LastWriteTime; madeChanges = true; } } } catch (Exception exception) { // UnityEngine.Debug.LogError(string.Format("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2}", platform.ToString(), bankSourceFolder, bankTargetFolder)); // UnityEngine.Debug.LogException(exception); return; } if (madeChanges) { AssetDatabase.Refresh(); UnityEngine.Debug.Log(string.Format("FMOD Studio: copy banks for platform {0} : copying banks from {1} to {2} succeeded", platform.ToString(), bankSourceFolder, bankTargetFolder)); } }