extends Camera3D class_name CameraManager var target:int var target_pos:Vector3 = Vector3.ZERO var target_pos_now:Vector3 = Vector3.ZERO var offset:Vector3 = Vector3(0,1,1) * 5 var level_size:Vector2 var camera_limit = Vector3(6.4,1.04,3.76) #x,up,z-downd func _ready(): Global.camera_mgr = self SignalManager.character_create.connect(on_character_create) SignalManager.character_pos_changed.connect(on_character_pos_changed) SignalManager.character_hit_floor.connect(on_character_hit_floor) SignalManager.character_destroy.connect(on_character_destroy) SignalManager.level_size_change.connect(on_level_size_change) SignalManager.level_loading_end.connect(on_level_loading_end) func _physics_process(delta): target_pos_lerp(0,delta,5) target_pos_lerp(1,delta,5) target_pos_lerp(2,delta,15) position = target_pos_now + offset func target_pos_lerp(index:int,delta:float,delta_scale:float): if abs(target_pos_now[index] - target_pos[index]) < Setting.pixel_size: target_pos_now[index] = Util.snap_float(target_pos[index]) else: target_pos_now[index] = lerp(target_pos_now[index], target_pos[index], delta * delta_scale) func on_character_create(id:int,team:Enum.ETeam,pos:Vector3): if team == Enum.ETeam.Player: target = id on_character_pos_changed(id,pos) on_character_hit_floor(id,pos) on_level_loading_end() func on_character_pos_changed(id:int,pos:Vector3): if id == target: target_pos.x = clamp(pos.x,camera_limit.x,level_size.x-camera_limit.x) target_pos.z = clamp(pos.z,camera_limit.y,level_size.y-camera_limit.z) func on_character_hit_floor(id:int,pos:Vector3): if id == target: target_pos.y = pos.y func on_character_destroy(id:int): target = 0 func on_level_size_change(size:Vector2): level_size = size func on_level_loading_end(): target_pos_now.x = target_pos.x target_pos_now.y = target_pos.y target_pos_now.z = target_pos.z