From 52578c3c67161e010320b8b357628fc27e07b25f Mon Sep 17 00:00:00 2001 From: drifio Date: Wed, 8 Jun 2016 21:11:04 +0100 Subject: [PATCH] feat(Controller): disable walking per controller Adds a property that allows you to toggle whether or not the left or right controller will allow walking. --- .../Scripts/VRTK_TouchpadWalking.cs | 80 ++++++++++++++++--- README.md | 6 ++ 2 files changed, 74 insertions(+), 12 deletions(-) diff --git a/Assets/SteamVR_Unity_Toolkit/Scripts/VRTK_TouchpadWalking.cs b/Assets/SteamVR_Unity_Toolkit/Scripts/VRTK_TouchpadWalking.cs index e399a9f37..b43f2de56 100644 --- a/Assets/SteamVR_Unity_Toolkit/Scripts/VRTK_TouchpadWalking.cs +++ b/Assets/SteamVR_Unity_Toolkit/Scripts/VRTK_TouchpadWalking.cs @@ -1,14 +1,46 @@ using UnityEngine; using System.Collections; -public class VRTK_TouchpadWalking : MonoBehaviour { +public class VRTK_TouchpadWalking : MonoBehaviour +{ + [SerializeField] + private bool leftController = true; + public bool LeftController + { + get { return leftController; } + set + { + leftController = value; + SetControllerListeners(controllerManager.left); + } + } + + [SerializeField] + private bool rightController = true; + public bool RightController + { + get { return rightController; } + set + { + rightController = value; + SetControllerListeners(controllerManager.right); + } + } + public float maxWalkSpeed = 3f; public float deceleration = 0.1f; + private SteamVR_ControllerManager controllerManager; private Vector2 touchAxis; private float movementSpeed = 0f; private float strafeSpeed = 0f; + private bool leftSubscribed; + private bool rightSubscribed; + + private ControllerClickedEventHandler touchpadAxisChanged; + private ControllerClickedEventHandler touchpadUntouched; + private VRTK_PlayerPresence playerPresence; private void Awake() @@ -21,14 +53,21 @@ private void Awake() { Debug.LogError("The VRTK_TouchpadWalking script requires the VRTK_PlayerPresence script to be attached to the [CameraRig]"); } + + touchpadAxisChanged = new ControllerClickedEventHandler(DoTouchpadAxisChanged); + touchpadUntouched = new ControllerClickedEventHandler(DoTouchpadUntouched); + + controllerManager = this.GetComponent(); } - private void Start () { + private void Start () + { this.name = "PlayerObject_" + this.name; var controllerManager = GameObject.FindObjectOfType(); - InitControllerListeners(controllerManager.left); - InitControllerListeners(controllerManager.right); + + SetControllerListeners(controllerManager.left); + SetControllerListeners(controllerManager.right); } private void DoTouchpadAxisChanged(object sender, ControllerClickedEventArgs e) @@ -91,16 +130,33 @@ private void FixedUpdate() Move(); } - private void InitControllerListeners(GameObject controller) + private void SetControllerListeners(GameObject controller) + { + if (controller && controller == controllerManager.left) + { + ToggleControllerListeners(controller, leftController, ref leftSubscribed); + } + else if (controller && controller == controllerManager.right) + { + ToggleControllerListeners(controller, rightController, ref rightSubscribed); + } + } + + private void ToggleControllerListeners(GameObject controller, bool toggle, ref bool subscribed) { - if (controller) + var controllerEvent = controller.GetComponent(); + if (controllerEvent && toggle && !subscribed) + { + controllerEvent.TouchpadAxisChanged += touchpadAxisChanged; + controllerEvent.TouchpadUntouched += touchpadUntouched; + subscribed = true; + } + else if (controllerEvent && !toggle && subscribed) { - var controllerEvent = controller.GetComponent(); - if (controllerEvent) - { - controllerEvent.TouchpadAxisChanged += new ControllerClickedEventHandler(DoTouchpadAxisChanged); - controllerEvent.TouchpadUntouched += new ControllerClickedEventHandler(DoTouchpadUntouched); - } + controllerEvent.TouchpadAxisChanged -= touchpadAxisChanged; + controllerEvent.TouchpadUntouched -= touchpadUntouched; + touchAxis = Vector2.zero; + subscribed = false; } } } \ No newline at end of file diff --git a/README.md b/README.md index 0933b9ff1..9c728a10a 100644 --- a/README.md +++ b/README.md @@ -602,6 +602,12 @@ immersion but the user is doing something that isn't natural. The following script parameters are available: + * **Left Controller:** If this is checked then the left controller + touchpad will be enabled to move the play area. It can also be + toggled at runtime. + * **Right Controller:** If this is checked then the right controller + touchpad will be enabled to move the play area. It can also be + toggled at runtime. * **Max Walk Speed:** The maximum speed the play area will be moved when the touchpad is being touched at the extremes of the axis. If a lower part of the touchpad axis is touched (nearer the centre)