【发布时间】:2021-09-25 21:12:22
【问题描述】:
当玩家触摸场景 A 的起始传送门框时,将场景从场景 A 切换到场景 B,并降落在场景 B 的着陆传送门框上。 我希望玩家在降落时面向同一个方向,就像他开始进入传送门时一样。 我不知道如何处理它的 vector3 变换。 感谢您提前提供帮助。
【问题讨论】:
-
感谢 tresor bireke 的编辑。我是堆栈流的新手,所以我不知道如何编辑。现在我知道该怎么做了。
当玩家触摸场景 A 的起始传送门框时,将场景从场景 A 切换到场景 B,并降落在场景 B 的着陆传送门框上。 我希望玩家在降落时面向同一个方向,就像他开始进入传送门时一样。 我不知道如何处理它的 vector3 变换。 感谢您提前提供帮助。
【问题讨论】:
自动加载(单例)在场景变化后仍然存在。因此,您可以使用它们来存储必须在场景变化后保留下来的信息。
要创建自动加载,请转到“项目”菜单,然后选择“项目设置”选项,打开“项目设置”对话框,然后转到“自动加载”选项卡。
创建 - 或使用现有的 - 自动加载脚本,该脚本将保存您需要在场景变化中跟踪的任何变量。 例如,您可以将玩家得分、生命数和类似变量放在那里。
在这种情况下,您需要玩家头像的方向。
由于我们谈论的是 3D,我假设玩家头像是 Spatial(或派生的)节点。另外我会假设我们只想保持旋转。不是缩放或任何其他转换。严格来说只是旋转。
仅轮换
你可以得到一个Quat,它代表这样的方向:
$Avatar.Transform.basis.get_rotation_quat()
并在更改场景之前将其存储在您的 atuoload 中:
AutoloadName.orientation = $Avatar.Transform.basis.get_rotation_quat()
然后,在准备好新场景时,您可以检索并设置它,这需要创建一个新的Transform。
我们可以将我们存储的旋转与我们在目的地上的Basis 结合起来,如下所示:
var quat = AutoloadName.orientation
var basis = $Avatar.Transform.basis
var new_basis:Basis = Basis(quat.xfrom(basis.x), quat.xfrom(basis.y), quat.xfrom(basis.z))
$Avatar.Transform = Transform(new_basis, $Avatar.Transform.origin)
需要明确的是,我在该代码中所做的是创建一个新的 Transform,它将保留其 origin(以及它的翻译),其基础 rotated存储Quat。所以它实际上会结合旋转。
或者,我们可以从Quat 创建一个新的基础:
var quat = AutoloadName.orientation
$Avatar.Transform = Transform(Basis(quat), $Avatar.Transform.origin)
这也意味着目标的任何缩放都将丢失。
好吧,我们可以读取目的地的缩放比例,然后再次缩放:
var scale = $Avatar.Transform.basis.get_scale()
var quat = AutoloadName.orientation
$Avatar.Transform = Transform(Basis(quat).scaled(scale), $Avatar.Transform.origin)
这样它将具有目的地的缩放,以及您存储的旋转。 请注意,基可以表示缩放和旋转以外的变换(例如倾斜)。
旋转和缩放
如果可以保留缩放等,但不能保留平移,则可以简单存储basis:
AutoloadName.basis = $Avatar.Transform.basis
然后设置它:
$Avatar.Transform = Transform(AutoloadName.basis, $Avatar.Transform.origin)
完全变换
当然,如果你也想保留翻译,你只需存储Transform:
AutoloadName.transform = $Avatar.Transform
然后设置它:
$Avatar.Transform = AutoloadName.transform
【讨论】: