Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace Edia.XR {
/// <summary>In order to be flexible for each Xblock, the remapping of a controller key to a method is a separate script</summary>
[System.Serializable]
[AddComponentMenu("EDIA/XR Remap Controller Input")]
public class XRControllerInputRemapper : MonoBehaviour {
public class XRControllerInputRemapperNew : MonoBehaviour {

// TODO Allow multiple input actions to one ID
// TODO Input remapping should take systems 'allowed interaction' into considiration
Expand All @@ -19,13 +19,23 @@ public class ControllerInputRemap {
public bool isEnabled = false;
public InputActionReference inputActionSubmit;
public UnityEvent<InputAction.CallbackContext> methodToCall;

internal bool isSubscribed = false;
}

public List<ControllerInputRemap> Redirectors = new List<ControllerInputRemap>();

private void Start() {
private void OnEnable() {
foreach (ControllerInputRemap r in Redirectors) {
if (r.isEnabled) {
Subscribe(r);
}
}
}

private void OnDisable() {
foreach (ControllerInputRemap r in Redirectors) {
EnableRemapping(r.id, r.isEnabled);
Unsubscribe(r);
}
}

Expand All @@ -43,10 +53,28 @@ public List<string> GetControllerRemappings () {
/// <param name="onOff">active</param>
public void EnableRemapping (string id, bool onOff) {
int index = Redirectors.FindIndex(x => x.id == id);
if (index < 0) return;

Redirectors[index].isEnabled = onOff;

if (onOff) Redirectors[index].inputActionSubmit.action.performed += Redirectors[index].methodToCall.Invoke;
else Redirectors[index].inputActionSubmit.action.performed -= Redirectors[index].methodToCall.Invoke;
if (onOff) Subscribe(Redirectors[index]);
else Unsubscribe(Redirectors[index]);
}

private void Subscribe(ControllerInputRemap r) {
if (r.isSubscribed || r.inputActionSubmit == null || r.inputActionSubmit.action == null) return;

r.inputActionSubmit.action.Enable();
r.inputActionSubmit.action.performed += r.methodToCall.Invoke;
r.isSubscribed = true;
}

private void Unsubscribe(ControllerInputRemap r) {
if (!r.isSubscribed || r.inputActionSubmit == null || r.inputActionSubmit.action == null) return;

r.inputActionSubmit.action.performed -= r.methodToCall.Invoke;
// Note: We don't disable the action here as other components might be using the same InputActionReference
r.isSubscribed = false;
}
}
}