43 lines
1.4 KiB
GDScript3
43 lines
1.4 KiB
GDScript3
|
extends Spatial
|
||
|
|
||
|
var yaw_pitch = Vector2.ZERO
|
||
|
var mouse_look_sensitivity = 0.1
|
||
|
var controller_look_sensitivity = 3
|
||
|
var target_yaw_pitch = Vector2.ZERO
|
||
|
var look_acceleration = 0.4
|
||
|
|
||
|
|
||
|
func _ready():
|
||
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
||
|
|
||
|
func rotate_camera(relative : Vector2):
|
||
|
target_yaw_pitch -= relative*PI/180.0
|
||
|
target_yaw_pitch.x = wrapf(target_yaw_pitch.x, -PI, PI)
|
||
|
target_yaw_pitch.y = clamp(target_yaw_pitch.y, -PI/2.0, PI/2.0)
|
||
|
|
||
|
func _input(event):
|
||
|
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
|
||
|
if event is InputEventMouseMotion:
|
||
|
rotate_camera(event.relative * mouse_look_sensitivity)
|
||
|
if Input.is_action_just_pressed("ui_cancel"):
|
||
|
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
||
|
else:
|
||
|
if event is InputEventMouseButton:
|
||
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
||
|
|
||
|
var look_relative = Vector2(
|
||
|
Input.get_action_strength("player_look_right") - Input.get_action_strength("player_look_left"),
|
||
|
Input.get_action_strength("player_look_down") - Input.get_action_strength("player_look_up")
|
||
|
)
|
||
|
rotate_camera(look_relative * controller_look_sensitivity)
|
||
|
|
||
|
func _process(_delta):
|
||
|
yaw_pitch.x = wrapf(lerp_angle(yaw_pitch.x, target_yaw_pitch.x, look_acceleration), -PI, PI)
|
||
|
yaw_pitch.y = lerp_angle(yaw_pitch.y, target_yaw_pitch.y, look_acceleration)
|
||
|
|
||
|
rotation = Vector3.ZERO
|
||
|
rotate_y(yaw_pitch.x)
|
||
|
|
||
|
$Rotation.rotation = Vector3.ZERO
|
||
|
$Rotation.rotate_x(yaw_pitch.y)
|