简介
在整个游戏工程中,存在n个游戏场景,经常需要对场景进行切换,比如进出房门、进入副本等。下面介绍下在Godot中实现场景切换的方法。
前置操作
创建多个场景
- 在Godot左下角的资源浏览器中,点击“新建”按钮,然后选择“场景”类型,创建新的场景文件,并设置一个主场景
- 给场景添加标识物,方便区分不同场景。在下面例子中,我在scene_fst中,仅仅添加了一个名为SwitchScene的Node节点,然后绑定一个脚本,等下用来写切换场景的逻辑
- 在scene_snd中添加一两个Sprite2D节点,然后吧项目默认的godot图标拖到这个Sprite2D节点上,如图所示
经过上面的操作,我们得到了一个空的场景一:scene_fst,一个带有标识物的场景二:scene_snd,下面演示如何实现场景切换。注意:本文中配置了虚拟按键,如果未配置,请参考之前的文章进行配置。
切换到场景文件
- 每个场景都有场景树,场景树所对应的类就是:SceneTree。切换场景的操作,就是在场景树中加载不同的场景文件。
- SceneTree的ChangeSceneToFile方法可以实现加载指定的场景文件,从而实现场景切换。
下面的代码中,我们在输入事件中监听了一个虚拟按键,当按下这个按键时,切换到scene_snd场景。
using Godot;
using System;public partial class SwitchScene : Node2D
{// Called when the node enters the scene tree for the first time.public override void _Ready(){}// Called every frame. 'delta' is the elapsed time since the previous frame.public override void _Process(double delta){}public override void _Input(InputEvent @event){// 在输入监听方法中,监听一个虚拟按键,触发场景切换if (Input.IsActionJustPressed("Left")){// 首先获取当前场景树SceneTree tree = GetTree();// 1)跳转到scene_snd.tscn场景tree.ChangeSceneToFile("res://scene_snd.tscn"); }}
}
配置场景变量
一般来说,像路径这种可能发生变化的值,如果要在代码中用到的话,最好写在一个统一的地方,方便管理。上面我们说到场景树的类是:SceneTree,它属于场景,那场景也同样对应一个类:PackedScene。在类中需要创建一个可供切换的静态场景变量,比如:
场景一:
定义一个PackedScene类型的变量,直接加载指定的场景文件
public static PackedScene scene_snd = GD.Load<PackedScene>("res://scene_snd.tscn");
在切换场景时,直接调用ChangeSceneToPacked方法:
using Godot;
using System;public partial class SwitchScene : Node2D
{// 定义一个场景变量public static PackedScene scene_snd = (PackedScene)ResourceLoader.Load("res://scene_snd.tscn");public override void _Ready(){}public override void _Process(double delta){}public override void _Input(InputEvent @event){if (Input.IsActionJustPressed("Left")){// 首先获取当前场景树SceneTree tree = GetTree(); tree.ChangeSceneToPacked(scene_snd); }}
}
场景二:
定义一个PackedScene类型的变量,不显示的去定义这个场景,但是需要在godot的项目设置中,将这个场景文件绑定到这个变量上。
- 首先在代码中声明场景变量,保存。
// 每一个场景都需要单独Export
[Export]
public PackedScene scene_snd;
[Export]
public PackedScene scene_trd;
- 切换到godot,重新编译
- 双击第一个场景,可以看到右侧属性面板中,出现了新的变量,就是脚本中设置的scene_snd变量。
- 将scene_snd.tscn文件拖到scene_snd变量上,保存。
完整代码如下:
using Godot;
using System;public partial class SwitchScene : Node2D
{// 导出场景变量[Export]public PackedScene scene_snd;public override void _Ready(){}public override void _Process(double delta){}public override void _Input(InputEvent @event){if (Input.IsActionJustPressed("Left")){// 首先获取当前场景树SceneTree tree = GetTree();tree.ChangeSceneToPacked(scene_snd); }}
}
总结
通过上面的介绍,我们可以看到,在Godot中实现场景切换的方法有两种,一种是通过场景树的ChangeSceneToFile方法,另一种是通过场景树的ChangeSceneToPacked方法。前者通过文件路径切换场景,后者通过场景变量切换场景。通过场景变量,可以实现在代码中直接调用场景,而不需要在代码中写死场景路径。