extends CharacterBody3D class_name Fragment @export var sub: PackedScene @export var gravity_scale: float = 1.0 @export var alive_time: float = 1.0 var velocity_min: Vector2 = Vector2(0, 2) var velocity_max: Vector2 = Vector2(2, 4) @onready var sprite3D: Sprite3D = %Sprite3D as Sprite3D var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") var frame_rate: float = 0.1 var frame_time: float = 0 var fade_out_treshold: float = 0.5 func _ready(): var dir: Vector2 = Util.angle_dir(randf_range(0, 360)) * randf_range(velocity_min.x, velocity_max.x) velocity.x = dir.x velocity.z = dir.y velocity.y = randf_range(velocity_min.y, velocity_max.y) alive_time += randf_range(0, 0.5) func _process(delta: float) -> void: velocity.y -= gravity * gravity_scale * delta if velocity.length() > 0.01: var frame_count: int = sprite3D.hframes * sprite3D.vframes var frame_time_all: float = frame_rate * frame_count frame_time += delta sprite3D.frame = int(frame_time / frame_rate) % frame_count frame_time = fmod(frame_time, frame_time_all) move_and_slide() var collision_count: int = get_slide_collision_count() if collision_count > 0: var normal: Vector3 = Vector3.ZERO for i in collision_count: var collision: KinematicCollision3D = get_slide_collision(i) normal += collision.get_normal() normal = normal.normalized() if sub: Global.effect_mgr.cast_particle(sub, global_position, normal) queue_free() #反弹 velocity = (velocity - normal * velocity.dot(normal)) * 0.8 alive_time -= delta if alive_time < fade_out_treshold: sprite3D.modulate.a = alive_time / fade_out_treshold if alive_time <= 0: queue_free()