public static void CleanBindings(bool verbose = false) { SteamVR_Input.InitializeFile(true); SteamVR_Input_ActionFile currentActionsFile = SteamVR_Input.actionFile; for (int localizationIndex = 0; localizationIndex < currentActionsFile.localization.Count; localizationIndex++) { Dictionary <string, string> dictionary = currentActionsFile.localization[localizationIndex]; bool removed; do { removed = false; string missingAction = null; foreach (string key in dictionary.Keys) { if (key == SteamVR_Input_ActionFile_LocalizationItem.languageTagKeyName) { continue; } if (currentActionsFile.actions.Any(action => string.Equals(action.name, key, StringComparison.CurrentCultureIgnoreCase)) == false) { missingAction = key; } } if (missingAction != null) { removed = true; dictionary.Remove(missingAction); if (verbose) { Debug.Log("<b>[SteamVR Input]</b> Removing localization entry for: " + missingAction); } } } while (removed); } for (int bindingIndex = 0; bindingIndex < currentActionsFile.default_bindings.Count; bindingIndex++) { SteamVR_Input_ActionFile_DefaultBinding currentBinding = currentActionsFile.default_bindings[bindingIndex]; string bindingPath = Path.Combine(SteamVR_Input.GetActionsFileFolder(), currentBinding.binding_url); if (File.Exists(bindingPath) == false) { if (verbose) { Debug.Log("<b>[SteamVR Input]</b> Removing binding entry for missing file: '" + currentBinding.controller_type + "' at: " + bindingPath); } currentActionsFile.default_bindings.RemoveAt(bindingIndex); bindingIndex--; continue; } SteamVR_Input_BindingFile bindingFile = GetBindingFileObject(bindingPath); if (bindingFile == null) { Debug.LogError("<b>[SteamVR Input]</b> Error parsing binding file for: '" + currentBinding.controller_type + "' at: " + bindingPath); continue; } int changed = 0; foreach (var actionList in bindingFile.bindings) { for (int itemIndex = 0; itemIndex < actionList.Value.chords.Count; itemIndex++) { string outputActionPath = actionList.Value.chords[itemIndex].output; if (currentActionsFile.actions.Any(action => string.Equals(action.name, outputActionPath, StringComparison.CurrentCultureIgnoreCase)) == false) { if (verbose) { Debug.Log("<b>[SteamVR Input]</b> " + currentBinding.controller_type + ": Removing chord binding for action: " + outputActionPath); } actionList.Value.chords.RemoveAt(itemIndex); itemIndex--; changed++; } } for (int itemIndex = 0; itemIndex < actionList.Value.haptics.Count; itemIndex++) { string outputActionPath = actionList.Value.haptics[itemIndex].output; if (currentActionsFile.actions.Any(action => string.Equals(action.name, outputActionPath, StringComparison.CurrentCultureIgnoreCase)) == false) { if (verbose) { Debug.Log("<b>[SteamVR Input]</b> " + currentBinding.controller_type + ": Removing haptics binding for action: " + outputActionPath); } actionList.Value.haptics.RemoveAt(itemIndex); itemIndex--; changed++; } } for (int itemIndex = 0; itemIndex < actionList.Value.poses.Count; itemIndex++) { string outputActionPath = actionList.Value.poses[itemIndex].output; if (currentActionsFile.actions.Any(action => string.Equals(action.name, outputActionPath, StringComparison.CurrentCultureIgnoreCase)) == false) { if (verbose) { Debug.Log("<b>[SteamVR Input]</b> " + currentBinding.controller_type + ": Removing pose binding for action: " + outputActionPath); } actionList.Value.poses.RemoveAt(itemIndex); itemIndex--; changed++; } } for (int itemIndex = 0; itemIndex < actionList.Value.skeleton.Count; itemIndex++) { string outputActionPath = actionList.Value.skeleton[itemIndex].output; if (currentActionsFile.actions.Any(action => string.Equals(action.name, outputActionPath, StringComparison.CurrentCultureIgnoreCase)) == false) { if (verbose) { Debug.Log("<b>[SteamVR Input]</b> " + currentBinding.controller_type + ": Removing skeleton binding for action: " + outputActionPath); } actionList.Value.skeleton.RemoveAt(itemIndex); itemIndex--; changed++; } } for (int itemIndex = 0; itemIndex < actionList.Value.sources.Count; itemIndex++) { string outputActionPath = actionList.Value.sources[itemIndex].GetOutput(); if (currentActionsFile.actions.Any(action => string.Equals(action.name, outputActionPath, StringComparison.CurrentCultureIgnoreCase)) == false) { if (verbose) { Debug.Log("<b>[SteamVR Input]</b> " + currentBinding.controller_type + ": Removing source binding for action: " + outputActionPath); } actionList.Value.sources.RemoveAt(itemIndex); itemIndex--; changed++; } } } if (changed > 0) { WriteBindingFileObject(bindingFile, bindingPath); } } if (SteamVR_Input.HasFileInMemoryBeenModified()) { SteamVR_Input.actionFile.Save(SteamVR_Input.GetActionsFilePath()); if (verbose) { Debug.Log("<b>[SteamVR Input]</b> Saved new actions file: " + SteamVR_Input.GetActionsFilePath()); } } }