相机 lerp 优化

master
chendian 2 years ago
parent 6c2e2eed3c
commit ba89eac583

@ -7,7 +7,7 @@ class_name Move
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
func _physics_process(delta): func _process(delta):
if status.is_pause:return if status.is_pause:return
var is_hit_floor = update_on_floor(delta) var is_hit_floor = update_on_floor(delta)
update_speed_y(delta) update_speed_y(delta)

@ -2,10 +2,11 @@ extends Camera3D
class_name CameraManager class_name CameraManager
var target:int var target:int
var target_pos:Vector3 = Vector3.ZERO var target_pos:Vector2 = Vector2.ZERO
var target_pos_now:Vector3 = Vector3.ZERO var target_pos_y:float
var offset:Vector3 = Vector3(0,1,1) * 5 var target_pos_now:Vector2 = Vector2.ZERO
var level_size:Vector2 var level_size:Vector2
var offset:float = 5
var camera_limit = Vector3(6.4,1.04,3.76) #x,up,z-downd var camera_limit = Vector3(6.4,1.04,3.76) #x,up,z-downd
func _ready(): func _ready():
@ -17,17 +18,21 @@ func _ready():
SignalManager.level_size_change.connect(on_level_size_change) SignalManager.level_size_change.connect(on_level_size_change)
SignalManager.level_loading_end.connect(on_level_loading_end) SignalManager.level_loading_end.connect(on_level_loading_end)
func _physics_process(delta): func _process(delta):
target_pos_lerp(0,delta,5) target_pos_lerp(0,delta,5)
target_pos_lerp(1,delta,5) target_pos_lerp(1,delta,5)
target_pos_lerp(2,delta,15) position.x = target_pos_now.x
position = target_pos_now + offset position.z = target_pos_now.y + offset
position.y = offset
func target_pos_lerp(index:int,delta:float,delta_scale:float): func target_pos_lerp(index:int,delta:float,delta_scale:float):
if abs(target_pos_now[index] - target_pos[index]) < Setting.pixel_size: var diff = abs(target_pos_now[index] - target_pos[index])
if diff < Setting.pixel_size:
target_pos_now[index] = Util.snap_float(target_pos[index]) target_pos_now[index] = Util.snap_float(target_pos[index])
else: else:
target_pos_now[index] = lerp(target_pos_now[index], target_pos[index], delta * delta_scale) var weight_min = Setting.pixel_size / 2 / diff
var weight = max(delta * delta_scale,weight_min)
target_pos_now[index] = lerp(target_pos_now[index], target_pos[index], weight)
func on_character_create(id:int,team:Enum.ETeam,pos:Vector3): func on_character_create(id:int,team:Enum.ETeam,pos:Vector3):
if team == Enum.ETeam.Player: if team == Enum.ETeam.Player:
@ -39,19 +44,16 @@ func on_character_create(id:int,team:Enum.ETeam,pos:Vector3):
func on_character_pos_changed(id:int,pos:Vector3): func on_character_pos_changed(id:int,pos:Vector3):
if id == target: if id == target:
target_pos.x = clamp(pos.x,camera_limit.x,level_size.x-camera_limit.x) 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) target_pos.y = clamp(pos.z-target_pos_y,camera_limit.y,level_size.y-camera_limit.z)
func on_character_hit_floor(id:int,pos:Vector3): func on_character_hit_floor(id:int,pos:Vector3):
if id == target: if id == target:
target_pos.y = pos.y target_pos_y = pos.y
target_pos.y = clamp(pos.z-target_pos_y,camera_limit.y,level_size.y-camera_limit.z)
func on_character_destroy(id:int): func on_character_destroy(id:int):target = 0
target = 0 func on_level_size_change(size:Vector2):level_size = size
func on_level_size_change(size:Vector2):
level_size = size
func on_level_loading_end(): func on_level_loading_end():
target_pos_now.x = target_pos.x target_pos_now.x = target_pos.x
target_pos_now.y = target_pos.y target_pos_now.y = target_pos.y
target_pos_now.z = target_pos.z

Loading…
Cancel
Save