Skip to content

Commit 37836c1

Browse files
committed
add freelook camera
1 parent 176f323 commit 37836c1

File tree

3 files changed

+73
-1
lines changed

3 files changed

+73
-1
lines changed

addons/free_camera.gd

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
class_name FreelookCamera3D extends Camera3D
2+
3+
@export var movement_speed := 10
4+
@export var mouse_sensitivity := 0.006
5+
6+
var _previous_camera: Camera3D
7+
var _camera_input_direction := Vector2.ZERO
8+
9+
10+
func _ready() -> void:
11+
current = false
12+
process_mode = PROCESS_MODE_ALWAYS
13+
set_process(current)
14+
15+
16+
func _input(event: InputEvent) -> void:
17+
if event.is_action_pressed("toggle_freelook_camera"):
18+
_toggle_camera_mode()
19+
20+
if current:
21+
var is_camera_motion := (
22+
event is InputEventMouseMotion and
23+
Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED
24+
)
25+
if is_camera_motion:
26+
_camera_input_direction = event.relative * mouse_sensitivity
27+
28+
29+
func _process(delta: float) -> void:
30+
var movement := Vector3.ZERO
31+
if Input.is_key_pressed(KEY_W):
32+
movement += Vector3.FORWARD
33+
if Input.is_key_pressed(KEY_A):
34+
movement += Vector3.LEFT
35+
if Input.is_key_pressed(KEY_S):
36+
movement += Vector3.BACK
37+
if Input.is_key_pressed(KEY_D):
38+
movement += Vector3.RIGHT
39+
if Input.is_key_pressed(KEY_Q):
40+
movement += Vector3.DOWN
41+
if Input.is_key_pressed(KEY_E):
42+
movement += Vector3.UP
43+
44+
rotation.x -= _camera_input_direction.y
45+
rotation.x = clampf(rotation.x, -PI / 2.0, PI / 2.0)
46+
rotation.y -= _camera_input_direction.x
47+
48+
global_position += global_transform.basis * movement * delta * movement_speed
49+
50+
_camera_input_direction = Vector2.ZERO
51+
52+
53+
func _toggle_camera_mode() -> void:
54+
if not current:
55+
_previous_camera = get_viewport().get_camera_3d()
56+
fov = _previous_camera.fov
57+
global_transform = _previous_camera.global_transform
58+
make_current()
59+
else:
60+
_previous_camera.make_current()
61+
62+
get_tree().paused = current
63+
set_process(current)

game.tscn

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
[gd_scene load_steps=5 format=3 uid="uid://bvt4747kc5u2t"]
1+
[gd_scene load_steps=6 format=3 uid="uid://bvt4747kc5u2t"]
22

33
[ext_resource type="Script" path="res://game.gd" id="1_1il7v"]
44
[ext_resource type="PackedScene" uid="uid://b1ot6gn6tms6h" path="res://lesson_reference/player_3d_template.tscn" id="1_w0p8v"]
5+
[ext_resource type="Script" path="res://addons/free_camera.gd" id="5_5y4mc"]
56
[ext_resource type="PackedScene" uid="uid://cnedxfn2pxh2t" path="res://level/level.tscn" id="7_2frud"]
67
[ext_resource type="PackedScene" uid="uid://bxg6oejpaitdt" path="res://level/interactable/flag/flag_reached_screen.tscn" id="19_cpgj4"]
78

@@ -15,3 +16,6 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.43638, 0, -7.8513)
1516

1617
[node name="Level" parent="." instance=ExtResource("7_2frud")]
1718
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 31.4)
19+
20+
[node name="FreelookCamera3D" type="Camera3D" parent="."]
21+
script = ExtResource("5_5y4mc")

project.godot

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ left_click={
7474
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null)
7575
]
7676
}
77+
toggle_freelook_camera={
78+
"deadzone": 0.5,
79+
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194341,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
80+
]
81+
}
7782

7883
[rendering]
7984

0 commit comments

Comments
 (0)