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