43 lines
1.3 KiB
GDScript
43 lines
1.3 KiB
GDScript
extends Node3D
|
|
|
|
var center = Vector3.ZERO
|
|
var screen_size
|
|
@export var LIMIT_ZOOM = [1.0, 4.0]
|
|
|
|
func _ready() -> void:
|
|
$Camera3D.position.y = 2.0
|
|
screen_size = get_viewport().get_visible_rect().size
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
camera_player_movement()
|
|
camera_player_zoom()
|
|
|
|
func camera_player_movement():
|
|
var mouse_pos = get_viewport().get_mouse_position()
|
|
|
|
# Récupération de la position de la souris par rapport aux mondes
|
|
# En tirant un raycast
|
|
var camera = get_viewport().get_camera_3d()
|
|
var from = camera.project_ray_origin(mouse_pos)
|
|
var dir = camera.project_ray_normal(mouse_pos)
|
|
var mouse_pos_world = Plane(Vector3.UP, 0).intersects_ray(from, dir)
|
|
|
|
var dragging = Input.is_action_pressed("dragging")
|
|
|
|
if (dragging && center == Vector3.ZERO):
|
|
center = mouse_pos_world
|
|
elif (dragging):
|
|
var distance_center_mouse = center - mouse_pos_world
|
|
$Camera3D.position.x += distance_center_mouse.x
|
|
$Camera3D.position.z += distance_center_mouse.z
|
|
elif (not dragging):
|
|
center = Vector3.ZERO
|
|
|
|
func camera_player_zoom():
|
|
if (Input.is_action_just_released("zoom-in")):
|
|
$Camera3D.position.y -= 0.1
|
|
elif (Input.is_action_just_released("zoom-out")):
|
|
$Camera3D.position.y += 0.1
|
|
# Mettre une limite au zomm de la caméra
|
|
$Camera3D.position.y = clamp($Camera3D.position.y, LIMIT_ZOOM[0], LIMIT_ZOOM[1])
|