using UnityEngine; namespace Passer { public enum GameControllers { Generic, Xbox, PS4, Steelseries, GameSmart, Oculus, OpenVR, #if hDAYDREAM && UNITY_ANDROID Daydream #endif } /// Controller input for all controllers /// Max 4 controllers are supports public static class Controllers { private static int maxControllers = 4; /// Array containing all controllers public static Controller[] controllers; /// Update the current values of the controller input public static void Update() { if (controllers != null) { for (int i = 0; i < controllers.Length; i++) { if (controllers[i] != null) controllers[i].Update(); } } } /// Retrieves a controller and creates it when it is first accessed /// The index of the controller public static Controller GetController(int controllerID) { if (controllers == null) controllers = new Controller[maxControllers]; if (controllers[controllerID] == null) controllers[controllerID] = new Controller(); return controllers[controllerID]; } /// Reset the values of all buttons public static void Clear() { if (controllers != null) { for (int i = 0; i < controllers.Length; i++) { if (controllers[i] != null) controllers[i].Clear(); } } } /// Called at the end of the frame to indicate that new controller values can be read public static void EndFrame() { if (controllers != null) { for (int i = 0; i < controllers.Length; i++) if (controllers[i] != null) controllers[i].EndFrame(); } } } /// Controller input for a single controller public class Controller { /// Identification for the left or right side of the controller public enum Side { Left, Right } /// Button identification values public enum Button { ButtonOne = 0, ButtonTwo = 1, ButtonThree = 2, ButtonFour = 3, Bumper = 10, BumperTouch = 11, Trigger = 12, TriggerTouch = 13, StickButton = 14, StickTouch = 15, //Up = 20, //Down = 21, //Left = 22, //Right = 23, Option = 30, None = 9999 } /// The left side of the controller public ControllerSide left; /// The right side of the controller public ControllerSide right; /// Update the current values of the controller input public void Update() { left.Update(); right.Update(); } /// Constructor for access to the controller input public Controller() { left = new ControllerSide(); right = new ControllerSide(); } private bool cleared; /// Reset the values of all buttons public void Clear() { if (cleared) return; cleared = true; left.Clear(); right.Clear(); } /// Called at the end of the frame to indicate that new controller values can be read public void EndFrame() { cleared = false; } /// Retrieve the pressed state of a button /// The identification of the side of the controller /// The identification of the requested button public bool GetButton(Side side, Button buttonID) { switch (side) { case Side.Left: return left.GetButton(buttonID); case Side.Right: return right.GetButton(buttonID); default: return false; } } } /// Controller input for the left or right side of the controller (pair) public class ControllerSide { /// The vertical value of the thumbstick /// Values: -1..1 public float stickHorizontal; /// The horizontal value of the thumbstick /// Values: -1..1 public float stickVertical; /// The pressed state of the thumbstick public bool stickButton; /// The touched state of the thumbstick public bool stickTouch; /// The vertical value of the touchpad /// Values: -1..1 public float touchpadVertical; /// The horizontal value of the touchpad /// Values: -1..1 public float touchpadHorizontal; /// The pressed state of the touchpad public bool touchpadPress; /// The touched state of the touchpad public bool touchpadTouch; /// The pressed state of genertic buttons /// There can be up to 4 generic buttons. /// buttons[0] usually mathes the default fire button public bool[] buttons = new bool[4]; /// The value of the first trigger /// Values: 0..1 /// The first trigger is normally operated with the index finger public float trigger1; /// The value of the second trigger /// Values: 0..1 /// The second trigger is normally operated with the middle finger public float trigger2; /// The pressed state of the option button /// The option button is usually a special button for accessing a specific menu public bool option; /// Event for handling Button down events public event OnButtonDown OnButtonDownEvent; /// Event for handling Button up events public event OnButtonUp OnButtonUpEvent; /// Function for processing button down events /// The idetification of the pressed button public delegate void OnButtonDown(Controller.Button buttonNr); /// Function for processing button up events /// The identification of the released button public delegate void OnButtonUp(Controller.Button buttonNr); private bool[] lastButtons = new bool[4]; private bool lastBumper; private bool lastTrigger; private bool lastStickButton; private bool lastOption; /// Update the current values of the controller input public void Update() { for (int i = 0; i < 4; i++) { if (buttons[i] && !lastButtons[i]) { if (OnButtonDownEvent != null) OnButtonDownEvent((Controller.Button) i); } else if (!buttons[i] && lastButtons[i]) { if (OnButtonUpEvent != null) OnButtonUpEvent((Controller.Button) i); } lastButtons[i] = buttons[i]; } if (trigger1 > 0.9F && !lastBumper) { if (OnButtonDownEvent != null) OnButtonDownEvent(Controller.Button.Bumper); lastBumper = true; } else if (trigger1 < 0.1F && lastBumper) { if (OnButtonUpEvent != null) OnButtonUpEvent(Controller.Button.Bumper); lastBumper = false; } if (trigger2 > 0.9F && !lastTrigger) { if (OnButtonDownEvent != null) OnButtonDownEvent(Controller.Button.Trigger); lastTrigger = true; } else if (trigger2 < 0.1F && lastTrigger) { if (OnButtonUpEvent != null) OnButtonUpEvent(Controller.Button.Trigger); lastTrigger = false; } if (stickButton && !lastStickButton) { if (OnButtonDownEvent != null) OnButtonDownEvent(Controller.Button.StickButton); } else if (!stickButton && lastStickButton) { if (OnButtonUpEvent != null) OnButtonUpEvent(Controller.Button.StickButton); } lastStickButton = stickButton; if (option && !lastOption) { if (OnButtonDownEvent != null) OnButtonDownEvent(Controller.Button.Option); } else if (!option && lastOption) { if (OnButtonUpEvent != null) OnButtonUpEvent(Controller.Button.Option); } lastOption = option; } /// Reset the values of all buttons public void Clear() { stickHorizontal = 0; stickVertical = 0; stickButton = false; stickTouch = false; touchpadHorizontal = 0; touchpadVertical = 0; touchpadPress = false; touchpadTouch = false; for (int i = 0; i < 4; i++) buttons[i] = false; trigger1 = 0; trigger2 = 0; option = false; } /// Retrieve the pressed state of a button /// The identification of the requested button public bool GetButton(Controller.Button buttonID) { switch (buttonID) { case Controller.Button.ButtonOne: return buttons[0]; case Controller.Button.ButtonTwo: return buttons[1]; case Controller.Button.ButtonThree: return buttons[2]; case Controller.Button.ButtonFour: return buttons[3]; case Controller.Button.Bumper: return trigger1 > 0.9F; case Controller.Button.Trigger: return trigger2 > 0.9F; case Controller.Button.StickButton: return stickButton; case Controller.Button.StickTouch: return stickTouch; case Controller.Button.Option: return option; default: return false; } } } }