supervisor-simulator/scripts/SceneTransit.cs
2026-01-18 20:05:23 +08:00

50 lines
1.7 KiB
C#

using Godot;
/// <summary>
/// 场景过渡控制器
/// </summary>
public partial class SceneTransit : CanvasLayer {
// Called when the node enters the scene tree for the first time.
/// <summary>
/// 场景加载完成时调用
/// </summary>
public override void _Ready() {
Layer = -1;
Hide();
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
/// <summary>
/// 每帧更新
/// </summary>
/// <param name="delta">帧间隔</param>
public override void _Process(double delta) { }
/// <summary>
/// 切换场景
/// </summary>
/// <param name="nextScene">下一场景路径</param>
/// <param name="needLoadResources">是否需要加载资源</param>
/// <param name="animation">过渡动画名称</param>
/// <param name="waitSecond">等待时间</param>
public async void Transit(string nextScene, bool needLoadResources = true, string animation = "transit",
float waitSecond = 0) {
SetProcess(true);
GameManager.NextScene = nextScene;
var ap = GetNode<AnimationPlayer>("AnimationPlayer");
Layer = 9999;
Show();
ap.Play(animation);
await ToSignal(ap, AnimationMixer.SignalName.AnimationFinished);
if (waitSecond > 0) await ToSignal(GetTree().CreateTimer(waitSecond), SceneTreeTimer.SignalName.Timeout);
if (needLoadResources)
GetTree().ChangeSceneToFile("res://scenes/loader.tscn");
else
GetTree().ChangeSceneToFile(nextScene);
ap.PlayBackwards(animation);
await ToSignal(ap, AnimationMixer.SignalName.AnimationFinished);
Layer = -1;
Hide();
SetProcess(false);
}
}