子场景 "slide" 可以在运行时进入父场景吗?

Can a child scene "slide" into a parent scene at runtime?

是否可以在运行时将场景(类型 Control)“滑动”到场景的中间。

我有一个“父”场景,中间有一个空白区域。我想将一系列场景“滑动”到父场景的中央空白区域。

我想做这样的事情,但是有动画:

var qi = load("res://Child1.tscn").instance()
qi.get_node("/root/Child1")
$VBoxContainer/MiddleArea.add_child(qi)

然后稍后,在相同或另一种类型的场景中滑动,具有不同或相同的数据:

var qi = load("res://Child1.tscn").instance()
qi.get_node("/root/Child1")
$VBoxContainer/MiddleArea.add_child(qi)

序列由数据库中的数据驱动,因此在设计时无法预测可能需要出现的场景序列。

如果我没理解错的话,你想要的可以用Tween来完成。

因此,首先将 Tween 添加到场景树中。我们可以将它保存在这样的变量中:

onready var tween := $Tween

然后我们可以用它来制作一个简单的动画:

$VBoxContainer/MiddleArea.add_child(qi)

var duration_seconds := 2.0
tween.interpolate_property(
    qi,
    "rect_position",
    Vector2(-qi.rect_size.x, qi.rect_position.y),
    qi.rect_position,
    duration_seconds,
    Tween.TRANS_CUBIC,
    Tween.EASE_OUT
)
tween.start()

此代码将为场景的位置设置动画。起始位置 Vector2(-qi.rect_size.x, qi.rect_position.y) 就在屏幕左侧的外侧。最终位置是场景在动画之前的位置。

如果您在此行循环添加多个以等待动画结束后再执行下一个:

yield(tween, "tween_all_completed")

如果您要将场景添加到设置场景位置的容器中,您可能需要这样添加:

qi.modulate = Color.transparent
$Container.add_child(qi)
yield(get_tree(), "idle_frame")
qi.self_modulate = Color.white

这里qi.modulate = Color.transparent将使场景不可见。然后我们将它添加到容器中,等待一帧yield(get_tree(), "idle_frame"),在此期间容器设置场景的位置。最后我们使用 qi.self_modulate = Color.white 恢复可见性。 我们必须让场景不可见,这样它就不会出现一帧就消失然后被动画化。而且我们不使用 visible 因为容器可能会跳过定位场景。