如何在 Godot 中复制节点
How do I make copies of a Node in Godot
我刚开始使用 Godot,我不知道如何复制 object/node。我试过复制功能没有效果。我最近的尝试尝试创建与父节点具有相同 属性 的子节点。我似乎无法到达任何地方,将不胜感激。这是我尝试创建子节点的代码:
Node copynode = new Node();
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
copynode = this;
for (int i = 0; i < 5; i++)
{
AddChild(copynode);
}
}
也有人能告诉我场景中的 object/node/item 实际调用的是什么以及如何引用它吗?它是节点还是 Gamedot.Object 还是其他?我如何获取和设置它的属性?我只是真的习惯了统一,无法弄清楚这些东西。我找到的唯一教程是使用 Godot 语言的,而且我已经有点了解 c#,所以我更愿意用它来编程。
- 基本节点 class 是不可见的(灰色),因此您看不到它们是否已添加。您可以在场景树中从本地切换到远程选项卡,同时 运行 只看到添加了一个不可见节点。
- 如果将代码更改为
AddChild(copynode).Duplicate();
,您可以看到它添加了所有 5 个不可见节点。
节点是引用
我相信您希望 Node
表现为值类型,但实际上它是一个引用。让我们来看看发生了什么:
这里声明了一个Node
类型的变量,并初始化为一个新的Node
:
Node copynode = new Node();
然后在这里用正在执行此脚本的 Node
覆盖它:
copynode = this;
然后您尝试将 Node
添加为自身的 child 五次:
AddChild(copynode);
这当然行不通。 你这样做了五次。
让我们庆幸这行不通。因为如果它这样做了,你就有了一个 Node
它自己制作了 5 个副本,每个副本也制作了 5 个自己的副本,并且你可以想象这是怎么回事。 这就是为什么我不会给你一些代码来做到这一点。
如您所知,有一个重复的方法。我怀疑您希望它将副本添加到场景树中。但是它不会那样做。相反,它 returns 是副本,你必须添加它(或用它做其他事情)。
您的问题
Also could someone tell me what the object/node/item in the scene is actually called and how to reference it?
我不太清楚你的意思。但是,如果有帮助,this
将引用正在执行脚本的 object。
Is it a Node or a Gamedot.Object or something else?
class Godot.Node
继承自 Godot.Object
。如果您将脚本附加到 Node
,则脚本的 class 必须继承 Node
的类型,可以是 Godot.Node
或 class继承自 Godot.Node
。 希望对您有所帮助。
And how do I get and set its properties?
您可以像任何 C# 一样获取和设置它们 属性。虽然您也应该能够使用 Get
和 Set
方法,但那是为动态代码设计的。
如果您正在寻找的是如何使属性在检查器面板中可用,您可以通过添加 [Export]
属性来实现。例如:
[Export]
public float Speed;
And it should appear in the inspector panel when the object that has the script is selected.
The only tutorials I find are in the Godot language, and I kind of know c# already so I would prefer to program in that.
大部分教程都使用 GDScript,因为:
- 有两个 Godot 构建。一种使用 C#,另一种不使用它。但是两者都可以使用 GDScript。因此,无论您使用哪个版本,GDScript 都是有用的。
- 从 GDScript 转换为 C# 并不困难。它主要是命名约定(以及一些边缘情况,您在开始时可能不会遇到)。参见 C# API differences to GDScript。
- C# 与 Godot 一起使用的方式遵循 C# 约定。 我认为它比 Unity 更接近他们。尽管在信号和异步方法方面存在一些粗糙的边缘。
观看 GDQuest 的视频 Intro to C# in Godot 3.1: Your First Script (tutorial)。
我还会推荐被低估的视频 Godot C# Delegate Tutorial。
还有一些 YouTube 频道有一些我发现的 C# Godot 内容:FinePointCGI, BurgZerg Arcade, Abdullah, BeIndie - Alan Thorn, Godot Academy。
给刚到 Godot 的 Unity 开发者的一些建议
既然您熟悉 C#,那就继续使用 C#。
顺便说一下,我个人的建议是使用外部编辑器(例如 Visual Studio 或 Visual Studio Code,Godot 有一些不错的插件)而不是使用集成的编辑器。因为 - 即使认为 C# 是完全支持的 - C# 与编辑器的集成很差。
另请注意,可以在同一个项目中同时使用 C# 和 GDScript,或者使用 Godot 可视化脚本,或者可以添加到 Godot 的其他语言(如果您真的想要,甚至可以使用 C++)。你使用多少 C# 取决于你。
因此,您可以充分利用每种语言。例如,与 GDScript 相比,您可以使用 C# 获得一些额外的性能,并可以访问所有 .NET 库和一些现代语言功能。并使用 GDScript 作为与 Godot 其余部分的粘合剂(例如导出变量和连接信号,以及调用 C#)。
如果您决定结合使用 GDScript 和 C#,请注意 GDScript 无法正确使用 C# 异步方法。我的建议是在需要异步交互时围绕信号进行设计。
在你问如何使用组件之前。有多种方法可以在 Godot 之上构建组件系统,但它不包括一种。你可能不需要它们。 Unity 对组件所做的大部分工作都是在 Godot 中用 Node
s 完成的。
此外,来自 Unity,您可能期望“预制件”、“场景”和“节点”之间存在一些区别。没有。一个场景里面可以有其他的场景,场景就是节点。正如我所说,您将使用节点而不是组件。
这并不意味着一切都是节点。您绝对可以创建不是节点的 classes。制作资源 classes 可能特别有用,但那是它自己的主题。
虽然场景是节点,但还是有一点区别:场景是一个序列化的节点。因此,如果你想创造一个完整的东西t可以多次实例化,那么你要创建一个场景。然后您可以将该场景作为节点添加到另一个场景中。同样,当您导入可以放置在场景中的模型时……模型就是场景。
有加载实例化场景的例子:
var scene = (PackedScene)ResourceLoader.Load("res://scenes/Scene.tscn");
Node scene_instance = ground.Instance();
AddChild(scene_instance);
我不知道这是否是您要对代码执行的操作,但我想我会提到它,以防万一。
您在寻找资产商店吗? Godot 没有资产 store,因为它不卖给你任何东西。相反,它有一个资产 库 ,您可以从编辑器顶部的“AssetLib”按钮访问它。重申一下,那里的一切都是免费的,它不会卖给你任何东西。如果你想要一些商业资产,你将不得不在别处找到它们。
提醒我,Godot 中 3D 模型的首选格式是 GLTF(这是一个开放标准 - 不像其他格式那样是专有格式)。
戈多有办法
有时,当人们从一种工具转向另一种工具时,他们会尝试坚持使用旧工具的方式。举一个简单的例子,你不需要做复杂的数学运算来定位一个 object 相对于另一个,你只需将它设为 child... 但是如果你不能将它设为 child?有 RemoteTransform
节点可以做到这一点。不涉及代码。
Godot 充满了隐藏在表面之下的特性,发现它们很有价值。如果你正在为某件事而苦苦挣扎,也许有一种 Godot 方式。如果没有,可以添加。
我会告诉你一个特别强大的:AnimationPlayer
节点可以为任何导出的 属性 设置动画。事实上,它可以调用方法。它也可以在其他AnimationPlayer
秒开始动画。
顺便说一句,这是不言而喻的,但是:对于您在网上找到的任何代码,请尝试理解其背后的原因。当它不起作用而您必须弄清楚如何修复它时,它会为您省去麻烦。
我刚开始使用 Godot,我不知道如何复制 object/node。我试过复制功能没有效果。我最近的尝试尝试创建与父节点具有相同 属性 的子节点。我似乎无法到达任何地方,将不胜感激。这是我尝试创建子节点的代码:
Node copynode = new Node();
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
copynode = this;
for (int i = 0; i < 5; i++)
{
AddChild(copynode);
}
}
也有人能告诉我场景中的 object/node/item 实际调用的是什么以及如何引用它吗?它是节点还是 Gamedot.Object 还是其他?我如何获取和设置它的属性?我只是真的习惯了统一,无法弄清楚这些东西。我找到的唯一教程是使用 Godot 语言的,而且我已经有点了解 c#,所以我更愿意用它来编程。
- 基本节点 class 是不可见的(灰色),因此您看不到它们是否已添加。您可以在场景树中从本地切换到远程选项卡,同时 运行 只看到添加了一个不可见节点。
- 如果将代码更改为
AddChild(copynode).Duplicate();
,您可以看到它添加了所有 5 个不可见节点。
节点是引用
我相信您希望 Node
表现为值类型,但实际上它是一个引用。让我们来看看发生了什么:
这里声明了一个Node
类型的变量,并初始化为一个新的Node
:
Node copynode = new Node();
然后在这里用正在执行此脚本的 Node
覆盖它:
copynode = this;
然后您尝试将 Node
添加为自身的 child 五次:
AddChild(copynode);
这当然行不通。 你这样做了五次。
让我们庆幸这行不通。因为如果它这样做了,你就有了一个 Node
它自己制作了 5 个副本,每个副本也制作了 5 个自己的副本,并且你可以想象这是怎么回事。 这就是为什么我不会给你一些代码来做到这一点。
如您所知,有一个重复的方法。我怀疑您希望它将副本添加到场景树中。但是它不会那样做。相反,它 returns 是副本,你必须添加它(或用它做其他事情)。
您的问题
Also could someone tell me what the object/node/item in the scene is actually called and how to reference it?
我不太清楚你的意思。但是,如果有帮助,this
将引用正在执行脚本的 object。
Is it a Node or a Gamedot.Object or something else?
class Godot.Node
继承自 Godot.Object
。如果您将脚本附加到 Node
,则脚本的 class 必须继承 Node
的类型,可以是 Godot.Node
或 class继承自 Godot.Node
。 希望对您有所帮助。
And how do I get and set its properties?
您可以像任何 C# 一样获取和设置它们 属性。虽然您也应该能够使用 Get
和 Set
方法,但那是为动态代码设计的。
如果您正在寻找的是如何使属性在检查器面板中可用,您可以通过添加 [Export]
属性来实现。例如:
[Export]
public float Speed;
And it should appear in the inspector panel when the object that has the script is selected.
The only tutorials I find are in the Godot language, and I kind of know c# already so I would prefer to program in that.
大部分教程都使用 GDScript,因为:
- 有两个 Godot 构建。一种使用 C#,另一种不使用它。但是两者都可以使用 GDScript。因此,无论您使用哪个版本,GDScript 都是有用的。
- 从 GDScript 转换为 C# 并不困难。它主要是命名约定(以及一些边缘情况,您在开始时可能不会遇到)。参见 C# API differences to GDScript。
- C# 与 Godot 一起使用的方式遵循 C# 约定。 我认为它比 Unity 更接近他们。尽管在信号和异步方法方面存在一些粗糙的边缘。
观看 GDQuest 的视频 Intro to C# in Godot 3.1: Your First Script (tutorial)。
我还会推荐被低估的视频 Godot C# Delegate Tutorial。
还有一些 YouTube 频道有一些我发现的 C# Godot 内容:FinePointCGI, BurgZerg Arcade, Abdullah, BeIndie - Alan Thorn, Godot Academy。
给刚到 Godot 的 Unity 开发者的一些建议
既然您熟悉 C#,那就继续使用 C#。
顺便说一下,我个人的建议是使用外部编辑器(例如 Visual Studio 或 Visual Studio Code,Godot 有一些不错的插件)而不是使用集成的编辑器。因为 - 即使认为 C# 是完全支持的 - C# 与编辑器的集成很差。
另请注意,可以在同一个项目中同时使用 C# 和 GDScript,或者使用 Godot 可视化脚本,或者可以添加到 Godot 的其他语言(如果您真的想要,甚至可以使用 C++)。你使用多少 C# 取决于你。
因此,您可以充分利用每种语言。例如,与 GDScript 相比,您可以使用 C# 获得一些额外的性能,并可以访问所有 .NET 库和一些现代语言功能。并使用 GDScript 作为与 Godot 其余部分的粘合剂(例如导出变量和连接信号,以及调用 C#)。
如果您决定结合使用 GDScript 和 C#,请注意 GDScript 无法正确使用 C# 异步方法。我的建议是在需要异步交互时围绕信号进行设计。
在你问如何使用组件之前。有多种方法可以在 Godot 之上构建组件系统,但它不包括一种。你可能不需要它们。 Unity 对组件所做的大部分工作都是在 Godot 中用 Node
s 完成的。
此外,来自 Unity,您可能期望“预制件”、“场景”和“节点”之间存在一些区别。没有。一个场景里面可以有其他的场景,场景就是节点。正如我所说,您将使用节点而不是组件。
这并不意味着一切都是节点。您绝对可以创建不是节点的 classes。制作资源 classes 可能特别有用,但那是它自己的主题。
虽然场景是节点,但还是有一点区别:场景是一个序列化的节点。因此,如果你想创造一个完整的东西t可以多次实例化,那么你要创建一个场景。然后您可以将该场景作为节点添加到另一个场景中。同样,当您导入可以放置在场景中的模型时……模型就是场景。
有加载实例化场景的例子:
var scene = (PackedScene)ResourceLoader.Load("res://scenes/Scene.tscn");
Node scene_instance = ground.Instance();
AddChild(scene_instance);
我不知道这是否是您要对代码执行的操作,但我想我会提到它,以防万一。
您在寻找资产商店吗? Godot 没有资产 store,因为它不卖给你任何东西。相反,它有一个资产 库 ,您可以从编辑器顶部的“AssetLib”按钮访问它。重申一下,那里的一切都是免费的,它不会卖给你任何东西。如果你想要一些商业资产,你将不得不在别处找到它们。
提醒我,Godot 中 3D 模型的首选格式是 GLTF(这是一个开放标准 - 不像其他格式那样是专有格式)。
戈多有办法
有时,当人们从一种工具转向另一种工具时,他们会尝试坚持使用旧工具的方式。举一个简单的例子,你不需要做复杂的数学运算来定位一个 object 相对于另一个,你只需将它设为 child... 但是如果你不能将它设为 child?有 RemoteTransform
节点可以做到这一点。不涉及代码。
Godot 充满了隐藏在表面之下的特性,发现它们很有价值。如果你正在为某件事而苦苦挣扎,也许有一种 Godot 方式。如果没有,可以添加。
我会告诉你一个特别强大的:AnimationPlayer
节点可以为任何导出的 属性 设置动画。事实上,它可以调用方法。它也可以在其他AnimationPlayer
秒开始动画。
顺便说一句,这是不言而喻的,但是:对于您在网上找到的任何代码,请尝试理解其背后的原因。当它不起作用而您必须弄清楚如何修复它时,它会为您省去麻烦。