问题描述
当玩家触碰场景A的起始传送盒时,场景从场景A切换到场景B,并降落在场景B的落地传送盒上。 我希望玩家在着陆时面向相同的方向,就像他开始前往门户时一样。 我不知道如何追踪它的 vector3 变换。 感谢您提前提供帮助。
解决方法
自动加载(单例)在场景变化中幸免于难。因此,您可以使用它们来存储在场景变化时必须保留的信息。
要创建自动加载,请转到“项目”菜单,然后选择“项目设置”选项,打开“项目设置”对话框,然后转到“自动加载”选项卡。
创建 - 或使用现有的 - 自动加载脚本,该脚本将保存您需要跟踪跨场景更改的任何变量。 例如,您可以将玩家得分、生命数和类似变量放在那里。
在这种情况下,您需要玩家头像的方向。
由于我们谈论的是 3D,我假设玩家头像是一个 Spatial
(或派生的)节点。此外,我将假设我们只想保留旋转。不是缩放,或任何其他转换。严格来说只是旋转。
仅旋转
你可以得到一个 Quat
代表这样的方向:
$Avatar.Transform.basis.get_rotation_quat()
并在更改场景之前将其存储在您的自动加载中:
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
(以及它的翻译),并带有一个旋转的基础 em> 由存储的 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