private unsafe void AddActionItem(TreeViewItem parent, InputAction action, ref int id) { // Add item for action. var name = action.actionMap != null ? $"{action.actionMap.name}/{action.name}" : action.name; if (!action.enabled) { name += " (Disabled)"; } var item = AddChild(parent, name, ref id); // Grab state. var actionMap = action.GetOrCreateActionMap(); actionMap.ResolveBindingsIfNecessary(); var state = actionMap.m_State; // Add list of resolved controls. var actionIndex = action.m_ActionIndexInState; var totalBindingCount = state.totalBindingCount; for (var i = 0; i < totalBindingCount; ++i) { ref var bindingState = ref state.bindingStates[i]; if (bindingState.actionIndex != actionIndex) { continue; } var binding = state.GetBinding(i); var controlCount = bindingState.controlCount; var controlStartIndex = bindingState.controlStartIndex; for (var n = 0; n < controlCount; ++n) { var control = state.controls[controlStartIndex + n]; var interactions = StringHelpers.Join(new[] { binding.effectiveInteractions, action.interactions }, ","); var text = control.path; if (!string.IsNullOrEmpty(interactions)) { var namesAndParameters = NameAndParameters.ParseMultiple(interactions); text += " ["; text += string.Join(",", namesAndParameters.Select(x => x.name)); text += "]"; } AddChild(item, text, ref id); } }