Godot-C#场景切换以及实现预制体

简介

在整个游戏工程中,存在n个游戏场景,经常需要对场景进行切换,比如进出房门、进入副本等。下面介绍下在Godot中实现场景切换的方法。

前置操作

创建多个场景

  1. 在Godot左下角的资源浏览器中,点击“新建”按钮,然后选择“场景”类型,创建新的场景文件,并设置一个主场景img
  2. 给场景添加标识物,方便区分不同场景。在下面例子中,我在scene_fst中,仅仅添加了一个名为SwitchScene的Node节点,然后绑定一个脚本,等下用来写切换场景的逻辑img
  3. 在scene_snd中添加一两个Sprite2D节点,然后吧项目默认的godot图标拖到这个Sprite2D节点上,如图所示img

经过上面的操作,我们得到了一个空的场景一:scene_fst,一个带有标识物的场景二:scene_snd,下面演示如何实现场景切换。注意:本文中配置了虚拟按键,如果未配置,请参考之前的文章进行配置。

场景切换

切换到场景文件

  1. 每个场景都有场景树,场景树所对应的类就是:SceneTree。切换场景的操作,就是在场景树中加载不同的场景文件。
  2. 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的项目设置中,将这个场景文件绑定到这个变量上。

  1. 首先在代码中声明场景变量,保存。
// 每一个场景都需要单独Export
[Export]
public PackedScene scene_snd;
[Export]
public PackedScene scene_trd;
  1. 切换到godot,重新编译
    img
  2. 双击第一个场景,可以看到右侧属性面板中,出现了新的变量,就是脚本中设置的scene_snd变量。
    img
  3. 将scene_snd.tscn文件拖到scene_snd变量上,保存。
    img

完整代码如下:

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中实现场景切换的方法,包括直接切换场景文件和使用静态变量配置场景路径两种方式。同时还介绍了如何实现预制体的实例化,方便在场景中重复使用对象。通过这些方法,可以更好地管理游戏场景和资源,提高开发效率。

posted @ 2025-10-19 20:45  Jonia430  阅读(14)  评论(0)    收藏  举报