init
This commit is contained in:
46
scripts/camera_controller.gd
Normal file
46
scripts/camera_controller.gd
Normal file
@@ -0,0 +1,46 @@
|
||||
extends Node3D
|
||||
class_name CameraController
|
||||
|
||||
# Контроллер камеры в стиле Path of Exile 2
|
||||
# Изометрическая камера, которая следует за игроком
|
||||
|
||||
@export var target: Node3D = null
|
||||
@export var camera_distance: float = 20.0
|
||||
@export var camera_height: float = 15.0
|
||||
@export var camera_angle: float = 45.0 # Угол наклона камеры
|
||||
@export var follow_speed: float = 5.0
|
||||
|
||||
var camera: Camera3D
|
||||
|
||||
func _ready():
|
||||
camera = get_node_or_null("Camera3D")
|
||||
if not camera:
|
||||
camera = Camera3D.new()
|
||||
add_child(camera)
|
||||
|
||||
# Находим игрока если цель не установлена
|
||||
if not target:
|
||||
var players = get_tree().get_nodes_in_group("player")
|
||||
if players.size() > 0:
|
||||
target = players[0]
|
||||
|
||||
func _process(delta):
|
||||
if not target or not is_instance_valid(target):
|
||||
return
|
||||
|
||||
# Вычисляем позицию камеры
|
||||
var target_pos = target.global_position
|
||||
var angle_rad = deg_to_rad(camera_angle)
|
||||
|
||||
# Изометрическая позиция камеры (диагональный вид сверху, как в POE 2)
|
||||
# Камера находится под углом 45 градусов по диагонали
|
||||
var offset_x = camera_distance * 0.707 # cos(45) = 0.707
|
||||
var offset_z = camera_distance * 0.707 # sin(45) = 0.707
|
||||
var offset_y = camera_height
|
||||
|
||||
# Плавное следование за игроком
|
||||
var desired_pos = target_pos + Vector3(offset_x, offset_y, offset_z)
|
||||
global_position = global_position.lerp(desired_pos, follow_speed * delta)
|
||||
|
||||
# Камера всегда смотрит на игрока
|
||||
camera.look_at(target_pos, Vector3.UP)
|
||||
Reference in New Issue
Block a user