【问题标题】:How to edit the vector class in godot editor?如何在 godot 编辑器中编辑矢量类?
【发布时间】:2021-09-15 06:32:06
【问题描述】:

我正在使用 godot 编辑器从网站创建简单的游戏。问题出在那个网站上,他们告诉他们使用一个名为“move_toward”的函数,但该函数在我正在使用的编辑器的矢量类中不可用。我在 github 中找到了一个解决方案,其中提到我应该将“move_toward”函数添加到 vector3.cpp 文件中,但我无法在项目的任何地方找到该文件。如何从 godot 编辑器中找到并编辑该 vector3 文件?

【问题讨论】:

    标签: godot


    【解决方案1】:

    你不能从编辑器编辑vector3.cpp...因为你没有它!

    如果你真的想编辑 vector3.cpp,你可以从 github 仓库下载 Godot 源代码,并进行自定义构建。见Compiling

    当然,您会想要 3.x 分支之一。除了,好吧,如果你下载并编译 3.3 分支,它已经有move_toward。您不妨下载官方版本。

    但是,回答如何查找和编辑vector3.cpp:它位于“godot/core/math/”文件夹中,在vector3.h旁边。你可以在vector3.cpp中添加一个函数,不要忘记在头文件中声明它。


    函数move_toward 是在 Godot 3.2 中添加的(撰写本文时的当前版本是 Godot 3.3.2)。如果你需要这个功能,更简单的解决方案是下载 Godot 的更新版本。

    我不知道 Godot Web 编辑器是否与这些相关。不过,它也在3.3.2版本上,move_toward在那里可用(我刚刚检查过),所以应该没问题。


    话虽如此,如果 - 无论出于何种原因 - 您必须使用旧版本的 Godot,我们也可以效仿 move_toward

    这段代码:

    var result:Vector3 = v.move_toward(to, delta)
    

    相当于这样:

    var result:Vector3 = to
    if v != to and v.distance_to(to) < delta:
        result = v + delta * v.direction_to(to)
    

    也就是说,向量v 在从vto 的方向上偏移了一个距离delta

    我们检查v.distance_to(to) &lt; delta 以确保我们不会超出第二个向量。我们检查v != to,因为当向量相等时,不需要计算。 其实还有一点点,我们会讲到的。

    上面的代码等价于:

    var result:Vector3 = to
    var vd = to - v
    if v != to and vd.length() < delta:
        result = v + delta * vd.normalized()
    

    在那里我计算了vto 之间的差异,并用它来获取距离(vd.length())和方向(vd.normalized())。

    相当于:

    var result:Vector3 = to
    var vd = to - v
    var len = vd.length()
    if v != to and len < delta:
        result = v + delta * (vd/len)
    

    因为归一化向量只是向量除以其长度。

    如您所见,如果两个向量相等(从一个向量到另一个向量的距离为零),那将是除以零。

    我们可以检查那个零:

    var result:Vector3 = to
    var vd = to - v
    var len = vd.length()
    if len > 0 and len < delta:
        result = v + delta * (vd/len)
    

    如果我们使用三元运算符条件,它看起来像这样:

    var vd = to - v
    var len = vd.length()
    var result = v + delta * (vd/len) if len > 0 and len < delta else to
    

    您可以将其与 the source code for move_toward 进行比较:

    Vector3 Vector3::move_toward(const Vector3 &p_to, const real_t p_delta) const {
        Vector3 v = *this;
        Vector3 vd = p_to - v;
        real_t len = vd.length();
        return len <= p_delta || len < CMP_EPSILON ? p_to : v + vd / len * p_delta;
    }
    

    条件被翻转。他们检查 len 是否与 epsilon(一些非常小的数字)而不是检查零。然而,希望你能看到它完成了同样的事情。

    当然,我们也可以将我们的版本包装在一个函数中。或许可以把它当作一个辅助类:

    class_name Vector3Helper extends Object
    
    static func move_toward(v:Vector3, to:Vector3, delta:float) -> Vector3:
        var vd = to - v
        var len = vd.length()
        if len > 0 and len < delta:
            return v + delta * (vd/len)
    
        return to
    

    然后不用写这段代码:

    var result:Vector3 = v.move_toward(to, delta)
    

    你可以写这个代码:

    var result:Vector3 = Vector3Helper.move_toward(v, to, delta)
    

    【讨论】:

    • 谢谢@Theraot 只是版本问题,更新了godot后,它可以工作了,这个助手类的解决方案将来也会很有帮助
    【解决方案2】:

    Godot 引擎的网页版有很多限制,如果你能在你的设备上下载 Godot 会更好Limitations
    我已经搜索过您是否可以编辑 Godot 的网络文件,但我找不到任何相关信息。在 Godot 的可执行版本中,已经有一个内置函数“move_toward”,还有很多你无法在 Web 编辑器中访问的功能。

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 2017-10-12
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多