@tool extends Interactable2D class_name Closeup2D # 退出信号,默认 arg 为 null,可能是一个 bool 值,从 packed_scene 的 exit 信号中传递过来 signal exit(arg) # 第一次交互时的气泡文字(unrevealed -> revealed) 如果为空则跳过 @export var first_interact_os_key := "" @export var packed_scene: PackedScene @export var quit_closeup_on_exit := true var current_child: Node func _ready() -> void: super._ready() if Engine.is_editor_hint(): return interacted.connect(_close_up_interacted) func _close_up_interacted() -> void: if interacted_times == 1 and first_interact_os_key: SceneManager.freeze_player(0) sign_mark.display_sign = false var tween = await SceneManager.pop_os_with_str(first_interact_os_key) tween.tween_interval(0.5) tween.tween_callback(display) tween.tween_callback(func(): sign_mark.display_sign = true) else: display() # 可以直接调用 func display() -> void: if current_child: # 先退出 _exit() if packed_scene: SceneManager.freeze_player(0) # 展示时,禁用 sign_mark 的输入 sign_mark.pass_unhandled_input = true current_child = packed_scene.instantiate() add_child(current_child) if current_child.has_signal("exit"): current_child.connect("exit", _exit) elif GlobalConfig.DEBUG: print("[特写界面] no exit signal, packed_scene:", packed_scene) func _exit(arg = null): if current_child: SceneManager.release_player() current_child.queue_free() exit.emit(arg) # 退出时,恢复 sign_mark 的输入 sign_mark.pass_unhandled_input = false func _unhandled_input(event: InputEvent) -> void: if not current_child: return if ( quit_closeup_on_exit and (event.is_action_pressed("cancel") or event.is_action_pressed("escape")) ): _exit() get_viewport().set_input_as_handled() # 在有特写界面时,阻塞 interact 输入 elif event.is_action_pressed("interact"): get_viewport().set_input_as_handled()