extends CharacterBody3D @export var player: Node3D @export var follow_speed: float = 4.0 @export var right_offset: float = 2.5 @export var forward_offset: float = 1 @export var car_cinematic : bool = false @onready var anim_player: AnimationPlayer = $frog/AnimationPlayer var size : float = 0.5 @onready var arms: MeshInstance3D = $frog/Armature/Skeleton3D/arms @onready var body: MeshInstance3D = $frog/Armature/Skeleton3D/body @onready var eyes: MeshInstance3D = $frog/Armature/Skeleton3D/eyes @onready var feet: MeshInstance3D = $frog/Armature/Skeleton3D/feet @onready var hands: MeshInstance3D = $frog/Armature/Skeleton3D/hands @onready var legs: MeshInstance3D = $frog/Armature/Skeleton3D/legs @onready var mesh = [ arms, body, eyes, feet, hands, legs ] # Variables pour la gravité var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") func _ready() -> void: if !car_cinematic: scale = Vector3( size, size, size ) func _process(delta: float) -> void: if car_cinematic: if anim_player.current_animation != "idle": anim_player.play("idle") else: scale_frog() # transparent blue color var dist = global_transform.origin.distance_to(player.camera.global_transform.origin) for m in mesh: for i in m.get_surface_override_material_count(): var mat = m.get_active_material(i) if mat: mat.set_shader_parameter("object_dist_to_camera", dist) func _physics_process(delta): if not player or car_cinematic: return # Appliquer la gravité if not is_on_floor(): velocity.y -= gravity * delta var target_position = player.global_position + (player.global_transform.basis.x * right_offset) + (-player.global_transform.basis.z * forward_offset) global_position.y = target_position.y var direction = global_position.direction_to(target_position) var distance = global_position.distance_to(target_position) if distance > 15: # tp target_position = player.global_position + (player.global_transform.basis.x * right_offset) + (-player.global_transform.basis.z * (-forward_offset*4) ) global_position = target_position velocity.x = 0 velocity.z = 0 elif distance > 0.5: # walk velocity.x = direction.x * follow_speed velocity.z = direction.z * follow_speed else: # idle velocity.x = 0 velocity.z = 0 var look_target = player.global_position look_target.y = global_position.y look_at(look_target, Vector3.UP) var real_speed = Vector2(get_real_velocity().x, get_real_velocity().z).length() # Si frog n'est pas bloquée par un mur if real_speed > 0.1: size += 0.0 if anim_player.current_animation != "walk": anim_player.play("walk", 0.2) else: if anim_player.current_animation != "idle": anim_player.play("idle", 0.2) move_and_slide() func scale_frog(): var tween = create_tween() var final_scale = Vector3(size, size, size) tween.tween_property(self, "scale", final_scale, 2)