节点是引用
我相信您希望Node 表现为值类型,但实际上它是一个引用。让我们来看看会发生什么:
这里声明一个Node类型的变量,并将其初始化为一个新的Node:
Node copynode = new Node();
然后在这里你用正在执行此脚本的Node 覆盖它:
copynode = this;
然后你尝试将Node 添加为它自己的子元素五次:
AddChild(copynode);
这当然行不通。 你这样做了五次。
让我们很高兴这不起作用。因为如果是这样,您将拥有一个 Node,它会生成 5 个自身的副本,每个副本也会生成 5 个自身的副本,您可以想象这是如何进行的。 这就是为什么我不会给你一些代码来做到这一点。
如您所知,有一个重复的方法。我怀疑您希望它将副本添加到场景树中。然而,它并没有这样做。相反,它会返回副本,您必须添加它(或用它做其他事情)。
您的问题
还有谁能告诉我场景中的对象/节点/项目实际上被称为什么以及如何引用它?
我不确定你的意思。但是,如果有帮助,this 将引用正在执行脚本的对象。
它是 Node 还是 Gamedot.Object 或其他什么?
Godot.Node 类继承自 Godot.Object。如果将脚本附加到Node,则脚本的类必须继承Node 的类型,它可以是Godot.Node 或继承自Godot.Node 的类。 希望对你有帮助。
我如何获取和设置它的属性?
您可以像任何 C# 属性一样获取和设置它们。虽然您应该也可以使用Get 和Set 方法,但这是为动态代码设计的。
如果您正在寻找的是如何使属性在检查器面板中可用,您可以通过添加 [Export] 属性来实现。例如:
[Export]
public float Speed;
选择具有脚本的对象时,它应该出现在检查器面板中。
我找到的唯一教程是 Godot 语言的,而且我已经知道 c#,所以我更愿意用它来编程。
大部分教程都在 GDScript 中,因为:
- 有两个 Godot 版本。一个带有 C#,一个没有 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 中使用 Nodes 完成的。
此外,来自 Unity 的您可能会期望“预制”、“场景”和“节点”之间存在一些区别。没有。一个场景里面可以有其他的场景,场景就是节点。正如我所说,您将使用节点而不是组件。
这并不意味着一切都是节点。您绝对可以创建不是节点的类。制作资源类可能特别有用,但这是它自己的主题。
虽然场景是节点,但有一点区别:场景是序列化的节点。因此,如果您想创建一个可以多次实例化的整体,那么您需要创建一个场景。然后您可以将该场景添加为另一个场景中的节点 - 它就是它。同样,当您导入可以放置在场景中的模型时……模型就是场景。
有一个加载和实例化场景的例子:
var scene = (PackedScene)ResourceLoader.Load("res://scenes/Scene.tscn");
Node scene_instance = ground.Instance();
AddChild(scene_instance);
我不知道这是否是你试图用你的代码做的,但我想我会提到它,以防万一。
您是否正在寻找资产商店。 Godot 没有资产store,因为它什么也没卖给你。相反,它有一个资产 library,您可以从编辑器顶部的“AssetLib”按钮访问它。重申一下,一切都是免费的,它什么也不卖给你。如果您想要一些商业资产,您将不得不在其他地方找到它们。
这提醒了我,Godot 中 3D 模型的首选格式是 GLTF(这是一个开放标准 - 不像其他一些格式是专有格式)。
戈多有办法
有时,当人们从一种工具换到另一种工具时,他们会尝试坚持使用旧工具的方式。举个简单的例子,您不需要进行复杂的数学运算来相对于另一个对象定位对象,您只需将其设为子对象……但如果您无法将其设为子对象?有RemoteTransform 节点可以做到这一点。不涉及代码。
Godot 充满了隐藏在表面之下的特征,发现它们是有价值的。如果你正在为某事苦苦挣扎,也许有一种戈多的方式。如果没有,可以添加。
我会告诉你一个特别强大的功能:AnimationPlayer 节点可以为任何导出的属性设置动画。事实上,它可以调用方法。也可以在其他AnimationPlayers中启动动画。
顺便说一句,这是不言而喻的,但是:对于您在网上找到的任何代码,请尝试了解其背后的原因。当它不起作用时,它将为您省去麻烦,您必须弄清楚如何解决它。