using System; using UnityEngine; namespace Rewired.Demos; [AddComponentMenu("")] public class CustomControllerDemo : MonoBehaviour { public int playerId; public string controllerTag; public bool useUpdateCallbacks; private int buttonCount; private int axisCount; private float[] axisValues; private bool[] buttonValues; private TouchJoystickExample[] joysticks; private TouchButtonExample[] buttons; private CustomController controller; [NonSerialized] private bool initialized; private void Awake() { ScreenOrientation screenOrientation = ScreenOrientation.LandscapeLeft; if (SystemInfo.deviceType == DeviceType.Handheld && Screen.orientation != screenOrientation) { Screen.orientation = screenOrientation; } Initialize(); } private void Initialize() { ReInput.InputSourceUpdateEvent += OnInputSourceUpdate; joysticks = GetComponentsInChildren(); buttons = GetComponentsInChildren(); axisCount = joysticks.Length * 2; buttonCount = buttons.Length; axisValues = new float[axisCount]; buttonValues = new bool[buttonCount]; Player player = ReInput.players.GetPlayer(playerId); controller = player.controllers.GetControllerWithTag(controllerTag); if (controller == null) { Debug.LogError("A matching controller was not found for tag \"" + controllerTag + "\""); } if (controller.buttonCount != buttonValues.Length || controller.axisCount != axisValues.Length) { Debug.LogError("Controller has wrong number of elements!"); } if (useUpdateCallbacks && controller != null) { controller.SetAxisUpdateCallback(GetAxisValueCallback); controller.SetButtonUpdateCallback(GetButtonValueCallback); } initialized = true; } private void Update() { if (ReInput.isReady && !initialized) { Initialize(); } } private void OnInputSourceUpdate() { GetSourceAxisValues(); GetSourceButtonValues(); if (!useUpdateCallbacks) { SetControllerAxisValues(); SetControllerButtonValues(); } } private void GetSourceAxisValues() { for (int i = 0; i < axisValues.Length; i++) { if (i % 2 != 0) { axisValues[i] = joysticks[i / 2].position.y; } else { axisValues[i] = joysticks[i / 2].position.x; } } } private void GetSourceButtonValues() { for (int i = 0; i < buttonValues.Length; i++) { buttonValues[i] = buttons[i].isPressed; } } private void SetControllerAxisValues() { for (int i = 0; i < axisValues.Length; i++) { controller.SetAxisValue(i, axisValues[i]); } } private void SetControllerButtonValues() { for (int i = 0; i < buttonValues.Length; i++) { controller.SetButtonValue(i, buttonValues[i]); } } private float GetAxisValueCallback(int index) { if (index >= axisValues.Length) { return 0f; } return axisValues[index]; } private bool GetButtonValueCallback(int index) { if (index >= buttonValues.Length) { return false; } return buttonValues[index]; } }