【问题标题】:How do I make copies of a Node in Godot如何在 Godot 中制作节点的副本
【发布时间】:2022-02-19 09:11:41
【问题描述】:

我是刚接触过统一的 Godot 的新手,我不知道如何复制对象/节点。我试过重复功能没有效果。我最近的尝试尝试创建与父节点具有相同属性的子节点。我似乎无法到达任何地方,将不胜感激。这是我尝试创建子节点的代码:

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);         
    }

}

还有谁能告诉我场景中的对象/节点/项目实际上被称为什么以及如何引用它?它是 Node 还是 Gamedot.Object 或其他什么?以及如何获取和设置它的属性?我只是真的习惯了团结,无法弄清楚这些东西。我找到的唯一教程是 Godot 语言,而且我已经知道 c#,所以我更愿意用它来编程。

【问题讨论】:

    标签: c# visual-studio game-engine godot


    【解决方案1】:

    节点是引用

    我相信您希望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# 属性一样获取和设置它们。虽然您应该也可以使用GetSet 方法,但这是为动态代码设计的。

    如果您正在寻找的是如何使属性在检查器面板中可用,您可以通过添加 [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 内容:FinePointCGIBurgZerg ArcadeAbdullahBeIndie - Alan ThornGodot 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中启动动画。

    顺便说一句,这是不言而喻的,但是:对于您在网上找到的任何代码,请尝试了解其背后的原因。当它不起作用时,它将为您省去麻烦,您必须弄清楚如何解决它。

    【讨论】:

    • 感谢您抽出宝贵时间回答我的问题,这对我很有帮助!
    【解决方案2】:

    • 基本节点类是不可见的(灰色),因此您看不到它们是否被添加。您可以在运行时在场景树中从本地切换到远程选项卡,只看到添加了一个不可见节点。
    • 如果您将代码更改为 AddChild(copynode).Duplicate();,您可以看到它添加了所有 5 个不可见节点。

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 2020-09-16
      • 2019-04-17
      • 2021-06-30
      • 2016-06-07
      • 2012-08-19
      相关资源
      最近更新 更多