|  |  |  | 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() |