2024-02-07 23:02:27 +01:00

47 lines
1.1 KiB
GDScript

extends Camera3D
@export_group("Main")
@export var follow_node: Node3D
@export var pivot_node: Node3D
@export_group("Follow")
@export var follow_enabled: bool
@export var follow_speed: float
@export_group("Shake")
@export var shake_strength := 1.0
@export var shake_decay := 0.8
@export var shake_noise: Noise
var trauma := 0.0
var trauma_time := 0.0
func _ready():
Global.camera = self
func _process(delta):
if Global.player == null:
return
if follow_enabled:
follow_node.position = lerp(follow_node.position, Global.player.position, follow_speed * delta)
else:
follow_node.position = Global.player.position
if trauma:
trauma = max(trauma - shake_decay * delta, 0)
trauma_time += 4096 * delta
_shake(trauma_time)
else:
look_at(pivot_node.global_position)
trauma_time = 0
func _shake(time):
var trauma_sq := trauma * trauma
rotation.x += shake_noise.get_noise_2d(time, 0) * trauma_sq * shake_strength
rotation.y += shake_noise.get_noise_2d(time, 1) * trauma_sq * shake_strength
rotation.z += shake_noise.get_noise_2d(time, 2) * trauma_sq * shake_strength
func add_shake(amount: float):
trauma = min(trauma + amount, 1.0)