extends Camera3D @export var height := 1.7 @export var move_duration := 1 var tween: Tween var _history: Array[Transform3D] = [] var _is_moving := false func _ready() -> void: ClickManager.camera_move_requested.connect(_move_to) func _set_position(pos: Vector3) -> void: var t := global_transform t.origin = pos global_transform = t func _move_to(target: Transform3D) -> void: # Save current position before moving _history.append(global_transform) var start_transform := global_transform var end_transform := target #end_transform.origin.y = height if tween: tween.kill() tween = create_tween().set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT) tween.tween_method(_set_position, start_transform.origin, end_transform.origin, move_duration) tween.parallel().tween_method( _set_rotation, Quaternion(start_transform.basis), Quaternion(end_transform.basis), move_duration ) func go_back() -> void: if _history.is_empty() or _is_moving: return var previous: Transform3D = _history.pop_back() var start_transform := global_transform var end_transform := previous if tween: tween.kill() _is_moving = true tween = create_tween().set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT) tween.tween_method(_set_position, start_transform.origin, end_transform.origin, move_duration) tween.parallel().tween_method( _set_rotation, Quaternion(start_transform.basis), Quaternion(end_transform.basis), move_duration ) tween.tween_callback(func(): _is_moving = false) func _set_rotation(q: Quaternion) -> void: var t := global_transform t.basis = Basis(q.normalized()) global_transform = t func has_history() -> bool: return not _history.is_empty()