44 lines
1.4 KiB
GDScript
44 lines
1.4 KiB
GDScript
extends Node3D
|
|
|
|
|
|
@export_range(0.0, 1.0) var sensitivity: float = 0.25
|
|
|
|
# Mouse state
|
|
var _mouse_position = Vector2(0.0, 0.0)
|
|
var _total_pitch = 0.0
|
|
var _vel_multiplier = 4
|
|
|
|
func _input(event):
|
|
# Receives mouse motion
|
|
if event is InputEventMouseMotion:
|
|
_mouse_position = event.relative
|
|
# Receives mouse button input
|
|
if event is InputEventMouseButton:
|
|
match event.button_index:
|
|
MOUSE_BUTTON_RIGHT: # Only allows rotation if right click down
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED if event.pressed else Input.MOUSE_MODE_VISIBLE)
|
|
MOUSE_BUTTON_WHEEL_UP: # Increases max velocity
|
|
_vel_multiplier = clamp(_vel_multiplier * 1.1, 0.2, 20)
|
|
MOUSE_BUTTON_WHEEL_DOWN: # Decereases max velocity
|
|
_vel_multiplier = clamp(_vel_multiplier / 1.1, 0.2, 20)
|
|
|
|
# Updates mouselook and movement every frame
|
|
func _process(_update):
|
|
_update_mouselook()
|
|
var camera = get_node("Camera3D")
|
|
camera.far = 150.0
|
|
|
|
func _update_mouselook():
|
|
# Only rotates mouse if the mouse is captured
|
|
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
|
|
_mouse_position *= sensitivity
|
|
var yaw = _mouse_position.x
|
|
var pitch = _mouse_position.y
|
|
_mouse_position = Vector2(0, 0)
|
|
|
|
# Prevents looking up/down too far
|
|
pitch = clamp(pitch, -20 - _total_pitch, 60 - _total_pitch)
|
|
_total_pitch += pitch
|
|
|
|
rotate_y(deg_to_rad(-yaw))
|
|
rotate_object_local(Vector3(1,0,0), deg_to_rad(-pitch))
|