Skip to content

Commit 916ff0e

Browse files
committed
changing priority needs to force sorting of monitors
1 parent 5898640 commit 916ff0e

2 files changed

Lines changed: 57 additions & 1 deletion

File tree

Packages/com.unity.inputsystem/InputSystem/Actions/InputAction.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,14 @@ public sealed class InputAction : ICloneable, IDisposable
210210
public int Priority
211211
{
212212
get => m_Priority;
213-
set => m_Priority = value;
213+
set
214+
{
215+
if (m_Priority == value)
216+
return;
217+
218+
m_Priority = value;
219+
m_ActionMap?.m_State?.OnActionPriorityChanged(this);
220+
}
214221
}
215222

216223
/// <summary>

Packages/com.unity.inputsystem/InputSystem/Actions/InputActionState.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,55 @@ private void EnableControls(InputAction action)
10351035
}
10361036
}
10371037

1038+
internal void OnActionPriorityChanged(InputAction action)
1039+
{
1040+
Debug.Assert(action != null, "Action must not be null");
1041+
Debug.Assert(action.m_ActionMap != null, "Action must have action map");
1042+
1043+
if (action == null || action.m_ActionMap == null)
1044+
return;
1045+
1046+
var actionIndex = action.m_ActionIndexInState;
1047+
if (actionIndex < 0 || actionIndex >= totalActionCount)
1048+
return;
1049+
1050+
var map = action.m_ActionMap;
1051+
var mapIndex = map.m_MapIndexInState;
1052+
if (mapIndex < 0 || mapIndex >= totalMapCount)
1053+
return;
1054+
1055+
var clampedPriority = (ushort)Math.Clamp(action.Priority, 0, ushort.MaxValue);
1056+
var manager = InputSystem.manager;
1057+
var bindingStartIndex = mapIndices[mapIndex].bindingStartIndex;
1058+
var bindingCount = mapIndices[mapIndex].bindingCount;
1059+
var bindingStatesPtr = memory.bindingStates;
1060+
1061+
for (var i = 0; i < bindingCount; ++i)
1062+
{
1063+
var bindingIndex = bindingStartIndex + i;
1064+
var bindingState = &bindingStatesPtr[bindingIndex];
1065+
if (bindingState->actionIndex != actionIndex || bindingState->isPartOfComposite)
1066+
continue;
1067+
1068+
var controlCount = bindingState->controlCount;
1069+
if (controlCount == 0)
1070+
continue;
1071+
1072+
for (var n = 0; n < controlCount; ++n)
1073+
{
1074+
var controlIndex = bindingState->controlStartIndex + n;
1075+
controlGroupingAndPriority[controlIndex * 2 + 1] = clampedPriority;
1076+
1077+
if (!IsControlEnabled(controlIndex))
1078+
continue;
1079+
1080+
var mapControlAndBindingIndex = ToCombinedMapAndControlAndBindingIndex(mapIndex, controlIndex, bindingIndex);
1081+
manager.RemoveStateChangeMonitor(controls[controlIndex], this, mapControlAndBindingIndex);
1082+
manager.AddStateChangeMonitor(controls[controlIndex], this, mapControlAndBindingIndex, controlGroupingAndPriority[controlIndex * 2]);
1083+
}
1084+
}
1085+
}
1086+
10381087
public void DisableAllActions(InputActionMap map)
10391088
{
10401089
Debug.Assert(map != null, "Map must not be null");

0 commit comments

Comments
 (0)