如何在 Godot 编辑器中编辑向量 class?
How to edit the vector class in godot editor?
我正在使用 godot 编辑器从网站创建简单的游戏。问题出在他们告诉他们使用名为“move_toward”的函数的网站上,但该函数在我正在使用的编辑器的向量 class 中不可用。我在 github 中找到了一个解决方案,其中提到我应该将“move_toward”函数添加到 vector3.cpp 文件中,但我无法在项目的任何位置找到该文件。如何从 Godot 编辑器中查找和编辑该 vector3 文件?
Web 版的 Godot Engine 有很多限制,如果您能在您的设备上下载 Godot 就更好了Limitations。
我搜索过您是否可以编辑 Godot 的网络文件,但我找不到任何相关信息。在 Godot 的可执行版本中,已经有一个内置函数“move_toward”,还有很多您在网络编辑器中无法访问的函数。
您无法从编辑器编辑 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
在v
到to
的方向上偏移了delta
的距离。
我们检查 v.distance_to(to) < delta
以确保我们不会超过第二个矢量。我们检查 v != to
因为当向量相等时就不需要计算了。 其实还不止这些,我们慢慢讲。
以上代码等价于:
var result:Vector3 = to
var vd = to - v
if v != to and vd.length() < delta:
result = v + delta * vd.normalized()
我计算了 v
和 to
之间的差异,并用它来获得距离 (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:
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)
我正在使用 godot 编辑器从网站创建简单的游戏。问题出在他们告诉他们使用名为“move_toward”的函数的网站上,但该函数在我正在使用的编辑器的向量 class 中不可用。我在 github 中找到了一个解决方案,其中提到我应该将“move_toward”函数添加到 vector3.cpp 文件中,但我无法在项目的任何位置找到该文件。如何从 Godot 编辑器中查找和编辑该 vector3 文件?
Web 版的 Godot Engine 有很多限制,如果您能在您的设备上下载 Godot 就更好了Limitations。
我搜索过您是否可以编辑 Godot 的网络文件,但我找不到任何相关信息。在 Godot 的可执行版本中,已经有一个内置函数“move_toward”,还有很多您在网络编辑器中无法访问的函数。
您无法从编辑器编辑 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
在v
到to
的方向上偏移了delta
的距离。
我们检查 v.distance_to(to) < delta
以确保我们不会超过第二个矢量。我们检查 v != to
因为当向量相等时就不需要计算了。 其实还不止这些,我们慢慢讲。
以上代码等价于:
var result:Vector3 = to
var vd = to - v
if v != to and vd.length() < delta:
result = v + delta * vd.normalized()
我计算了 v
和 to
之间的差异,并用它来获得距离 (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:
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)