init
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
@tool
|
||||
class_name XRToolsDesktopMovementDirect
|
||||
extends XRToolsMovementProvider
|
||||
|
||||
|
||||
## XR Tools Movement Provider for Direct Movement
|
||||
##
|
||||
## This script provides direct movement for the player. This script works
|
||||
## with the [XRToolsPlayerBody] attached to the players [XROrigin3D].
|
||||
##
|
||||
## The player may have multiple [XRToolsMovementDirect] nodes attached to
|
||||
## different controllers to provide different types of direct movement.
|
||||
|
||||
|
||||
## Movement provider order
|
||||
@export var order : int = 10
|
||||
|
||||
## Movement speed
|
||||
@export var max_speed : float = 3.0
|
||||
|
||||
## If true, the player can strafe
|
||||
@export var strafe : bool = false
|
||||
|
||||
## Input action for movement direction
|
||||
@export var input_forward : String = "ui_up"
|
||||
@export var input_backward : String = "ui_down"
|
||||
@export var input_left : String = "ui_left"
|
||||
@export var input_right : String = "ui_right"
|
||||
|
||||
|
||||
# XRStart node
|
||||
@onready var xr_start_node = XRTools.find_xr_child(
|
||||
XRTools.find_xr_ancestor(self,
|
||||
"*Staging",
|
||||
"XRToolsStaging"),"StartXR","Node")
|
||||
|
||||
|
||||
# Add support for is_xr_class on XRTools classes
|
||||
func is_xr_class(xr_name: String) -> bool:
|
||||
return xr_name == "XRToolsDesktopMovementDirect" or super(xr_name)
|
||||
|
||||
|
||||
# Perform jump movement
|
||||
func physics_movement(_delta: float, player_body: XRToolsPlayerBody, _disabled: bool):
|
||||
# Skip if the controller isn't active
|
||||
if !player_body.enabled or xr_start_node.is_xr_active():
|
||||
return
|
||||
|
||||
#Calculate input vector
|
||||
var input_dir = Input.get_vector(input_left, input_right, input_backward, input_forward)
|
||||
|
||||
# Apply forwards/backwards ground control
|
||||
player_body.ground_control_velocity.y += input_dir.y * max_speed
|
||||
|
||||
# Apply left/right ground control
|
||||
if strafe:
|
||||
player_body.ground_control_velocity.x += input_dir.x * max_speed
|
||||
|
||||
# Clamp ground control
|
||||
var length := player_body.ground_control_velocity.length()
|
||||
if length > max_speed:
|
||||
player_body.ground_control_velocity *= max_speed / length
|
||||
|
||||
## Find the right [XRToolsDesktopMovementDirect] node.
|
||||
##
|
||||
## This function searches from the specified node for the right controller
|
||||
## [XRToolsDesktopMovementDirect] assuming the node is a sibling of the [XROrigin3D].
|
||||
static func find(node : Node) -> XRToolsDesktopMovementDirect:
|
||||
return XRTools.find_xr_child(
|
||||
XRHelpers.get_xr_origin(node),
|
||||
"*",
|
||||
"XRToolsDesktopMovementDirect") as XRToolsDesktopMovementDirect
|
||||
Reference in New Issue
Block a user