Godot-C#场景切换以及实现预制体
简介
在整个游戏工程中,存在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中也有预制体的概念,但它与其他引擎有些不同。Godot中的预制体并不是简单的对象,而是一组资源文件,包括场景文件、材质文件、动画文件等。比如说:
在射击游戏中,开火的时候需要射出大量的子弹,那子弹对象就可以做成预制体,实现运动、碰撞等逻辑,然后在场景中实例化使用。如果需要100发子弹,那么就实例化100个预制体,这样可以节省资源,提高效率。
代码实现
跟之前一样创建场景变量,不同的是,这次不是切换场景,而是进行实例化,在当前场景中继续使用。实例化方法:
// 假设定义一个新的场景名为:bullet
public static PackedScene bullet_scene = (PackedScene)ResourceLoader.Load("res://bullet.tscn");
// 在需要的时候实例化
Node bulletInstance = bullet_scene.Instantiate();
完整代码如下:
using Godot;
using System;
public partial class SwitchScene : Node2D
{
[Export]
public PackedScene bullet_scene;
public override void _Ready()
{
}
public override void _Process(double delta)
{
}
public override void _Input(InputEvent @event)
{
if (Input.IsActionJustPressed("Right"))
{
// 实例化预制体
Node bullet = bullet_scene.Instantiate();
// 将预制体添加到当前场景
this.GetTree().CurrentScene.AddChild(bullet);
}
}
}
总结
本文介绍了Godot中实现场景切换的方法,包括直接切换场景文件和使用静态变量配置场景路径两种方式。同时还介绍了如何实现预制体的实例化,方便在场景中重复使用对象。通过这些方法,可以更好地管理游戏场景和资源,提高开发效率。

浙公网安备 33010602011771号