浮动来源

概览

Unity 以单精度浮点格式存储 GameObject 的位置值。这非常适合可以精确表示的小值;但是由于浮点舍入错误,精度会随着值的增加而降低。因此,在远离原始位置呈现的 GameObject 位置会不准确(它们的位置会略有错位)。游戏内容越远离原点移动,效果就会越明显,在动画中最为明显。例如,如果玩家不是在场景中平稳移动,则他们的动作会出现抖动现象。

MoveFloatingOrigin

Maps SDK for Unity 使用一个名为 MoveFloatingOrigin 的方法解决了此问题。此方法会在新位置(例如当前镜头位置)重新将游戏世界的坐标重新居中,从而无缝地重新确定世界、玩家和镜头的位置。所有位置值都会调整,但世界上其他值都保持不变。

用法

MapsService101 示例场景展示了如何使用 MoveFloatingOrigin 方法将游戏世界重新居中。您可以在 Unity 的 Project 窗格的 Assets 文件夹内的 GoogleMaps > Example > 02_Fundamentals 下找到此场景。该场景包含一个名为 Floating Origin Example Script 的 GameObject,其中包含一个名为 Floating Origin Updater (Script) 的脚本组件,该组件引用了 FloatingOriginUpdater.cs 的 C# 源文件。

脚本会等待相机从原点移动特定距离,然后重新居中游戏世界。以下代码段举例说明了如何调用 MoveFloatingOrigin 方法。

mapsService.MoveFloatingOrigin(
    Camera.main.transform.position,
    new [] { Camera.main.gameObject });

floatOrigin 参数

第一个参数称为 floatingOrigin。它是一个 Vector3,表示将游戏世界重新居中的位置。例如,如果您传递了位置值 (100, 0, 100),则该点将成为新的原点 (0, 0, 0),而 Maps SDK for Unity 会按该偏移量转换所有地图项 GameObject。

在上面的代码段中,我们将镜头的当前位置传递给了 floatingOrigin 的值。这会将原点移到当前的镜头位置,从而有效地将当前视图周围的游戏世界重新居中。

gameObjects 参数

第二个参数称为 gameObjects,其使用是可选的。在移动浮动原点的同时移动的一组 GameObject。Maps SDK for Unity 会自动转换它创建的所有 GameObject(建筑物和道路等地貌),但您可以利用此参数指定额外的 GameObject(例如玩家)以及怪物和宝藏等不可玩的角色。

在上面的代码段中,我们传递了一个新数组,其中仅包含 gameObjects 值的相机。这样一来,我们就可以将镜头平移到新的原点。