接下来我们将继续探索 Godot 的操作:实例化场景、访问节点层级以及使用 export 导出变量。

1.实例化
在Godot中没有Prefab或蓝图的概念,每个场景tscn文件都可以动态加载、实例化创建。例如新建一个名为bullet的tscn场景:

新建csharp脚本BallSpawn:
csharp
using Godot;
using System;
public partial class BallSpawn : Node3D
{
private PackedScene _bulletScene;
public override void _Ready()
{
_bulletScene = GD.Load<PackedScene>("res://bullet.tscn");
GenerateRandomBalls();
}
private void GenerateRandomBalls()
{
Random random = new Random();
for (int i = 0; i < 10; i++)
{
Node3D bullet = (Node3D)_bulletScene.Instantiate();
// 在半径为1的球体内生成随机位置
float x = (float)(random.NextDouble() * 2 - 1); // -1 到 1
float y = (float)(random.NextDouble() * 2 - 1); // -1 到 1
float z = (float)(random.NextDouble() * 2 - 1); // -1 到 1
// 归一化到半径为1的球体内
Vector3 randomPos = new Vector3(x, y, z);
// 如果要在球体表面生成:
// randomPos = randomPos.Normalized();
bullet.Position = randomPos;
AddChild(bullet);
}
}
}
将该脚本挂载到根节点上,点运行即可看见实例化出了10个小球。

2.层级访问
godot与其他游戏引擎不同,提供了较便捷的层级访问接口,可以快速定位到对应节点。
csharp
using Godot;
using System;
public partial class Test01 : Node3D
{
public override void _Ready()
{
var deepNode = GetNode("child01/child02");
GD.Print(deepNode.Name);
}
}

如果是获取父节点:
csharp
public override void _Ready()
{
// 获取父节点
var parent = GetNode("..");
// 获取父节点的父节点(祖父节点)
var grandParent = GetNode("../..");
// 获取更上层的节点
var greatGrandParent = GetNode("../../..");
// 打印节点名称
GD.Print($"父节点: {parent.Name}");
GD.Print($"祖父节点: {grandParent?.Name}");
}
3.Export
godot中,需要对编辑器公开的参数可标记Export去辨识。
