This file provides documentation on how to use the included prefabs and scripts along with a breakdown of the example scenes.
A collection of pre-defined usable prefabs have been included to allow for each drag-and-drop set up of common elements.
- Frames Per Second Canvas
- Object Tooltip
- Controller Tooltips
- Radial Menu
- Independent Radial Menu Controller
- Console Viewer Canvas
This canvas adds a frames per second text element to the headset. To use the prefab it must be placed into the scene then the headset camera needs attaching to the canvas:
- Select
FramesPerSecondCanvas
object from the scene objects - Find the
Canvas
component - Set the
Render Camera
parameter toCamera(eye)
which can be found in the[CameraRig]
prefab.
This script is pretty much a copy and paste from the script at: http://talesfromtherift.com/vr-fps-counter/ So all credit to Peter Koch for his work. Twitter: @peterept
- Display FPS: Toggles whether the FPS text is visible.
- Target FPS: The frames per second deemed acceptable that is used as the benchmark to change the FPS text colour.
- Font Size: The size of the font the FPS is displayed in.
- Position: The position of the FPS text within the headset view.
- Good Color: The colour of the FPS text when the frames per second are within reasonable limits of the Target FPS.
- Warn Color: The colour of the FPS text when the frames per second are falling short of reasonable limits of the Target FPS.
- Bad Color: The colour of the FPS text when the frames per second are at an unreasonable level of the Target FPS.
VRTK/Examples/018_CameraRig_FramesPerSecondCounter
displays the frames per second in the centre of the headset view. Pressing the trigger generates a new sphere and pressing the touchpad generates ten new spheres. Eventually when lots of spheres are present the FPS will drop and demonstrate the prefab.
This adds a UI element into the World Space that can be used to provide additional information about an object by providing a piece of text with a line drawn to a destination point.
There are a number of parameters that can be set on the Prefab which are provided by the VRTK/Scripts/VRTK_ObjectTooltip
script which is applied to the prefab.
- Display Text: The text that is displayed on the tooltip.
- Font Size: The size of the text that is displayed.
- Draw Line From: An optional transform of where to start drawing the line from. If one is not provided the centre of the tooltip is used for the initial line position.
- Draw Line To: A transform of another object in the scene that a line will be drawn from the tooltip to, this helps denote what the tooltip is in relation to. If no transform is provided and the tooltip is a child of another object, then the parent object's transform will be used as this destination position.
- Line Width: The width of the line drawn between the tooltip and the destination transform.
- Font Color: The colour to use for the text on the tooltip.
- Container Color: The colour to use for the background container of the tooltip.
- Line Color: The colour to use for the line drawn between the tooltip and the destination transform.
public void Reset()
- Parameters
- none
- Returns
- none
The Reset method resets the tooltip back to its initial state
VRTK/Examples/029_Controller_Tooltips
displays two cubes that have an object tooltip added to them along with tooltips that have been added to the controllers.
This adds a collection of Object Tooltips to the Controller that give information on what the main controller buttons may do. To add the prefab, it just needs to be added as a child of the relevant controller e.g. [CameraRig]/Controller (right)
would add the controller tooltips to the right controller.
If the transforms for the buttons are not provided, then the script will attempt to find the attach transforms on the default controller model in the [CameraRig]
prefab.
If no text is provided for one of the elements then the tooltip for that element will be set to disabled.
There are a number of parameters that can be set on the Prefab which are provided by the VRTK/Scripts/VRTK_ControllerTooltips
script which is applied to the prefab.
- Trigger Text: The text to display for the trigger button action.
- Grip Text: The text to display for the grip button action.
- Touchpad Text: The text to display for the touchpad action.
- App Menu Text: The text to display for the application menu button action.
- Tip Background Color: The colour to use for the tooltip background container.
- Tip Text Color: The colour to use for the text within the tooltip.
- Tip Line Color: The colour to use for the line between the tooltip and the relevant controller button.
- Trigger: The transform for the position of the trigger button on the controller (this is usually found in
Model/trigger/attach
. - Grip: The transform for the position of the grip button on the controller (this is usually found in
Model/lgrip/attach
. - Touchpad: The transform for the position of the touchpad button on the controller (this is usually found in
Model/trackpad/attach
. - App Menu: The transform for the position of the app menu button on the controller (this is usually found in
Model/button/attach
.
public void ToggleTips(bool state, TooltipButtons element = TooltipButtons.None)
- Parameters
bool state
- The state of whether to display or hide the controller tooltips, true will display and false will hide.TooltipButtons element
- The specific element to hide the tooltip on, if it isTooltipButtons.None
then it will hide all tooltips. Optional parameter defaults toTooltipButtons.None
- Returns
- none
The ToggleTips method will display the controller tooltips if the state is true
and will hide the controller tooltips if the state is false
. An optional element
can be passed to target a specific controller tooltip to toggle otherwise all tooltips are toggled.
VRTK/Examples/029_Controller_Tooltips
displays two cubes that have an object tooltip added to them along with tooltips that have been added to the controllers.
This adds a UI element into the world space that can be dropped into a Controller object and used to create and use Radial Menus from the touchpad.
If the RadialMenu is placed inside a controller, it will automatically find a VRTK_ControllerEvents
in its parent to use at the input. However, a VRTK_ControllerEvents
can be defined explicitly by setting the Events
parameter of the Radial Menu Controller
script also attached to the prefab.
The RadialMenu can also be placed inside a VRTK_InteractableObject
for the RadialMenu to be anchored to a world object instead of the controller. The Events Manager
parameter will automatically be set if the RadialMenu is a child of an InteractableObject, but it can also be set manually in the inspector. Additionally, for the RadialMenu to be anchored in the world, the RadialMenuController
script in the prefab must be replaced with VRTK_IndependentRadialMenuController
. See the script information for further details on making the RadialMenu independent of the controllers.
- Buttons: An array of Buttons that define the interactive buttons required to be displayed as part of the radial menu.
- Button Prefab: The base for each button in the menu, by default set to a dynamic circle arc that will fill up a portion of the menu.
- Button Thickness: Percentage of the menu the buttons should fill, 1.0 is a pie slice, 0.1 is a thin ring.
- Button Color: The background colour of the buttons, default is white.
- Offset Distance: The distance the buttons should move away from the centre. This creates space between the individual buttons.
- Offset Rotation: The additional rotation of the Radial Menu.
- Rotate Icons: Whether button icons should rotate according to their arc or be vertical compared to the controller.
- Icon Margin: The margin in pixels that the icon should keep within the button.
- Is Shown: Whether the buttons are shown
- Hide On Release: Whether the buttons should be visible when not in use.
- Execute On Unclick: Whether the button action should happen when the button is released, as opposed to happening immediately when the button is pressed.
- Base Haptic Strength: The base strength of the haptic pulses when the selected button is changed, or a button is pressed. Set to zero to disable.
- Menu Buttons: The actual GameObjects that make up the radial menu.
VRTK/Examples/030_Controls_RadialTouchpadMenu
displays a radial menu for each controller. The left controller uses the Hide On Release
variable, so it will only be visible if the left touchpad is being touched. It also uses the Execute On Unclick
variable to delay execution until the touchpad button is unclicked. The example scene also contains a demonstration of anchoring the RadialMenu to an interactable cube instead of a controller.
extends RadialMenuController
This script inherited from RadialMenuController
and therefore can be used instead of RadialMenuController
to allow the RadialMenu to be anchored to any object, not just a controller. The RadialMenu will show when a controller is near the object and the buttons can be clicked with the Use Alias
button. The menu also automatically rotates towards the user.
To convert the default RadialMenu
prefab to be independent of the controllers:
- Make the
RadialMenu
a child of an object other than a controller. - Position and scale the menu by adjusting the transform of the
RadialMenu
empty. - Replace
RadialMenuController
withVRTK_IndependentRadialMenuController
. - Ensure the parent object has the
VRTK_InteractableObject
script. - Verify that
Is Usable
andHold Button to Use
are both checked. - Attach
VRTK_InteractTouch
andVRTK_InteractUse
scripts to the controllers.
- Events Manager: If the RadialMenu is the child of an object with VRTK_InteractableObject attached, this will be automatically obtained. It can also be manually set.
- Add Menu Collider: Whether or not the script should dynamically add a SphereCollider to surround the menu.
- Collider Radius Multiplier: This times the size of the RadialMenu is the size of the collider.
- Hide After Execution: If true, after a button is clicked, the RadialMenu will hide.
- Offset Multiplier: How far away from the object the menu should be placed, relative to the size of the RadialMenu.
- Rotate Towards: The object the RadialMenu should face towards. If left empty, it will automatically try to find the Headset Camera.
This canvas adds the unity console log to a world game object. To use the prefab, it simply needs to be placed into the scene and it will be visible in world space. It's also possible to child it to other objects such as the controller so it can track where the user is.
It's also recommended to use the Simple Pointer and UI Pointer on a controller to interact with the Console Viewer Canvas as it has a scrollable text area, a button to clear the log and a checkbox to toggle whether the log messages are collapsed.
- Font Size: The size of the font the log text is displayed in.
- Info Message: The colour of the text for an info log message.
- Assert Message: The colour of the text for an assertion log message.
- Warning Message: The colour of the text for a warning log message.
- Error Message: The colour of the text for an error log message.
- Exception Message: The colour of the text for an exception log message.
public void SetCollapse(bool state)
- Parameters
bool state
- The state of whether to collapse the output messages, true will collapse and false will not collapse.- Returns
- none
The SetCollapse method determines whether the console will collapse same message output into the same line. A state of true
will collapse messages and false
will print the same message for each line.
public void ClearLog()
- Parameters
- none
- Returns
- none
The ClearLog method clears the current log view of all messages
To allow for re-usability and object consistency, a collection of abstract classes are provided which can be used to extend into a concrete class providing consistent functionality across many different scripts without needing to duplicate code.
This abstract class provides the ability to emit events of destination markers within the game world. It can be useful for tagging locations for specific purposes such as teleporting.
It is utilised by the VRTK_WorldPointer
for dealing with pointer events when the pointer cursor touches areas within the game world.
- Enable Teleport: If this is checked then the teleport flag is set to true in the Destination Set event so teleport scripts will know whether to action the new destination.
DestinationMarkerEnter
- Emitted when a collision with another game object has occurred.DestinationMarkerExit
- Emitted when the collision with the other game object finishes.DestinationMarkerSet
- Emitted when the destination marker is active in the scene to determine the last destination position (useful for selecting and teleporting).
Adding the VRTK_DestinationMarker_UnityEvents
component to VRTK_DestinationMarker
object allows access to UnityEvents
that will react identically to the Class Events.
OnDestinationMarkerEnter
- Emits the DestinationMarkerEnter class event.OnDestinationMarkerExit
- Emits the DestinationMarkerExit class event.OnDestinationMarkerSet
- Emits the DestinationMarkerSet class event.
float distance
- The distance between the origin and the collided destination.Transform target
- The Transform of the collided destination object.Vector3 destinationPosition
- The world position of the destination marker.bool enableTeleport
- Whether the destination set event should trigger teleport.uint controllerIndex
- The optional index of the controller emitting the beam.
public virtual void SetInvalidTarget(string name)
- Parameters
string name
- The name of the tag or class that is the invalid target.- Returns
- none
The SetInvalidTarget method is used to set objects that contain the given tag or class matching the name as invalid destination targets.
public virtual void SetNavMeshCheckDistance(float distance)
- Parameters
float distance
- The max distance the nav mesh can be from the sample point to be valid.- Returns
- none
The SetNavMeshCheckDistance method sets the max distance the destination marker position can be from the edge of a nav mesh to be considered a valid destination.
public virtual void SetHeadsetPositionCompensation(bool state)
- Parameters
bool state
- The state of whether to take the position of the headset within the play area into account when setting the destination marker.- Returns
- none
The SetHeadsetPositionCompensation method determines whether the offset position of the headset from the centre of the play area should be taken into consideration when setting the destination marker. If true
then it will take the offset position into consideration.
extends VRTK_DestinationMarker
This abstract class provides any game pointer the ability to know the state of the implemented pointer. It extends the VRTK_DestinationMarker
to allow for destination events to be emitted when the pointer cursor collides with objects.
The World Pointer also provides a play area cursor to be displayed for all cursors that utilise this class. The play area cursor is a representation of the current calibrated play area space and is useful for visualising the potential new play area space in the game world prior to teleporting. It can also handle collisions with objects on the new play area space and prevent teleporting if there are any collisions with objects at the potential new destination.
The play area collider does not work well with terrains as they are uneven and cause collisions regularly so it is recommended that handling play area collisions is not enabled when using terrains.
- Controller: The controller that will be used to toggle the pointer. If the script is being applied onto a controller then this parameter can be left blank as it will be auto populated by the controller the script is on at runtime.
- Pointer Material: The material to use on the rendered version of the pointer. If no material is selected then the default
WorldPointer
material will be used. - Show Play Area Cursor: If this is enabled then the play area boundaries are displayed at the tip of the pointer beam in the current pointer colour.
- Play Area Cursor Dimensions: Determines the size of the play area cursor and collider. If the values are left as zero then the Play Area Cursor will be sized to the calibrated Play Area space.
- Handle Play Area Cursor Collisions: If this is ticked then if the play area cursor is colliding with any other object then the pointer colour will change to the
Pointer Miss Color
and theWorldPointerDestinationSet
event will not be triggered, which will prevent teleporting into areas where the play area will collide. - Ignore Target With Tag Or Class: A string that specifies an object Tag or the name of a Script attached to an object and notifies the play area cursor to ignore collisions with the object.
- Pointer Visibility: Determines when the pointer beam should be displayed.
- Hold Button To Activate: If this is checked then the pointer beam will be activated on first press of the pointer alias button and will stay active until the pointer alias button is pressed again. The destination set event is emitted when the beam is deactivated on the second button press.
- Activate Delay: The time in seconds to delay the pointer beam being able to be active again. Useful for preventing constant teleportation.
public enum pointerVisibilityStates
- States of Pointer Visibility.On_When_Active
- Only shows the pointer beam when the Pointer button on the controller is pressed.Always_On
- Ensures the pointer beam is always visible but pressing the Pointer button on the controller initiates the destination set event.Always_Off
- Ensures the pointer beam is never visible but the destination point is still set and pressing the Pointer button on the controller still initiates the destination set event.
public virtual void setPlayAreaCursorCollision(bool state)
- Parameters
bool state
- The state of whether to check for play area collisions.- Returns
- none
The setPlayAreaCursorCollision method determines whether play area collisions should be taken into consideration with the play area cursor.
public virtual bool IsActive()
- Parameters
- none
- Returns
bool
- Is true if the pointer is currently active.
The IsActive method is used to determine if the pointer currently active.
public virtual bool CanActivate()
- Parameters
- none
- Returns
bool
- Is true if the pointer is able to be activated due to the activation delay timer being zero.
The CanActivate method checks to see if the pointer can be activated as long as the activation delay timer is zero.
public virtual void ToggleBeam(bool state)
- Parameters
bool state
- The state of whether to enable or disable the beam.- Returns
- none
The ToggleBeam method allows the pointer beam to be toggled on or off via code at runtime. If true is passed as the state then the beam is activated, if false then the beam is deactivated.
This directory contains all of the toolkit scripts that add VR functionality to Unity.
- Controller Events
- Controller Actions
- Device Finder
- Simple Pointer
- Bezier Pointer
- UI Pointer
- Basic Teleport
- Height Adjust Teleport
- Headset Collision
- Headset Fade
- Headset Collision Fade
- Teleport Disable On Headset Collision
- Player Presence
- Touchpad Walking
- Room Extender
- Interactable Object
- Interact Touch
- Interact Grab
- Interact Use
- Object Auto Grab
- Player Climb
- Dash Teleport
- Simulating Headset Movement
The Controller Events script deals with events that the game controller is sending out.
The Controller Events script is attached to a Controller object within the [CameraRig]
prefab and provides event listeners for every button press on the controller (excluding the System Menu button as this cannot be overridden and is always used by Steam).
When a controller button is pressed, the script emits an event to denote that the button has been pressed which allows other scripts to listen for this event without needing to implement any controller logic. When a controller button is released, the script also emits an event denoting that the button has been released.
The script also has a public boolean pressed state for the buttons to allow the script to be queried by other scripts to check if a button is being held down.
- Pointer Toggle Button: The button to use for the action of turning a laser pointer on / off.
- Pointer Set Button: The button to use for the action of setting a destination marker from the cursor position of the pointer.
- Grab Toggle Button: The button to use for the action of grabbing game objects.
- Use Toggle Button: The button to use for the action of using game objects.
- Ui Click Button: The button to use for the action of clicking a UI element.
- Menu Toggle Button: The button to use for the action of bringing up an in-game menu.
- Axis Fidelity: The amount of fidelity in the changes on the axis, which is defaulted to 1. Any number higher than 2 will probably give too sensitive results.
- Trigger Click Threshold: The level on the trigger axis to reach before a click is registered.
public enum ButtonAlias
- Button typesTrigger_Hairline
- The trigger is squeezed past the current hairline threshold.Trigger_Touch
- The trigger is squeezed a small amount.Trigger_Press
- The trigger is squeezed about half way in.Trigger_Click
- The trigger is squeezed all the way until it clicks.Grip
- The grip button is pressed.Touchpad_Touch
- The touchpad is touched (without pressing down to click).Touchpad_Press
- The touchpad is pressed (to the point of hearing a click).Application_Menu
- The application menu button is pressed.Undefined
- No button specifiedpublic bool triggerPressed
- This will be true if the trigger is squeezed about half way in. Default:false
public bool triggerTouched
- This will be true if the trigger is squeezed a small amount. Default:false
public bool triggerHairlinePressed
- This will be true if the trigger is squeezed a small amount more from any previous squeeze on the trigger. Default:false
public bool triggerClicked
- This will be true if the trigger is squeezed all the way until it clicks. Default:false
public bool triggerAxisChanged
- This will be true if the trigger has been squeezed more or less. Default:false
public bool applicationMenuPressed
- This will be true if the application menu is held down. Default:false
public bool touchpadPressed
- This will be true if the touchpad is held down. Default:false
public bool touchpadTouched
- This will be true if the touchpad is being touched. Default:false
public bool touchpadAxisChanged
- This will be true if the touchpad touch position has changed. Default:false
public bool gripPressed
- This will be true if the grip is held down. Default:false
public bool pointerPressed
- This will be true if the button aliased to the pointer is held down. Default:false
public bool grabPressed
- This will be true if the button aliased to the grab is held down. Default:false
public bool usePressed
- This will be true if the button aliased to the use is held down. Default:false
public bool uiClickPressed
- This will be true if the button aliased to the UI click is held down. Default:false
public bool menuPressed
- This will be true if the button aliased to the application menu is held down. Default:false
TriggerPressed
- Emitted when the trigger is squeezed about half way in.TriggerReleased
- Emitted when the trigger is released under half way.TriggerTouchStart
- Emitted when the trigger is squeezed a small amount.TriggerTouchEnd
- Emitted when the trigger is no longer being squeezed at all.TriggerHairlineStart
- Emitted when the trigger is squeezed past the current hairline threshold.TriggerHairlineEnd
- Emitted when the trigger is released past the current hairline threshold.TriggerClicked
- Emitted when the trigger is squeezed all the way until it clicks.TriggerUnclicked
- Emitted when the trigger is no longer being held all the way down.TriggerAxisChanged
- Emitted when the amount of squeeze on the trigger changes.ApplicationMenuPressed
- Emitted when the application menu button is pressed.ApplicationMenuReleased
- Emitted when the application menu button is released.GripPressed
- Emitted when the grip button is pressed.GripReleased
- Emitted when the grip button is released.TouchpadPressed
- Emitted when the touchpad is pressed (to the point of hearing a click).TouchpadReleased
- Emitted when the touchpad has been released after a pressed state.TouchpadTouchStart
- Emitted when the touchpad is touched (without pressing down to click).TouchpadTouchEnd
- Emitted when the touchpad is no longer being touched.TouchpadAxisChanged
- Emitted when the touchpad is being touched in a different location.AliasPointerOn
- Emitted when the pointer toggle alias button is pressed.AliasPointerOff
- Emitted when the pointer toggle alias button is released.AliasPointerSet
- Emitted when the pointer set alias button is released.AliasGrabOn
- Emitted when the grab toggle alias button is pressed.AliasGrabOff
- Emitted when the grab toggle alias button is released.AliasUseOn
- Emitted when the use toggle alias button is pressed.AliasUseOff
- Emitted when the use toggle alias button is released.AliasMenuOn
- Emitted when the menu toggle alias button is pressed.AliasMenuOff
- Emitted when the menu toggle alias button is released.AliasUIClickOn
- Emitted when the UI click alias button is pressed.AliasUIClickOff
- Emitted when the UI click alias button is released.ControllerEnabled
- Emitted when the controller is enabled.ControllerDisabled
- Emitted when the controller is disabled.
Adding the VRTK_ControllerEvents_UnityEvents
component to VRTK_ControllerEvents
object allows access to UnityEvents
that will react identically to the Class Events.
OnTriggerPressed
- Emits the TriggerPressed class event.OnTriggerReleased
- Emits the TriggerReleased class event.OnTriggerTouchStart
- Emits the TriggerTouchStart class event.OnTriggerTouchEnd
- Emits the TriggerTouchEnd class event.OnTriggerHairlineStart
- Emits the TriggerHairlineStart class event.OnTriggerHairlineEnd
- Emits the TriggerHairlineEnd class event.OnTriggerClicked
- Emits the TriggerClicked class event.OnTriggerUnclicked
- Emits the TriggerUnclicked class event.OnTriggerAxisChanged
- Emits the TriggerAxisChanged class event.OnApplicationMenuPressed
- Emits the ApplicationMenuPressed class event.OnApplicationMenuReleased
- Emits the ApplicationMenuReleased class event.OnGripPressed
- Emits the GripPressed class event.OnGripReleased
- Emits the GripReleased class event.OnTouchpadPressed
- Emits the TouchpadPressed class event.OnTouchpadReleased
- Emits the TouchpadReleased class event.OnTouchpadTouchStart
- Emits the TouchpadTouchStart class event.OnTouchpadTouchEnd
- Emits the TouchpadTouchEnd class event.OnTouchpadAxisChanged
- Emits the TouchpadAxisChanged class event.OnAliasPointerOn
- Emits the AliasPointerOn class event.OnAliasPointerOff
- Emits the AliasPointerOff class event.OnAliasPointerSet
- Emits the AliasPointerSet class event.OnAliasGrabOn
- Emits the AliasGrabOn class event.OnAliasGrabOff
- Emits the AliasGrabOff class event.OnAliasUseOn
- Emits the AliasUseOn class event.OnAliasUseOff
- Emits the AliasUseOff class event.OnAliasUIClickOn
- Emits the AliasMenuOn class event.OnAliasUIClickOff
- Emits the AliasMenuOff class event.OnAliasMenuOn
- Emits the AliasUIClickOn class event.OnAliasMenuOff
- Emits the AliasUIClickOff class event.OnControllerEnabled
- Emits the ControllerEnabled class event.OnControllerDisabled
- Emits the ControllerDisabled class event.
uint controllerIndex
- The index of the controller that was used.float buttonPressure
- The amount of pressure being applied to the button pressed.0f
to1f
.Vector2 touchpadAxis
- The position the touchpad is touched at.(0,0)
to(1,1)
.float touchpadAngle
- The rotational position the touchpad is being touched at, 0 being top, 180 being bottom and all other angles accordingly.0f
to360f
.
public Vector3 GetVelocity()
- Parameters
- none
- Returns
Vector3
- A 3 dimensional vector containing the current real world physical controller velocity.
The GetVelocity method is useful for getting the current velocity of the physical game controller. This can be useful to determine the speed at which the controller is being swung or the direction it is being moved in.
public Vector3 GetAngularVelocity()
- Parameters
- none
- Returns
Vector3
- A 3 dimensional vector containing the current real world physical controller angular (rotational) velocity.
The GetAngularVelocity method is useful for getting the current rotational velocity of the physical game controller. This can be useful for determining which way the controller is being rotated and at what speed the rotation is occurring.
public Vector2 GetTouchpadAxis()
- Parameters
- none
- Returns
Vector2
- A 2 dimensional vector containing the x and y position of where the touchpad is being touched.(0,0)
to(1,1)
.
The GetTouchpadAxis method returns the coordinates of where the touchpad is being touched and can be used for directional input via the touchpad. The x
value is the horizontal touch plane and the y
value is the vertical touch plane.
public float GetTouchpadAxisAngle()
- Parameters
- none
- Returns
float
- A float representing the angle of where the touchpad is being touched.0f
to360f
.
The GetTouchpadAxisAngle method returns the angle of where the touchpad is currently being touched with the top of the touchpad being 0 degrees and the bottom of the touchpad being 180 degrees.
public float GetTriggerAxis()
- Parameters
- none
- Returns
float
- A float representing the amount of squeeze that is being applied to the trigger.0f
to1f
.
The GetTriggerAxis method returns a float that represents how much the trigger is being squeezed. This can be useful for using the trigger axis to perform high fidelity tasks or only activating the trigger press once it has exceeded a given press threshold.
public float GetHairTriggerDelta()
- Parameters
- none
- Returns
float
- A float representing the difference in the trigger pressure from the hairline threshold start to current position.
The GetHairTriggerDelta method returns a float representing the difference in how much the trigger is being pressed in relation to the hairline threshold start.
public bool AnyButtonPressed()
- Parameters
- none
- Returns
bool
- Is true if any of the controller buttons are currently being pressed.
The AnyButtonPressed method returns true if any of the controller buttons are being pressed and this can be useful to determine if an action can be taken whilst the user is using the controller.
public bool IsButtonPressed(ButtonAlias button)
- Parameters
ButtonAlias button
- The button to check if it's being pressed.- Returns
bool
- Is true if the button is being pressed.
The IsButtonPressed method takes a given button alias and returns a boolean whether that given button is currently being pressed or not.
VRTK/Examples/002_Controller_Events
shows how the events are utilised and listened to. The accompanying example script can be viewed in VRTK/Examples/Resources/Scripts/VRTK_ControllerEvents_ListenerExample.cs
.
The Controller Actions script provides helper methods to deal with common controller actions. It deals with actions that can be done to the controller.
ControllerModelVisible
- Emitted when the controller model is toggled to be visible.ControllerModelInvisible
- Emitted when the controller model is toggled to be invisible.
Adding the VRTK_ControllerActions_UnityEvents
component to VRTK_ControllerActions
object allows access to UnityEvents
that will react identically to the Class Events.
OnControllerModelVisible
- Emits the ControllerModelVisible class event.OnControllerModelInvisible
- Emits the ControllerModelInvisible class event.
uint controllerIndex
- The index of the controller that was used.
public bool IsControllerVisible()
- Parameters
- none
- Returns
bool
- Is true if the controller model has the renderers that are attached to it are enabled.
The IsControllerVisible method returns true if the controller is currently visible by whether the renderers on the controller are enabled.
public void ToggleControllerModel(bool state, GameObject grabbedChildObject)
- Parameters
bool state
- The visibility state to toggle the controller to,true
will make the controller visible -false
will hide the controller model.GameObject grabbedChildObject
- If an object is being held by the controller then this can be passed through to prevent hiding the grabbed game object as well.- Returns
- none
The ToggleControllerModel method is used to turn on or off the controller model by enabling or disabling the renderers on the object. It will also work for any custom controllers. It should also not disable any objects being held by the controller if they are a child of the controller object.
public void SetControllerOpacity(float alpha)
- Parameters
float alpha
- The alpha level to apply to opacity of the controller object.0f
to1f
.- Returns
- none
The SetControllerOpacity method allows the opacity of the controller model to be changed to make the controller more transparent. A lower alpha value will make the object more transparent, such as 0.5f
will make the controller partially transparent where as 0f
will make the controller completely transparent.
public void HighlightControllerElement(GameObject element, Color? highlight, float fadeDuration = 0f)
- Parameters
GameObject element
- The element of the controller to apply the highlight to.Color? highlight
- The colour of the highlight.float fadeDuration
- The duration of fade from white to the highlight colour. Optional parameter defaults to0f
.- Returns
- none
The HighlightControllerElement method allows for an element of the controller to have its colour changed to simulate a highlighting effect of that element on the controller. It's useful for being able to draw a user's attention to a specific button on the controller.
public void UnhighlightControllerElement(GameObject element)
- Parameters
GameObject element
- The element of the controller to remove the highlight from.- Returns
- none
The UnhighlightControllerElement method is the inverse of the HighlightControllerElement method and resets the controller element to its original colour.
public void ToggleHighlightControllerElement(bool state, GameObject element, Color? highlight = null, float duration = 0f)
- Parameters
bool state
- The highlight colour state,true
will enable the highlight on the given element andfalse
will remove the highlight from the given element.GameObject element
- The element of the controller to apply the highlight to.Color? highlight
- The colour of the highlight.float duration
- The duration of fade from white to the highlight colour.- Returns
- none
The ToggleHighlightControllerElement method is a shortcut method that makes it easier to highlight and unhighlight a controller element in a single method rather than using the HighlightControllerElement and UnhighlightControllerElement methods separately.
public void ToggleHighlightTrigger(bool state, Color? highlight = null, float duration = 0f)
- Parameters
bool state
- The highlight colour state,true
will enable the highlight on the trigger andfalse
will remove the highlight from the trigger.Color? highlight
- The colour to highlight the trigger with.float duration
- The duration of fade from white to the highlight colour.- Returns
- none
The ToggleHighlightTrigger method is a shortcut method that makes it easier to toggle the highlight state of the controller trigger element.
public void ToggleHighlightGrip(bool state, Color? highlight = null, float duration = 0f)
- Parameters
bool state
- The highlight colour state,true
will enable the highlight on the grip andfalse
will remove the highlight from the grip.Color? highlight
- The colour to highlight the grip with.float duration
- The duration of fade from white to the highlight colour.- Returns
- none
The ToggleHighlightGrip method is a shortcut method that makes it easier to toggle the highlight state of the controller grip element.
public void ToggleHighlightTouchpad(bool state, Color? highlight = null, float duration = 0f)
- Parameters
bool state
- The highlight colour state,true
will enable the highlight on the touchpad andfalse
will remove the highlight from the touchpad.Color? highlight
- The colour to highlight the touchpad with.float duration
- The duration of fade from white to the highlight colour.- Returns
- none
The ToggleHighlightTouchpad method is a shortcut method that makes it easier to toggle the highlight state of the controller touchpad element.
public void ToggleHighlightApplicationMenu(bool state, Color? highlight = null, float duration = 0f)
- Parameters
bool state
- The highlight colour state,true
will enable the highlight on the application menu andfalse
will remove the highlight from the application menu.Color? highlight
- The colour to highlight the application menu with.float duration
- The duration of fade from white to the highlight colour.- Returns
- none
The ToggleHighlightApplicationMenu method is a shortcut method that makes it easier to toggle the highlight state of the controller application menu element.
public void ToggleHighlightController(bool state, Color? highlight = null, float duration = 0f)
- Parameters
bool state
- The highlight colour state,true
will enable the highlight on the entire controllerfalse
will remove the highlight from the entire controller.Color? highlight
- The colour to highlight the entire controller with.float duration
- The duration of fade from white to the highlight colour.- Returns
- none
The ToggleHighlightController method is a shortcut method that makes it easier to toggle the highlight state of the entire controller.
public void TriggerHapticPulse(ushort strength)
- Parameters
ushort strength
- The intensity of the rumble of the controller motor.0
to3999
.- Returns
- none
The TriggerHapticPulse/1 method calls a single haptic pulse call on the controller for a single tick.
public void TriggerHapticPulse(ushort strength, float duration, float pulseInterval)
- Parameters
ushort strength
- The intensity of the rumble of the controller motor.0
to3999
.float duration
- The length of time the rumble should continue for.float pulseInterval
- The interval to wait between each haptic pulse.- Returns
- none
The TriggerHapticPulse/3 method calls a haptic pulse for a specified amount of time rather than just a single tick. Each pulse can be separated by providing a pulseInterval
to pause between each haptic pulse.
VRTK/Examples/016_Controller_HapticRumble
demonstrates the ability to hide a controller model and make the controller vibrate for a given length of time at a given intensity.
VRTK/Examples/035_Controller_OpacityAndHighlighting
demonstrates the ability to change the opacity of a controller model and to highlight specific elements of a controller such as the buttons or even the entire controller model.
The Device Finder offers a collection of static methods that can be called to find common game devices such as the headset or controllers, or used to determine key information about the connected devices.
public enum Devices
- Possible devices.Headset
- The headset.Left_Controller
- The left hand controller.Right_Controller
- The right hand controller.public enum ControllerHand
- Controller hand reference.None
- No hand is assigned.Left
- The left hand is assigned.Right
- The right hand is assigned.
public static bool TrackedIndexIsController(uint index)
- Parameters
uint index
- The index of the tracked object to find.- Returns
bool
- Returns true if the given index is a tracked object of type controller.
The TrackedIndexIsController method is used to determine if a given tracked object index belongs to a tracked controller.
public static uint GetControllerIndex(GameObject controller)
- Parameters
GameObject controller
- The controller object to check the index on.- Returns
uint
- The index of the given controller.
The GetControllerIndex method is used to find the index of a given controller object.
public static GameObject TrackedObjectByIndex(uint index)
- Parameters
uint index
- The index of the tracked object to find.- Returns
GameObject
- The tracked object that matches the given index.
The TrackedObjectByIndex method is used to find the GameObject of a tracked object by its generated index.
public static Transform TrackedObjectOrigin(GameObject obj)
- Parameters
GameObject obj
- The GameObject to get the origin for.- Returns
Transform
- The transform of the tracked object's origin or if an origin is not set then the transform parent.
The TrackedObjectOrigin method is used to find the tracked object's origin.
public static GameObject TrackedObjectOfGameObject(GameObject obj, out uint index)
- Parameters
GameObject obj
- The game object to check for the presence of a tracked object on.out uint index
- The variable to store the tracked object's index if one is found. It returns 0 if no index is found.- Returns
GameObject
- The GameObject of the tracked object.
The TrackedObjectOfGameObject method is used to find the tracked object associated with the given game object and it can also return the index of the tracked object.
public static Transform DeviceTransform(Devices device)
- Parameters
Devices device
- The Devices enum to get the transform for.- Returns
Transform
- The transform for the given Devices enum.
The DeviceTransform method returns the transform for a given Devices enum.
public static ControllerHand GetControllerHandType(string hand)
- Parameters
string hand
- The string representation of the hand to retrieve the type of.left
orright
.- Returns
ControllerHand
- A ControllerHand representing either the Left or Right hand.
The GetControllerHandType method is used for getting the enum representation of ControllerHand from a given string.
public static ControllerHand GetControllerHand(GameObject controller)
- Parameters
GameObject controller
- The controller game object to check the hand of.- Returns
ControllerHand
- A ControllerHand representing either the Left or Right hand.
The GetControllerHand method is used for getting the enum representation of ControllerHand for the given controller game object.
public static GameObject GetControllerLeftHand()
- Parameters
- none
- Returns
GameObject
- The left hand controller.
The GetControllerLeftHand method retrieves the game object for the left hand controller.
public static GameObject GetControllerRightHand()
- Parameters
- none
- Returns
GameObject
- The right hand controller.
The GetControllerRightHand method retrieves the game object for the right hand controller.
public static bool IsControllerOfHand(GameObject checkController, ControllerHand hand)
- Parameters
GameObject checkController
- The actual controller object that is being checked.ControllerHand hand
- The representation of a hand to check if the given controller matches.- Returns
bool
- Is true if the given controller matches the given hand.
The IsControllerOfHand method is used to check if a given controller game object is of the hand type provided.
public static Transform HeadsetTransform()
- Parameters
- none
- Returns
Transform
- The transform of the VR Headset component.
The HeadsetTransform method is used to retrieve the transform for the VR Headset in the scene. It can be useful to determine the position of the user's head in the game world.
public static Transform HeadsetCamera()
- Parameters
- none
- Returns
Transform
- The transform of the VR Camera component.
The HeadsetCamera method is used to retrieve the transform for the VR Camera in the scene.
public static Transform PlayAreaTransform()
- Parameters
- none
- Returns
Transform
- The transform of the VR Play Area component.
The PlayAreaTransform method is used to retrieve the transform for the play area in the scene.
extends VRTK_WorldPointer
The Simple Pointer emits a coloured beam from the end of the controller to simulate a laser beam. It can be useful for pointing to objects within a scene and it can also determine the object it is pointing at and the distance the object is from the controller the beam is being emitted from.
The laser beam is activated by default by pressing the Touchpad
on the controller. The event it is listening for is the AliasPointer
events so the pointer toggle button can be set by changing the Pointer Toggle
button on the VRTK_ControllerEvents
script parameters.
The Simple Pointer script can be attached to a Controller object within the [CameraRig]
prefab and the Controller object also requires the VRTK_ControllerEvents
script to be attached as it uses this for listening to the controller button events for enabling and disabling the beam. It is also possible to attach the Simple Pointer script to another object (like the [CameraRig]/Camera (head)
) to enable other objects to project the beam. The controller parameter must be entered with the desired controller to toggle the beam if this is the case.
- Pointer Thickness: The thickness and length of the beam can also be set on the script as well as the ability to toggle the sphere beam tip that is displayed at the end of the beam (to represent a cursor).
- Pointer Length: The distance the beam will project before stopping.
- Show Pointer Tip: Toggle whether the cursor is shown on the end of the pointer beam.
- Custom Pointer Cursor: A custom Game Object can be applied here to use instead of the default sphere for the pointer cursor.
- Layers To Ignore: The layers to ignore when raycasting.
VRTK/Examples/003_Controller_SimplePointer
shows the simple pointer in action and code examples of how the events are utilised and listened to can be viewed in the script VRTK/Examples/Resources/Scripts/VRTK_ControllerPointerEvents_ListenerExample.cs
extends VRTK_WorldPointer
The Bezier Pointer emits a curved line (made out of game objects) from the end of the controller to a point on a ground surface (at any height). It is more useful than the Simple Laser Pointer for traversing objects of various heights as the end point can be curved on top of objects that are not visible to the user.
The laser beam is activated by default by pressing the Touchpad
on the controller. The event it is listening for is the AliasPointer
events so the pointer toggle button can be set by changing the Pointer Toggle
button on the VRTK_ControllerEvents
script parameters.
The Bezier Pointer script can be attached to a Controller object within the [CameraRig]
prefab and the Controller object also requires the VRTK_ControllerEvents
script to be attached as it uses this for listening to the controller button events for enabling and disabling the beam. It is also possible to attach the Bezier Pointer script to another object (like the [CameraRig]/Camera (head)
) to enable other objects to project the beam. The controller parameter must be entered with the desired controller to toggle the beam if this is the case.
The bezier curve generation code is in another script located at
VRTK/Scripts/Helper/CurveGenerator.cs
and was heavily inspired by the tutorial and code from Catlike Coding.
- Pointer Length: The length of the projected forward pointer beam, this is basically the distance able to point from the controller position.
- Pointer Density: The number of items to render in the beam bezier curve. A high number here will most likely have a negative impact of game performance due to large number of rendered objects.
- Show Pointer Cursor: A cursor is displayed on the ground at the location the beam ends at, it is useful to see what height the beam end location is, however it can be turned off by toggling this.
- Pointer Cursor Radius: The size of the ground pointer cursor. This number also affects the size of the objects in the bezier curve beam. The larger the radius, the larger the objects will be.
- Pointer Cursor Match Target Rotation: The pointer cursor will be rotated to match the angle of the target surface if this is true, if it is false then the pointer cursor will always be horizontal.
- Beam Curve Offset: The amount of height offset to apply to the projected beam to generate a smoother curve even when the beam is pointing straight.
- Beam Height Limit Angle: The maximum angle in degrees of the controller before the beam curve height is restricted. A lower angle setting will prevent the beam being projected high into the sky and curving back down.
- Custom Pointer Tracer: A custom Game Object can be applied here to use instead of the default sphere for the beam tracer. The custom Game Object will match the rotation of the controller.
- Custom Pointer Cursor: A custom Game Object can be applied here to use instead of the default flat cylinder for the pointer cursor.
- Layers To Ignore: The layers to ignore when raycasting.
- Valid Teleport Location Object: A custom Game Object can be applied here to appear only if the teleport is allowed (its material will not be changed ).
- Rescale Pointer Tracer: Rescale each pointer tracer element according to the length of the Bezier curve.
VRTK/Examples/009_Controller_BezierPointer
is used in conjunction with the Height Adjust Teleporter shows how it is possible to traverse different height objects using the curved pointer without needing to see the top of the object.
VRTK/Examples/012_Controller_PointerWithAreaCollision
shows how a Bezier Pointer with the Play Area Cursor and Collision Detection enabled can be used to traverse a game area but not allow teleporting into areas where the walls or other objects would fall into the play area space enabling the user to enter walls.
`VRTK/Examples/036_Controller_CustomCompoundPointer' shows how to display an object (a teleport beam) only if the teleport location is valid, and can create an animated trail along the tracer curve.
The UI Pointer provides a mechanism for interacting with Unity UI elements on a world canvas. The UI Pointer can be attached to any game object the same way in which a World Pointer can be and the UI Pointer also requires a controller to initiate the pointer activation and pointer click states.
It's possible to prevent a world canvas from being interactable with a UI Pointer by setting a tag or applying a class to the canvas and then entering the tag or class name for the UI Pointer to ignore on the UI Pointer inspector parameters.
The simplest way to use the UI Pointer is to attach the script to a game controller within the [CameraRig]
along with a Simple Pointer as this provides visual feedback as to where the UI ray is pointing.
The UI pointer is activated via the Pointer
alias on the Controller Events
and the UI pointer click state is triggered via the UI Click
alias on the Controller Events
.
- Controller: The controller that will be used to toggle the pointer. If the script is being applied onto a controller then this parameter can be left blank as it will be auto populated by the controller the script is on at runtime.
- Ignore Canvas With Tag Or Class: A string that specifies a canvas Tag or the name of a Script attached to a canvas and denotes that any world canvases that contain this tag or script will be ignored by the UI Pointer.
- Activation Mode: Determines when the UI pointer should be active.
public enum ActivationMethods
- Methods of activation.Hold_Button
- Only activates the UI Pointer when the Pointer button on the controller is pressed and held down.Toggle_Button
- Activates the UI Pointer on the first click of the Pointer button on the controller and it stays active until the Pointer button is clicked again.Always_On
- The UI Pointer is always active regardless of whether the Pointer button on the controller is pressed or not.
UIPointerElementEnter
- Emitted when the UI Pointer is colliding with a valid UI element.UIPointerElementExit
- Emitted when the UI Pointer is no longer colliding with any valid UI elements.
Adding the VRTK_UIPointer_UnityEvents
component to VRTK_UIPointer
object allows access to UnityEvents
that will react identically to the Class Events.
OnUIPointerElementEnter
- Emits the UIPointerElementEnter class event.OnUIPointerElementExit
- Emits the UIPointerElementExit class event.
uint controllerIndex
- The index of the controller that was used.GameObject currentTarget
- The current UI element that the pointer is colliding with.GameObject previousTarget
- The previous UI element that the pointer was colliding with.
public VRTK_EventSystemVRInput SetEventSystem(EventSystem eventSystem)
- Parameters
EventSystem eventSystem
- The global Unity event system to be used by the UI pointers.- Returns
VRTK_EventSystemVRInput
- A custom event system input class that is used to detect input from VR pointers.
The SetEventSystem method is used to set up the global Unity event system for the UI pointer. It also handles disabling the existing Standalone Input Module that exists on the EventSystem and adds a custom VRTK Event System VR Input component that is required for interacting with the UI with VR inputs.
public void SetWorldCanvas(Canvas canvas)
- Parameters
Canvas canvas
- The canvas object to initialise for use with the UI pointers. Must be of typeWorldSpace
.- Returns
- none
The SetWorldCanvas method is used to initialise a WorldSpace
canvas for use with the UI Pointer. This method is called automatically on start for all editor created canvases but would need to be manually called if a canvas was generated at runtime.
public bool PointerActive()
- Parameters
- none
- Returns
bool
- Returns true if the ui pointer should be currently active.
The PointerActive method determines if the ui pointer beam should be active based on whether the pointer alias is being held and whether the Hold Button To Use parameter is checked.
VRTK/Examples/034_Controls_InteractingWithUnityUI
uses the VRTK_UIPointer
script on the right Controller to allow for the interaction with Unity UI elements using a Simple Pointer beam. The left Controller controls a Simple Pointer on the headset to demonstrate gaze interaction with Unity UI elements.
The basic teleporter updates the [CameraRig]
x/z position in the game world to the position of a World Pointer's tip location which is set via the WorldPointerDestinationSet
event. The y position is never altered so the basic teleporter cannot be used to move up and down game objects as it only allows for travel across a flat plane.
The Basic Teleport script is attached to the [CameraRig]
prefab.
- Blink Transition Speed: The fade blink speed can be changed on the basic teleport script to provide a customised teleport experience. Setting the speed to 0 will mean no fade blink effect is present.
- Distance Blink Delay: A range between 0 and 32 that determines how long the blink transition will stay blacked out depending on the distance being teleported. A value of 0 will not delay the teleport blink effect over any distance, a value of 32 will delay the teleport blink fade in even when the distance teleported is very close to the original position. This can be used to simulate time taking longer to pass the further a user teleports. A value of 16 provides a decent basis to simulate this to the user.
- Headset Position Compensation: If this is checked then the teleported location will be the position of the headset within the play area. If it is unchecked then the teleported location will always be the centre of the play area even if the headset position is not in the centre of the play area.
- Ignore Target With Tag Or Class: A string that specifies an object Tag or the name of a Script attached to an object and notifies the teleporter that the destination is to be ignored so the user cannot teleport to that location. It also ensure the pointer colour is set to the miss colour.
- Nav Mesh Limit Distance: The max distance the nav mesh edge can be from the teleport destination to be considered valid. If a value of
0
is given then the nav mesh restriction will be ignored.
Teleporting
- Emitted when the teleport process has begun.Teleported
- Emitted when the teleport process has successfully completed.
Adding the VRTK_BasicTeleport_UnityEvents
component to VRTK_BasicTeleport
object allows access to UnityEvents
that will react identically to the Class Events.
OnTeleporting
- Emits the Teleporting class event.OnTeleported
- Emits the Teleported class event.
float distance
- The distance between the origin and the collided destination.Transform target
- The Transform of the collided destination object.Vector3 destinationPosition
- The world position of the destination marker.bool enableTeleport
- Whether the destination set event should trigger teleport.uint controllerIndex
- The optional index of the controller emitting the beam.
public void InitDestinationSetListener(GameObject markerMaker, bool register)
- Parameters
GameObject markerMaker
- The game object that is used to generate destination marker events, such as a controller.bool register
- Determines whether to register or unregister the listeners.- Returns
- none
The InitDestinationSetListener method is used to register the teleport script to listen to events from the given game object that is used to generate destination markers. Any destination set event emitted by a registered game object will initiate the teleport to the given destination location.
public void ToggleTeleportEnabled(bool state)
- Parameters
bool state
- Toggles whether the teleporter is enabled or disabled.- Returns
- none
The ToggleTeleportEnabled method is used to determine whether the teleporter will initiate a teleport on a destination set event, if the state is true then the teleporter will work as normal, if the state is false then the teleporter will not be operational.
VRTK/Examples/004_CameraRig_BasicTeleport
uses the VRTK_SimplePointer
script on the Controllers to initiate a laser pointer by pressing the Touchpad
on the controller and when the laser pointer is deactivated (release the Touchpad
) then the user is teleported to the location of the laser pointer tip as this is where the pointer destination marker position is set to.
extends VRTK_BasicTeleport
The height adjust teleporter extends the basic teleporter and allows for the y position of the [CameraRig]
to be altered based on whether the teleport location is on top of another object.
Like the basic teleporter the Height Adjust Teleport script is attached to the [CameraRig]
prefab.
- Play Space Falling: Checks if the user steps off an object into a part of their play area that is not on the object then they are automatically teleported down to the nearest floor. The
Play Space Falling
option also works in the opposite way that if the user's headset is above an object then the user is teleported automatically on top of that object, which is useful for simulating climbing stairs without needing to use the pointer beam location. If this option is turned off then the user can hover in mid-air at the same y position of the object they are standing on. - Play Space Fall Restriction: An additional check to see if the play space fall should take place. If the selected restrictor is still over the current floor then the play space fall will not occur. Works well for being able to lean over ledges and look down. Only works for falling down not teleporting up.
- Use Gravity: Allows for gravity based falling when the distance is greater than
Gravity Fall Height
. - Gravity Fall Height: Fall distance needed before gravity based falling can be triggered.
- Blink Y Threshold: The
y
distance between the floor and the headset that must change before the fade transition is initiated. If the new user location is at a higher distance than the threshold then the headset blink transition will activate on teleport. If the new user location is within the threshold then no blink transition will happen, which is useful for walking up slopes, meshes and terrains where constant blinking would be annoying. - Floor Height Tolerance: The amount the
y
position needs to change by between the current floory
position and the previous floory
position before a change in floor height is considered to have occurred. A higher value here will mean that aDrop To Floor
teleport event will be less likely to happen if they
of the floor beneath the user hasn't changed as much as the given threshold.
public enum FallingRestrictors
- Options for testing if a play space fall is validNo_Restriction
- Always play space fall when the headset is no longer over the current standing object.Left_Controller
- Don't play space fall if the Left Controller is still over the current standing object even if the headset isn't.Right_Controller
- Don't play space fall if the Right Controller is still over the current standing object even if the headset isn't.Either_Controller
- Don't play space fall if Either Controller is still over the current standing object even if the headset isn't.Both_Controllers
- Don't play space fall only if Both Controllers are still over the current standing object even if the headset isn't.
VRTK/Examples/007_CameraRig_HeightAdjustTeleport
has a collection of varying height objects that the user can either walk up and down or use the laser pointer to climb on top of them.
VRTK/Examples/010_CameraRig_TerrainTeleporting
shows how the teleportation of a user can also traverse terrain colliders.
VRTK/Examples/020_CameraRig_MeshTeleporting
shows how the teleportation of a user can also traverse mesh colliders.
The purpose of the Headset Collision is to detect when the user's VR headset collides with another game object.
Unity Version Information
- If using
Unity 5.3
or older then the Headset Collision script is attached to theCamera(head)
object within the[CameraRig]
prefab.- If using
Unity 5.4
or newer then the Headset Collision script is attached to theCamera(eye)
object within the[CameraRig]->Camera(head)
prefab.
- Ignore Target With Tag Or Class: A string that specifies an object Tag or the name of a Script attached to an object and will be ignored on headset collision.
HeadsetCollisionDetect
- Emitted when the user's headset collides with another game object.HeadsetCollisionEnded
- Emitted when the user's headset stops colliding with a game object.
Adding the VRTK_HeadsetCollision_UnityEvents
component to VRTK_HeadsetCollision
object allows access to UnityEvents
that will react identically to the Class Events.
OnHeadsetCollisionDetect
- Emits the HeadsetCollisionDetect class event.OnHeadsetCollisionEnded
- Emits the HeadsetCollisionEnded class event.
Collider collider
- The Collider of the game object the headset has collided with.Transform currentTransform
- The current Transform of the object that the Headset Collision Fade script is attached to (Camera).
public virtual bool IsColliding()
- Parameters
- none
- Returns
bool
- Returns true if the headset is currently colliding with a valid game object.
The IsColliding method is used to determine if the headset is currently colliding with a valid game object and returns true if it is and false if it is not colliding with anything or an invalid game object.
VRTK/Examples/011_Camera_HeadSetCollisionFading
has collidable walls around the play area and if the user puts their head into any of the walls then the headset will fade to black.
The purpose of the Headset Fade is to change the colour of the headset view to a specified colour over a given duration and to also unfade it back to being transparent. The Fade
and Unfade
methods can only be called via another script and this Headset Fade script does not do anything on initialisation to fade or unfade the headset view.
Unity Version Information
- If using
Unity 5.3
or older then the Headset Fade script is attached to theCamera(head)
object within the[CameraRig]
prefab.- If using
Unity 5.4
or newer then the Headset Fade script is attached to theCamera(eye)
object within the[CameraRig]->Camera(head)
prefab.
HeadsetFadeStart
- Emitted when the user's headset begins to fade to a given colour.HeadsetFadeComplete
- Emitted when the user's headset has completed the fade and is now fully at the given colour.HeadsetUnfadeStart
- Emitted when the user's headset begins to unfade back to a transparent colour.HeadsetUnfadeComplete
- Emitted when the user's headset has completed unfading and is now fully transparent again.
Adding the VRTK_HeadsetFade_UnityEvents
component to VRTK_HeadsetFade
object allows access to UnityEvents
that will react identically to the Class Events.
OnHeadsetFadeStart
- Emits the HeadsetFadeStart class event.OnHeadsetFadeComplete
- Emits the HeadsetFadeComplete class event.OnHeadsetUnfadeStart
- Emits the HeadsetUnfadeStart class event.OnHeadsetUnfadeComplete
- Emits the HeadsetUnfadeComplete class event.
float timeTillComplete
- A float that is the duration for the fade/unfade process has remaining.Transform currentTransform
- The current Transform of the object that the Headset Fade script is attached to (Camera).
public virtual bool IsFaded()
- Parameters
- none
- Returns
bool
- Returns true if the headset is currently fading or faded.
The IsFaded method returns true if the headset is currently fading or has completely faded and returns false if it is completely unfaded.
public virtual bool IsTransitioning()
- Parameters
- none
- Returns
bool
- Returns true if the headset is currently in the process of fading or unfading.
The IsTransitioning method returns true if the headset is currently fading or unfading and returns false if it is completely faded or unfaded.
public virtual void Fade(Color color, float duration)
- Parameters
Color color
- The colour to fade the headset view to.float duration
- The time in seconds to take to complete the fade transition.- Returns
- none
The Fade method initiates a change in the colour of the headset view to the given colour over a given duration.
public virtual void Unfade(float duration)
- Parameters
float duration
- The time in seconds to take to complete the unfade transition.- Returns
- none
The Unfade method initiates the headset to change colour back to a transparent colour over a given duration.
VRTK/Examples/011_Camera_HeadSetCollisionFading
has collidable walls around the play area and if the user puts their head into any of the walls then the headset will fade to black.
The purpose of the Headset Collision Fade is to detect when the user's VR headset collides with another game object and fades the screen to a solid colour. This is to deal with a user putting their head into a game object and seeing the inside of the object clipping, which is an undesired effect. The reasoning behind this is if the user puts their head where it shouldn't be, then fading to a colour (e.g. black) will make the user realise they've done something wrong and they'll probably naturally step backwards.
The Headset Collision Fade uses a composition of the Headset Collision and Headset Fade scripts to derive the desired behaviour.
Unity Version Information
- If using
Unity 5.3
or older then the Headset Collision Fade script is attached to theCamera(head)
object within the[CameraRig]
prefab.- If using
Unity 5.4
or newer then the Headset Collision Fade script is attached to theCamera(eye)
object within the[CameraRig]->Camera(head)
prefab.
- Blink Transition Speed: The fade blink speed on collision.
- Fade Color: The colour to fade the headset to on collision.
- Ignore Target With Tag Or Class: A string that specifies an object Tag or the name of a Script attached to an object and will prevent the object from fading the headset view on collision.
VRTK/Examples/011_Camera_HeadSetCollisionFading
has collidable walls around the play area and if the user puts their head into any of the walls then the headset will fade to black.
The purpose of the Teleport Disable On Headset Collision script is to detect when the headset is colliding with a valid object and prevent teleportation from working. This is to ensure that if a user is clipping their head into a wall then they cannot teleport to an area beyond the wall.
The concept that the VR user has a physical in game presence which is accomplished by adding a collider and a rigidbody at the position the user is standing within their play area. This physical collider and rigidbody will prevent the user from ever being able to walk through walls or intersect other collidable objects. The height of the collider is determined by the height the user has the headset at, so if the user crouches then the collider shrinks with them, meaning it's possible to crouch and crawl under low ceilings.
- Headset Y Offset: The collider which is created for the user is set at a height from the user's headset position. If the collider is required to be lower to allow for room between the play area collider and the headset then this offset value will shorten the height of the generated collider.
- Ignore Grabbed Collisions: If this is checked then any items that are grabbed with the controller will not collide with the player presence collider. This is very useful if the user is required to grab and wield objects because if the collider was active they would bounce off the collider.
- Reset Position On Collision: If this is checked then if the Headset Collision script is present and a headset collision occurs, the CameraRig is moved back to the last good known standing position. This deals with any collision issues if a user stands up whilst moving through a crouched area as instead of them being able to clip into objects they are transported back to a position where they are able to stand.
- Falling Physics Only: Only use physics when an explicit falling state is set.
PresenceFallStarted
- Emitted when a gravity based fall has started.PresenceFallEnded
- Emitted when a gravity based fall has ended.
Adding the VRTK_PlayerPresence_UnityEvents
component to VRTK_PlayerPresence
object allows access to UnityEvents
that will react identically to the Class Events.
OnPresenceFallStarted
- Emits the PresenceFallStarted class event.OnPresenceFallEnded
- Emits the PresenceFallEnded class event.
float fallDistance
- The total height the player has dropped from a gravity based fall.
public void SetFallingPhysicsOnlyParams(bool falling)
- Parameters
bool falling
- Toggle the physics falling on or off.- Returns
- none
The SetFallingPhysicsOnlyParams method will toggle the fallingPhysicsOnly
class state as well as enable or disable physics if needed.
public bool IsFalling()
- Parameters
- none
- Returns
bool
- Returns if the player is in a physics falling state or not.
The IsFalling method will return if the class is using physics based falling and is currently in a falling state.
public void StartPhysicsFall(Vector3 velocity)
- Parameters
Vector3 velocity
- The starting velocity to use at the start of a fall.- Returns
- none
The StartPhysicsFall method initializes the physics based fall state, enable physics and send out the PresenceFallStarted
event.
public void StopPhysicsFall()
- Parameters
- none
- Returns
- none
The StopPhysicsFall method ends the physics based fall state, disables physics and send out the PresenceFallEnded
event.
VRTK/Examples/017_CameraRig_TouchpadWalking
has a collection of walls and slopes that can be traversed by the user with the touchpad but the user cannot pass through the objects as they are collidable and the rigidbody physics won't allow the intersection to occur.
The ability to move the play area around the game world by sliding a finger over the touchpad is achieved using this script. The Touchpad Walking script is applied to the [CameraRig]
prefab and adds a rigidbody and a box collider to the user's position to prevent them from walking through other collidable game objects.
If the Headset Collision Fade script has been applied to the Camera prefab, then if a user attempts to collide with an object then their position is reset to the last good known position. This can happen if the user is moving through a section where they need to crouch and then they stand up and collide with the ceiling. Rather than allow a user to do this and cause collision resolution issues it is better to just move them back to a valid location. This does break immersion but the user is doing something that isn't natural.
- 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) then the walk speed is slower.
- Deceleration: The speed in which the play area slows down to a complete stop when the user is no longer touching the touchpad. This deceleration effect can ease any motion sickness that may be suffered.
- Move On Button Press: If a button is defined then movement will only occur when the specified button is being held down and the touchpad axis changes.
- Device For Direction: The direction that will be moved in is the direction of this device.
VRTK/Examples/017_CameraRig_TouchpadWalking
has a collection of walls and slopes that can be traversed by the user with the touchpad. There is also an area that can only be traversed if the user is crouching. Standing up in this crouched area will cause the user to appear back at their last good known position.
This script allows the playArea to move with the user. The [CameraRig]
is only moved when at the edge of a defined circle. Aims to create a virtually bigger play area. To use this add this script to the [CameraRig
] prefab.
There is an additional script VRTK_RoomExtender_PlayAreaGizmo
which can be attached to the [CameraRig
] to visualize the extended playArea within the Editor.
- Movement Function: This determines the type of movement used by the extender.
- Additional Movement Enabled: This is the a public variable to enable the additional movement. This can be used in other scripts to toggle the
[CameraRig]
movement. - Additional Movement Enabled On Button Press: This configures the controls of the RoomExtender. If this is true then the touchpad needs to be pressed to enable it. If this is false then it is disabled by pressing the touchpad.
- Additional Movement Multiplier: This is the factor by which movement at the edge of the circle is amplified. 0 is no movement of the
[CameraRig]
. Higher values simulate a bigger play area but may be too uncomfortable. - Head Zone Radius: This is the size of the circle in which the playArea is not moved and everything is normal. If it is to low it becomes uncomfortable when crouching.
- Debug Transform: This transform visualises the circle around the user where the
[CameraRig]
is not moved. In the demo scene this is a cylinder at floor level. Remember to turn of collisions.
public enum MovementFunction
- Movement methods.Nonlinear
- Moves the head with a non-linear drift movement.LinearDirect
- Moves the headset in a direct linear movement.
VRTK/Examples/028_CameraRig_RoomExtender
shows how the RoomExtender script is controlled by a VRTK_RoomExtender_Controller Example script located at both controllers. Pressing the Touchpad
on the controller activates the Room Extender. The Additional Movement Multiplier is changed based on the touch distance to the centre of the touchpad.
The Interactable Object script is attached to any game object that is required to be interacted with (e.g. via the controllers).
The basis of this script is to provide a simple mechanism for identifying objects in the game world that can be grabbed or used but it is expected that this script is the base to be inherited into a script with richer functionality.
- Highlight On Touch: The object will only highlight when a controller touches it if this is checked.
- Touch Highlight Color: The colour to highlight the object when it is touched. This colour will override any globally set colour (for instance on the
VRTK_InteractTouch
script). - Rumble On Touch: The haptic feedback on the controller can be triggered upon touching the object, the
Strength
denotes the strength of the pulse, theDuration
denotes the length of time. - Allowed Touch Controllers: Determines which controller can initiate a touch action.
- Hide Controller On Touch: Optionally override the controller setting.
- Is Grabbable: Determines if the object can be grabbed.
- Is Droppable: Determines if the object can be dropped by the controller grab button being used. If this is unchecked then it's not possible to drop the item once it's picked up using the controller button. It is still possible for the item to be dropped if the Grab Attach Mechanic is a joint and too much force is applied to the object and the joint is broken. To prevent this it's better to use the Child Of Controller mechanic.
- Is Swappable: Determines if the object can be swapped between controllers when it is picked up. If it is unchecked then the object must be dropped before it can be picked up by the other controller.
- Hold Button To Grab: If this is checked then the grab button on the controller needs to be continually held down to keep grabbing. If this is unchecked the grab button toggles the grab action with one button press to grab and another to release.
- Grab Override Button: If this is set to
Undefined
then the global grab alias button will grab the object, setting it to any other button will ensure the override button is used to grab this specific interactable object. - Rumble On Grab: The haptic feedback on the controller can be triggered upon grabbing the object, the
Strength
denotes the strength of the pulse, theDuration
denotes the length of time. - Allowed Grab Controllers: Determines which controller can initiate a grab action.
- Precision Snap: If this is checked then when the controller grabs the object, it will grab it with precision and pick it up at the particular point on the object the controller is touching.
- Right Snap Handle: A Transform provided as an empty game object which must be the child of the item being grabbed and serves as an orientation point to rotate and position the grabbed item in relation to the right handed controller. If no Right Snap Handle is provided but a Left Snap Handle is provided, then the Left Snap Handle will be used in place. If no Snap Handle is provided then the object will be grabbed at its central point. Not required for
Precision Snap
. - Left Snap Handle: A Transform provided as an empty game object which must be the child of the item being grabbed and serves as an orientation point to rotate and position the grabbed item in relation to the left handed controller. If no Left Snap Handle is provided but a Right Snap Handle is provided, then the Right Snap Handle will be used in place. If no Snap Handle is provided then the object will be grabbed at its central point. Not required for
Precision Snap
. - Hide Controller On Grab: Optionally override the controller setting.
- Stay Grabbed On Teleport: If this is checked then the object will stay grabbed to the controller when a teleport occurs. If it is unchecked then the object will be released when a teleport occurs.
- Grab Attach Mechanic: This determines how the grabbed item will be attached to the controller when it is grabbed.
- Detach Threshold: The force amount when to detach the object from the grabbed controller. If the controller tries to exert a force higher than this threshold on the object (from pulling it through another object or pushing it into another object) then the joint holding the object to the grabbing controller will break and the object will no longer be grabbed. This also works with Tracked Object grabbing but determines how far the controller is from the object before breaking the grab. Only required for
Fixed Joint
,Spring Joint
,Track Object
andRotator Track
. - Spring Joint Strength: The strength of the spring holding the object to the controller. A low number will mean the spring is very loose and the object will require more force to move it, a high number will mean a tight spring meaning less force is required to move it. Only required for
Spring Joint
. - Spring Joint Damper: The amount to damper the spring effect when using a Spring Joint grab mechanic. A higher number here will reduce the oscillation effect when moving jointed Interactable Objects. Only required for
Spring Joint
. - Throw Multiplier: An amount to multiply the velocity of the given object when it is thrown. This can also be used in conjunction with the Interact Grab Throw Multiplier to have certain objects be thrown even further than normal (or thrown a shorter distance if a number below 1 is entered).
- On Grab Collision Delay: The amount of time to delay collisions affecting the object when it is first grabbed. This is useful if a game object may get stuck inside another object when it is being grabbed.
- Is Usable: Determines if the object can be used.
- Use Only If Grabbed: If this is checked the object can be used only if it was grabbed before.
- Hold Button To Use: If this is checked then the use button on the controller needs to be continually held down to keep using. If this is unchecked the the use button toggles the use action with one button press to start using and another to stop using.
- Use Override Button: If this is set to
Undefined
then the global use alias button will use the object, setting it to any other button will ensure the override button is used to use this specific interactable object. - Pointer Activates Use Action: If this is checked then when a World Pointer beam (projected from the controller) hits the interactable object, if the object has
Hold Button To Use
unchecked then whilst the pointer is over the object it will run it'sUsing
method. IfHold Button To Use
is unchecked then theUsing
method will be run when the pointer is deactivated. The world pointer will not throw theDestination Set
event if it is affecting an interactable object with this setting checked as this prevents unwanted teleporting from happening when using an object with a pointer. - Rumble On Use: The haptic feedback on the controller can be triggered upon using the object, the
Strength
denotes the strength of the pulse, theDuration
denotes the length of time. - Allowed Use Controllers: Determines which controller can initiate a use action.
- Hide Controller On Use: Optionally override the controller setting.
public enum GrabAttachType
- Types of grab attachment.Fixed_Joint
- Attaches the object to the controller with a fixed joint meaning it tracks the position and rotation of the controller with perfect 1:1 tracking.Spring_Joint
- Attaches the object to the controller with a spring joint meaning there is some flexibility between the item and the controller force moving the item. This works well when attempting to pull an item rather than snap the item directly to the controller. It creates the illusion that the item has resistance to move it.Track_Object
- Doesn't attach the object to the controller via a joint, instead it ensures the object tracks the direction of the controller, which works well for items that are on hinged joints.Rotator_Track
- Tracks the object but instead of the object tracking the direction of the controller, a force is applied to the object to cause it to rotate. This is ideal for hinged joints on items such as wheels or doors.Child_Of_Controller
- Makes the object a child of the controller grabbing so it naturally tracks the position of the controller motion.Climbable
- Non-rigid body interactable object used to allow player climbing.public enum AllowedController
- Allowed controller type.Both
- Both controllers are allowed to interact.Left_Only
- Only the left controller is allowed to interact.Right_Only
- Only the right controller is allowed to interact.public enum ControllerHideMode
- Hide controller state.Default
- Use the hide settings from the controller.OverrideHide
- Hide the controller when interacting, overriding controller settings.OverrideDontHide
- Don't hide the controller when interacting, overriding controller settings.
InteractableObjectTouched
- Emitted when another object touches the current object.InteractableObjectUntouched
- Emitted when the other object stops touching the current object.InteractableObjectGrabbed
- Emitted when another object grabs the current object (e.g. a controller).InteractableObjectUngrabbed
- Emitted when the other object stops grabbing the current object.InteractableObjectUsed
- Emitted when another object uses the current object (e.g. a controller).InteractableObjectUnused
- Emitted when the other object stops using the current object.
Adding the VRTK_InteractableObject_UnityEvents
component to VRTK_InteractableObject
object allows access to UnityEvents
that will react identically to the Class Events.
OnTouch
- Emits the InteractableObjectTouched class event.OnUntouch
- Emits the InteractableObjectUntouched class event.OnGrab
- Emits the InteractableObjectGrabbed class event.OnUngrab
- Emits the InteractableObjectUngrabbed class event.OnUse
- Emits the InteractableObjectUsed class event.OnUnuse
- Emits the InteractableObjectUnused class event.
GameObject interactingObject
- The object that is initiating the interaction (e.g. a controller).
public bool CheckHideMode(bool defaultMode, ControllerHideMode overrideMode)
- Parameters
bool defaultMode
- The default setting of the controller. true = hide, false = don't hide.ControllerHideMode overrideMode
- The override setting of the object.- Returns
bool
- Returnstrue
if the combination ofdefaultMode
andoverrideMode
lead to "hide controller.
The CheckHideMode method is a simple service method used only by some scripts (e.g. InteractTouch InteractGrab InteractUse) to calculate the "hide controller" condition according to the default controller settings and the interactive object override method.
public bool IsTouched()
- Parameters
- none
- Returns
bool
- Returnstrue
if the object is currently being touched.
The IsTouched method is used to determine if the object is currently being touched.
public bool IsGrabbed()
- Parameters
- none
- Returns
bool
- Returnstrue
if the object is currently being grabbed.
The IsGrabbed method is used to determine if the object is currently being grabbed.
public bool IsUsing()
- Parameters
- none
- Returns
bool
- Returnstrue
if the object is currently being used.
The IsUsing method is used to determine if the object is currently being used.
public virtual void StartTouching(GameObject currentTouchingObject)
- Parameters
GameObject currentTouchingObject
- The game object that is currently touching this object.- Returns
- none
The StartTouching method is called automatically when the object is touched initially. It is also a virtual method to allow for overriding in inherited classes.
public virtual void StopTouching(GameObject previousTouchingObject)
- Parameters
GameObject previousTouchingObject
- The game object that was previously touching this object.- Returns
- none
The StopTouching method is called automatically when the object has stopped being touched. It is also a virtual method to allow for overriding in inherited classes.
public virtual void Grabbed(GameObject currentGrabbingObject)
- Parameters
GameObject currentGrabbingObject
- The game object that is currently grabbing this object.- Returns
- none
The Grabbed method is called automatically when the object is grabbed initially. It is also a virtual method to allow for overriding in inherited classes.
public virtual void Ungrabbed(GameObject previousGrabbingObject)
- Parameters
GameObject previousGrabbingObject
- The game object that was previously grabbing this object.- Returns
- none
The Ungrabbed method is called automatically when the object has stopped being grabbed. It is also a virtual method to allow for overriding in inherited classes.
public virtual void StartUsing(GameObject currentUsingObject)
- Parameters
GameObject currentUsingObject
- The game object that is currently using this object.- Returns
- none
The StartUsing method is called automatically when the object is used initially. It is also a virtual method to allow for overriding in inherited classes.
public virtual void StopUsing(GameObject previousUsingObject)
- Parameters
GameObject previousUsingObject
- The game object that was previously using this object.- Returns
- none
The StopUsing method is called automatically when the object has stopped being used. It is also a virtual method to allow for overriding in inherited classes.
public virtual void ToggleHighlight(bool toggle)
- Parameters
bool toggle
- The state to determine whether to activate or deactivate the highlight.true
will enable the highlight andfalse
will remove the highlight.- Returns
- none
The ToggleHighlight/1 method is used as a shortcut to disable highlights whilst keeping the same method signature. It should always be used with false
and it calls ToggleHighlight/2 with a Color.clear
.
public virtual void ToggleHighlight(bool toggle, Color globalHighlightColor)
- Parameters
bool toggle
- The state to determine whether to activate or deactivate the highlight.true
will enable the highlight andfalse
will remove the highlight.Color globalHighlightColor
- The colour to use when highlighting the object.- Returns
- none
The ToggleHighlight/2 method is used to turn on or off the colour highlight of the object.
public void PauseCollisions()
- Parameters
- none
- Returns
- none
The PauseCollisions method temporarily pauses all collisions on the object at grab time by removing the object's rigidbody's ability to detect collisions. This can be useful for preventing clipping when initially grabbing an item.
public bool AttachIsTrackObject()
- Parameters
- none
- Returns
bool
- Is true if the grab attach mechanic is one of the track types likeTrack Object
orRotator Track
.
The AttachIsTrackObject method is used to determine if the object is using one of the track grab attach mechanics.
public bool AttachIsClimbObject()
- Parameters
- none
- Returns
bool
- Is true if the grab attach mechanic isClimbable
.
The AttachIsClimbObject method is used to determine if the object is using the Climbable
grab attach mechanics.
public bool AttachIsKinematicObject()
- Parameters
- none
- Returns
bool
- Is true if the grab attach mechanic sets the object to a kinematic state on grab.
The AttachIsKinematicObject method is used to determine if the object has kinematics turned on at the point of grab.
public bool AttachIsStaticObject()
- Parameters
- none
- Returns
bool
- Is true if the grab attach mechanic is one of the static types likeClimbable
.
The AttachIsStaticObject method is used to determine if the object is using one of the static grab attach types.
public bool AttachIsUnthrowableObject()
- Parameters
- none
- Returns
bool
- Is true if the grab attach mechanic is of a type that shouldn't be considered thrown when released.
The AttachIsUnthrowableObject method is used to determine if the object is using one of the grab types that should not be thrown when released.
public void ZeroVelocity()
- Parameters
- none
- Returns
- none
The ZeroVelocity method resets the velocity and angular velocity to zero on the rigidbody attached to the object.
public void SaveCurrentState()
- Parameters
- none
- Returns
- none
The SaveCurrentState method stores the existing object parent and the object's rigidbody kinematic setting.
public void ToggleKinematic(bool state)
- Parameters
bool state
- The object's rigidbody kinematic state.- Returns
- none
The ToggleKinematic method is used to set the object's internal rigidbody kinematic state.
public GameObject GetGrabbingObject()
- Parameters
- none
- Returns
GameObject
- The game object of what is grabbing the current object.
The GetGrabbingObject method is used to return the game object that is currently grabbing this object.
public bool IsValidInteractableController(GameObject actualController, AllowedController controllerCheck)
- Parameters
GameObject actualController
- The game object of the controller that is being checked.AllowedController controllerCheck
- The value of which controller is allowed to interact with this object.- Returns
bool
- Is true if the interacting controller is allowed to grab the object.
The IsValidInteractableController method is used to check to see if a controller is allowed to perform an interaction with this object as sometimes controllers are prohibited from grabbing or using an object depedning on the use case.
public void ForceStopInteracting()
- Parameters
- none
- Returns
- none
The ForceStopInteracting method forces the object to no longer be interacted with and will cause a controller to drop the object and stop touching it. This is useful if the controller is required to auto interact with another object.
public void SetGrabbedSnapHandle(Transform handle)
- Parameters
Transform handle
- A transform of an object to use for the snap handle when the object is grabbed.- Returns
- none
The SetGrabbedSnapHandle method is used to set the snap handle of the object at runtime.
public void RegisterTeleporters()
- Parameters
- none
- Returns
- none
The RegisterTeleporters method is used to find all objects that have a teleporter script and register the object on the OnTeleported
event. This is used internally by the object for keeping Tracked objects positions updated after teleporting.
VRTK/Examples/005_Controller_BasicObjectGrabbing
uses the VRTK_InteractTouch
and VRTK_InteractGrab
scripts on the controllers to show how an interactable object can be grabbed and snapped to the controller and thrown around the game world.
VRTK/Examples/013_Controller_UsingAndGrabbingMultipleObjects
shows multiple objects that can be grabbed by holding the buttons or grabbed by toggling the button click and also has objects that can have their Using state toggled to show how multiple items can be turned on at the same time.
The Interact Touch script is attached to a Controller object within the [CameraRig]
prefab.
- Hide Controller On Touch: Hides the controller model when a valid touch occurs.
- Hide Controller Delay: The amount of seconds to wait before hiding the controller on touch.
- Global Touch Highlight Color: If the interactable object can be highlighted when it's touched but no local colour is set then this global colour is used.
- Custom Rigidbody Object: If a custom rigidbody and collider for the rigidbody are required, then a gameobject containing a rigidbody and collider can be passed into this parameter. If this is empty then the rigidbody and collider will be auto generated at runtime to match the HTC Vive default controller.
ControllerTouchInteractableObject
- Emitted when a valid object is touched.ControllerUntouchInteractableObject
- Emitted when a valid object is no longer being touched.
Adding the VRTK_InteractTouch_UnityEvents
component to VRTK_InteractTouch
object allows access to UnityEvents
that will react identically to the Class Events.
OnControllerTouchInteractableObject
- Emits the ControllerTouchInteractableObject class event.OnControllerUntouchInteractableObject
- Emits the ControllerUntouchInteractableObject class event.
uint controllerIndex
- The index of the controller doing the interaction.GameObject target
- The GameObject of the interactable object that is being interacted with by the controller.
public void ForceTouch(GameObject obj)
- Parameters
GameObject obj
- The game object to attempt to force touch.- Returns
- none
The ForceTouch method will attempt to force the controller to touch the given game object. This is useful if an object that isn't being touched is required to be grabbed or used as the controller doesn't physically have to be touching it to be forced to interact with it.
public GameObject GetTouchedObject()
- Parameters
- none
- Returns
GameObject
- The game object of what is currently being touched by this controller.
The GetTouchedObject method returns the current object being touched by the controller.
public bool IsObjectInteractable(GameObject obj)
- Parameters
GameObject obj
- The game object to check to see if it's interactable.- Returns
bool
- Is true if the given object is of typeVRTK_InteractableObject
.
The IsObjectInteractable method is used to check if a given game object is of type VRTK_InteractableObject
and whether the object is enabled.
public void ToggleControllerRigidBody(bool state)
- Parameters
bool state
- The state of whether the rigidbody is on or off.true
toggles the rigidbody on andfalse
turns it off.- Returns
- none
The ToggleControllerRigidBody method toggles the controller's rigidbody's ability to detect collisions. If it is true then the controller rigidbody will collide with other collidable game objects.
public bool IsRigidBodyActive()
- Parameters
- none
- Returns
bool
- Is true if the rigidbody on the controller is currently active and able to affect other scene rigidbodies.
The IsRigidBodyActive method checks to see if the rigidbody on the controller object is active and can affect other rigidbodies in the scene.
public void ForceStopTouching()
- Parameters
- none
- Returns
- none
The ForceStopTouching method will stop the controller from touching an object even if the controller is physically touching the object still.
public Collider[] ControllerColliders()
- Parameters
- none
- Returns
Collider[]
- An array of colliders that are associated with the controller.
The ControllerColliders method retrieves all of the associated colliders on the controller.
VRTK/Examples/005_Controller/BasicObjectGrabbing
demonstrates the highlighting of objects that have the VRTK_InteractableObject
script added to them to show the ability to highlight interactable objects when they are touched by the controllers.
The Interact Grab script is attached to a Controller object within the [CameraRig]
prefab and the Controller object requires the VRTK_ControllerEvents
script to be attached as it uses this for listening to the controller button events for grabbing and releasing interactable game objects. It listens for the AliasGrabOn
and AliasGrabOff
events to determine when an object should be grabbed and should be released.
The Controller object also requires the VRTK_InteractTouch
script to be attached to it as this is used to determine when an interactable object is being touched. Only valid touched objects can be grabbed.
An object can be grabbed if the Controller touches a game object which contains the VRTK_InteractableObject
script and has the flag isGrabbable
set to true
.
If a valid interactable object is grabbable then pressing the set Grab
button on the Controller (default is Grip
) will grab and snap the object to the controller and will not release it until the Grab
button is released.
When the Controller Grab
button is released, if the interactable game object is grabbable then it will be propelled in the direction and at the velocity the controller was at, which can simulate object throwing.
The interactable objects require a collider to activate the trigger and a rigidbody to pick them up and move them around the game world.
- Controller Attach Point: The rigidbody point on the controller model to snap the grabbed object to (defaults to the tip).
- Hide Controller On Grab: Hides the controller model when a valid grab occurs.
- Hide Controller Delay: The amount of seconds to wait before hiding the controller on grab.
- Grab Precognition: An amount of time between when the grab button is pressed to when the controller is touching something to grab it. For example, if an object is falling at a fast rate, then it is very hard to press the grab button in time to catch the object due to human reaction times. A higher number here will mean the grab button can be pressed before the controller touches the object and when the collision takes place, if the grab button is still being held down then the grab action will be successful.
- Throw Multiplier: An amount to multiply the velocity of any objects being thrown. This can be useful when scaling up the
[CameraRig]
to simulate being able to throw items further. - Create Rigid Body When Not Touching: If this is checked and the controller is not touching an Interactable Object when the grab button is pressed then a rigid body is added to the controller to allow the controller to push other rigid body objects around.
ControllerGrabInteractableObject
- Emitted when a valid object is grabbed.ControllerUngrabInteractableObject
- Emitted when a valid object is released from being grabbed.
Adding the VRTK_InteractGrab_UnityEvents
component to VRTK_InteractGrab
object allows access to UnityEvents
that will react identically to the Class Events.
OnControllerGrabInteractableObject
- Emits the ControllerGrabInteractableObject class event.OnControllerUngrabInteractableObject
- Emits the ControllerUngrabInteractableObject class event.
uint controllerIndex
- The index of the controller doing the interaction.GameObject target
- The GameObject of the interactable object that is being interacted with by the controller.
public void ForceRelease()
- Parameters
- none
- Returns
- none
The ForceRelease method will force the controller to stop grabbing the currently grabbed object.
public void AttemptGrab()
- Parameters
- none
- Returns
- none
The AttemptGrab method will attempt to grab the currently touched object without needing to press the grab button on the controller.
public GameObject GetGrabbedObject()
- Parameters
- none
- Returns
GameObject
- The game object of what is currently being grabbed by this controller.
The GetGrabbedObject method returns the current object being grabbed by the controller.
VRTK/Examples/005_Controller/BasicObjectGrabbing
demonstrates the grabbing of interactable objects that have the VRTK_InteractableObject
script attached to them. The objects can be picked up and thrown around.
VRTK/Examples/013_Controller_UsingAndGrabbingMultipleObjects
demonstrates that each controller can grab and use objects independently and objects can also be toggled to their use state simultaneously.
VRTK/Examples/014_Controller_SnappingObjectsOnGrab
demonstrates the different mechanisms for snapping a grabbed object to the controller.
The Interact Use script is attached to a Controller object within the [CameraRig]
prefab and the Controller object requires the VRTK_ControllerEvents
script to be attached as it uses this for listening to the controller button events for using and stop using interactable game objects. It listens for the AliasUseOn
and AliasUseOff
events to determine when an object should be used and should stop using.
The Controller object also requires the VRTK_InteractTouch
script to be attached to it as this is used to determine when an interactable object is being touched. Only valid touched objects can be used.
An object can be used if the Controller touches a game object which contains the VRTK_InteractableObject
script and has the flag isUsable
set to true
.
If a valid interactable object is usable then pressing the set Use
button on the Controller (default is Trigger
) will call the StartUsing
method on the touched interactable object.
- Hide Controller On Use: Hides the controller model when a valid use action starts.
- Hide Controller Delay: The amount of seconds to wait before hiding the controller on use.
ControllerUseInteractableObject
- Emitted when a valid object starts being used.ControllerUnuseInteractableObject
- Emitted when a valid object stops being used.
Adding the VRTK_InteractUse_UnityEvents
component to VRTK_InteractUse
object allows access to UnityEvents
that will react identically to the Class Events.
OnControllerUseInteractableObject
- Emits the ControllerUseInteractableObject class event.OnControllerUnuseInteractableObject
- Emits the ControllerUnuseInteractableObject class event.
uint controllerIndex
- The index of the controller doing the interaction.GameObject target
- The GameObject of the interactable object that is being interacted with by the controller.
public GameObject GetUsingObject()
- Parameters
- none
- Returns
GameObject
- The game object of what is currently being used by this controller.
The GetUsingObject method returns the current object being used by the controller.
public void ForceStopUsing()
- Parameters
- none
- Returns
- none
The ForceStopUsing method will force the controller to stop using the currently touched object and will also stop the object's using action.
public void ForceResetUsing()
- Parameters
- none
- Returns
- none
The ForceResetUsing will force the controller to stop using the currently touched object but the object will continue with it's existing using action.
VRTK/Examples/006_Controller_UsingADoor
simulates using a door object to open and close it. It also has a cube on the floor that can be grabbed to show how interactable objects can be usable or grabbable.
VRTK/Examples/008_Controller_UsingAGrabbedObject
which shows that objects can be grabbed with one button and used with another (e.g. firing a gun).
It is possible to automatically grab an Interactable Object to a specific controller by applying the Object Auto Grab script to the controller that the object should be grabbed by default.
The Object Auto Grab script is attached to a Controller object within the [CameraRig]
prefab and the Controller object requires the VRTK_InteractGrab
script to be attached.
- Object To Grab: A game object (either within the scene or a prefab) that will be grabbed by the controller on game start.
- Clone Grabbed Object: If this is checked then the Object To Grab will be cloned into a new object and attached to the controller leaving the existing object in the scene. This is required if the same object is to be grabbed to both controllers as a single object cannot be grabbed by different controllers at the same time. It is also required to clone a grabbed object if it is a prefab as it needs to exist within the scene to be grabbed.
VRTK/Examples/026_Controller_ForceHoldObject
shows how to automatically grab a sword to each controller and also prevents the swords from being dropped so they are permanently attached to the user's controllers.
This class allows player movement based on grabbing of VRTK_InteractableObject
objects that are tagged as Climbable
. It should be attached to the [CameraRig]
object. Because it works by grabbing, each controller should have a VRTK_InteractGrab
and VRTK_InteractTouch
component attached.
- Use Player Scale: Will scale movement up and down based on the player transform's scale.
- Use Gravity: Will allow physics based falling when the user lets go of objects above ground.
- Safe Zone Teleport Offset: An additional amount to move the player away from a wall if an ungrab teleport happens due to camera/object collisions.
PlayerClimbStarted
- Emitted when player climbing has started.PlayerClimbEnded
- Emitted when player climbing has ended.
Adding the VRTK_PlayerClimb_UnityEvents
component to VRTK_PlayerClimb
object allows access to UnityEvents
that will react identically to the Class Events.
OnPlayerClimbStarted
- Emits the PlayerClimbStarted class event.OnPlayerClimbEnded
- Emits the PlayerClimbEnded class event.
uint controllerIndex
- The index of the controller doing the interaction.GameObject target
- The GameObject of the interactable object that is being interacted with by the controller.
VRTK/Examples/037_CameraRig_ClimbingFalling
shows how to set up a scene with player climbing. There are many different examples showing how the same system can be used in unique ways.
extends VRTK_HeightAdjustTeleport
The dash teleporter extends the height adjust teleporter and allows to have the [CameraRig]
dashing to a new teleport location.
Like the basic teleporter and the height adjustable teleporter the Dash Teleport script is attached to the [CameraRig]
prefab and requires a World Pointer to be available.
The basic principle is to dash for a very short amount of time, to avoid sim sickness. The default value is 100 miliseconds. This value is fixed for all normal and longer distances. When the distances get very short the minimum speed is clamped to 50 mps, so the dash time becomes even shorter.
The minimum distance for the fixed time dash is determined by the minSpeed and normalLerpTime values, if you want to always lerp with a fixed mps speed instead, set the normalLerpTime to a high value. Right before the teleport a capsule is cast towards the target and registers all colliders blocking the way. These obstacles are then broadcast in an event so that for example their gameobjects or renderers can be turned off while the dash is in progress.
- Normal Lerp Time: The fixed time it takes to dash to a new position.
- Min Speed Mps: The minimum speed for dashing in meters per second.
- Capsule Top Offset: The Offset of the CapsuleCast above the camera.
- Capsule Bottom Offset: The Offset of the CapsuleCast below the camera.
- Capsule Radius: The radius of the CapsuleCast.
WillDashThruObjects
- Emitted when the CapsuleCast towards the target has found that obstacles are in the way.DashedThruObjects
- Emitted when obstacles have been crossed and the dash has ended.
Adding the VRTK_DashTeleport_UnityEvents
component to VRTK_DashTeleport
object allows access to UnityEvents
that will react identically to the Class Events.
OnWillDashThruObjects
- Emits the WillDashThruObjects class event.OnDashedThruObjects
- Emits the DashedThruObjects class event.
RaycastHit[] hits
- An array of objects that the CapsuleCast has collided with.
SteamVR_Unity_Toolkit/Examples/038_CameraRig_DashTeleport
shows how to turn off the mesh renderers of objects that are in the way during the dash.
To test a scene it is often necessary to use the headset to move to a location. This increases turn-around times and can become cumbersome. The simulator allows navigating through the scene using the keyboard instead, without the need to put on the headset. One can then move around (also through walls) while looking at the monitor and still use the controllers to interact.
The Simulator script is attached to the [CameraRig]
prefab. Supported movements are: forward, backward, strafe left, strafe right, turn left, turn right, up, down.
- Keys: Per default the keys on the left-hand side of the keyboard are used (WASD). They can be individually set as needed. The reset key brings the camera to its initial location.
- Only In Editor: Typically the simulator should be turned off when not testing anymore. This option will do this automatically when outside the editor.
- Step Size: Depending on the scale of the world the step size can be defined to increase or decrease movement speed.
- Cam Start: An optional game object marking the position and rotation at which the camera should be initially placed.
In order to interact with the world beyond grabbing and throwing, controls can be used to mimic real-life objects.
A number of controls are available which partially support auto-configuration. So can a slider for example detect its min and max points or a button the distance until a push event should be triggered. In the editor gizmos will be drawn that show the current settings. A yellow gizmo signals a valid configuration. A red one shows that the position of the object should change or switch to manual configuration mode.
All 3D controls extend the VRTK_Control
abstract class which provides common methods and events.
All 3D controls extend the VRTK_Control
abstract class which provides a default set of methods and events that all of the subsequent controls expose.
public ValueChangedEvent OnValueChanged
- Emitted when the control is interacted with.
OnValueChanged
- Emitted when the control is interacted with.
public float GetValue()
- Parameters
- none
- Returns
float
- The current value of the control.
The GetValue method returns the current value/position/setting of the control depending on the control that is extending this abstract class.
public float GetNormalizedValue()
- Parameters
- none
- Returns
float
- The current normalized value of the control.
The GetNormalizedValue method returns the current value mapped onto a range between 0 and 100.
public void SetContent(GameObject content, bool hideContent)
- Parameters
GameObject content
- The content to be considered within the control.bool hideContent
- When true the content will be hidden in addition to being non-interactable in case the control is fully closed.- Returns
- none
The SetContent method sets the given game object as the content of the control. This will then disable and optionally hide the content when a control is obscuring its view to prevent interacting with content within a control.
public GameObject GetContent()
- Parameters
- none
- Returns
GameObject
- The currently stored content for the control.
The GetContent method returns the current game object of the control's content.
extends VRTK_Control
Attaching the script to a game object will allow the user to interact with it as if it were a push button. The direction into which the button should be pushable can be freely set and auto-detection is supported. Since this is physics-based there needs to be empty space in the push direction so that the button can move.
The script will instantiate the required Rigidbody and ConstantForce components automatically in case they do not exist yet.
- Connected To: An optional game object to which the button will be connected. If the game object moves the button will follow along.
- Direction: The axis on which the button should move. All other axis will be frozen.
- Activation Distance: The local distance the button needs to be pushed until a push event is triggered.
- Button Strength: The amount of force needed to push the button down as well as the speed with which it will go back into its original position.
OnPush
- Emitted when the button is successfully pushed.
VRTK/Examples/025_Controls_Overview
shows a collection of pressable buttons that are interacted with by activating the rigidbody on the controller by pressing the grab button without grabbing an object.
extends VRTK_Control
Transforms a game object into a chest with a lid. The direction can be auto-detected with very high reliability or set manually.
The script will instantiate the required Rigidbody, Interactable and HingeJoint components automatically in case they do not exist yet. It will expect three distinct game objects: a body, a lid and a handle. These should be independent and not children of each other.
- Direction: The axis on which the chest should open. All other axis will be frozen.
- Lid: The game object for the lid.
- Body: The game object for the body.
- Handle: The game object for the handle.
- Content: The parent game object for the chest content elements.
- Hide Content: Makes the content invisible while the chest is closed.
- Max Angle: The maximum opening angle of the chest.
VRTK/Examples/025_Controls_Overview
shows a chest that can be open and closed, it also displays the current opening angle of the chest.
extends VRTK_Control
Transforms a game object into a door with an optional handle attached to an optional frame. The direction can be freely set and also very reliably auto-detected.
There are situations when it can be very hard to automatically calculate the correct axis and anchor values for the hinge joint. If this situation is encountered then simply add the hinge joint manually and set these two values. All the rest will still be handled by the script.
The script will instantiate the required Rigidbodies, Interactable and HingeJoint components automatically in case they do not exist yet. Gizmos will indicate the direction.
- Direction: The axis on which the door should open.
- Door: The game object for the door. Can also be an empty parent or left empty if the script is put onto the actual door mesh. If no colliders exist yet a collider will tried to be automatically attached to all children that expose renderers.
- Handles: The game object for the handles. Can also be an empty parent or left empty. If empty the door can only be moved using the rigidbody mode of the controller. If no collider exists yet a compound collider made up of all children will try to be calculated but this will fail if the door is rotated. In that case a manual collider will need to be assigned.
- Frame: The game object for the frame to which the door is attached. Should only be set if the frame will move as well to ensure that the door moves along with the frame.
- Content: The parent game object for the door content elements.
- Hide Content: Makes the content invisible while the door is closed.
- Max Angle: The maximum opening angle of the door.
- Open Inward: Can the door be pulled to open.
- Open Outward: Can the door be pushed to open.
- Snapping: Keeps the door closed with a slight force. This way the door will not gradually open due to some minor physics effect. Only works if either inward or outward is selected, not both.
VRTK/Examples/025_Controls_Overview
shows a selection of door types, from a normal door and trapdoor, to a door with a cat-flap in the middle.
extends VRTK_Control
Transforms a game object into a drawer. The direction can be freely set and also auto-detected with very high reliability.
The script will instantiate the required Rigidbody, Interactable and Joint components automatically in case they do not exist yet. There are situations when it can be very hard to automatically calculate the correct axis for the joint. If this situation is encountered simply add the configurable joint manually and set the axis. All the rest will still be handled by the script.
It will expect two distinct game objects: a body and a handle. These should be independent and not children of each other. The distance to which the drawer can be pulled out will automatically set depending on the length of it. If no body is specified the current object is assumed to be the body.
It is possible to supply a third game object which is the root of the contents inside the drawer. When this is specified the VRTK_InteractableObject components will be automatically deactivated in case the drawer is closed or not yet far enough open. This eliminates the issue that a user could grab an object inside a drawer although it is closed.
- Direction: The axis on which the drawer should open. All other axis will be frozen.
- Body: The game object for the body.
- Handle: The game object for the handle.
- Content: The parent game object for the drawer content elements.
- Hide Content: Makes the content invisible while the drawer is closed.
- Snapping: Keeps the drawer closed with a slight force. This way the drawer will not gradually open due to some minor physics effect.
VRTK/Examples/025_Controls_Overview
shows a drawer with contents that can be opened and closed freely and the contents can be removed from the drawer.
extends VRTK_Control
Attaching the script to a game object will allow the user to interact with it as if it were a radial knob. The direction can be freely set.
The script will instantiate the required Rigidbody and Interactable components automatically in case they do not exist yet.
- Direction: The axis on which the knob should rotate. All other axis will be frozen.
- Min: The minimum value of the knob.
- Max: The maximum value of the knob.
- Step Size: The increments in which knob values can change.
VRTK/Examples/025_Controls_Overview
has a couple of rotator knobs that can be rotated by grabbing with the controller and then rotating the controller in the desired direction.
extends VRTK_Control
Attaching the script to a game object will allow the user to interact with it as if it were a lever. The direction can be freely set.
The script will instantiate the required Rigidbody, Interactable and HingeJoint components automatically in case they do not exist yet. The joint is very tricky to setup automatically though and will only work in straight forward cases. If there are any issues, then create the HingeJoint component manually and configure it as needed.
- Direction: The axis on which the lever should rotate. All other axis will be frozen.
- Min Angle: The minimum angle of the lever counted from its initial position.
- Max Angle: The maximum angle of the lever counted from its initial position.
- Step Size: The increments in which lever values can change.
VRTK/Examples/025_Controls_Overview
has a couple of levers that can be grabbed and moved. One lever is horizontal and the other is vertical.
extends VRTK_Control
Attaching the script to a game object will allow the user to interact with it as if it were a horizontal or vertical slider. The direction can be freely set and auto-detection is supported.
The script will instantiate the required Rigidbody and Interactable components automatically in case they do not exist yet.
- Direction: The axis on which the slider should move. All other axis will be frozen.
- Min: The minimum value of the slider.
- Max: The maximum value of the slider.
- Step Size: The increments in which slider values can change. The slider supports snapping.
- Detect Min Max: Automatically detect the minimum and maximum positions.
- Min Point: The minimum point on the slider.
- Max Point: The maximum point on the slider.
VRTK/Examples/025_Controls_Overview
has a selection of sliders at various angles with different step values to demonstrate their usage.