Maps SDK for Unity 示例场景

Maps SDK for Unity 附带了一系列 Unity 示例场景,每个场景都演示了 SDK 的一项基本功能。当您将 SDK 安装到 /GoogleMaps/Examples/ 目录中时,系统会安装这两个库。

在 Unity 中运行示例场景

  1. 按照使用入门流程集成 Maps SDK for Unity。完成后,您便已经下载了 SDK 并将其集成到了 Unity 中。

  2. Project 窗格中,前往 /Assets/GoogleMaps/Examples/ 文件夹。示例场景按以下文件夹结构进行组织:

    文件夹 主场景 说明
    01_入门 HelloWorld 说明加载地图的最简单方法。
    02_基础知识 MapsService101 详细介绍了如何使用地图服务与 SDK 进行通信。
    03_地图样式设置 StylingMaps101 提供在运行时设置地图项样式的完整示例。
    04_高级 多个场景 重新组合了一些示例来说明高级主题,例如编辑时间(样式设置)预览、混合缩放、可播放位置、路径查找和高级样式设置。
  3. 双击要运行的示例场景。该场景会显示在 Hierarchy 窗格中。

  4. 在运行场景之前,您必须先添加 apiKey,以允许 SDK 与 Google 服务器成功通信。apiKey 是 MapsService Unity 组件的一个参数,通常附加到示例游戏对象或其子对象之一。

  5. 点击运行按钮。

入门指南

此示例场景展示了 Maps SDK for Unity 最基本的方面。默认情况下,它会加载 Statue of Liberty 的坐标,然后在 SceneEditor 窗格中显示 Statue of Liberty GameObject 及其周围的几何图形。

如果您停止场景,随后可以在纬度经度字段中输入一组新的坐标(在检查器基本示例(脚本)组件内),然后重新运行场景,此时系统会显示一个不同的世界场景。

支持与 Maps SDK for Unity 通信的代码位于脚本的 Start() 函数中:

private void Start () {
   // Get required Maps Service component on this GameObject.
   MapsService mapsService = GetComponent<MapsService>();

   // Set real-world location to load.
   mapsService.InitFloatingOrigin(LatLng);

   // Register a listener to be notified when the map is loaded.
   mapsService.Events.MapEvents.Loaded.AddListener(OnLoaded);

   // Load map with default options.
   mapsService.LoadMap(ExampleDefaults.DefaultBounds,ExampleDefaults.DefaultGameObjectOptions);
}

在此示例中,地图加载了默认边界和样式指令。MapsService 组件是与 Maps SDK for Unity 进行通信的网关。请注意,此示例中的纬度-经度对会初始化地图的浮动原点。bounds 参数定义了该起点周围的加载区域。

MapsService 基础知识

此示例场景演示了如何使用 MapsService 组件以各种方式与 Maps SDK for Unity 进行交互。

该场景中实施了几个可在自己的 Unity 场景中使用的专用组件。这些组件被分配给场景层次结构中的 MapsExample 游戏对象。它们展示了地图加载生命周期。此示例使用第一人称视角。

组件 说明
BaseMapLoader 以提供的 Lat Lng 为起点,并在 MaxDistance 的半径范围内加载地图。BaseMapLoader 组件演示了如何处理 SDK 遇到的加载错误。
DynamicMapsUpdater 当用户(在本例中为主镜头)四处移动时,动态加载或卸载地图上的更多部分。DynamicMapsUpdater 组件会始终保持 Camera.main 视口的加载,从而取消加载视口以外的所有内容。
FloatingLatLngOriginUpdater 当用户(在本例中为主镜头)与初始位置之间的距离达到 FloatingOriginRange 时,移动浮动原点并更新所有已加载地图项的相对位置。

FloatingLatLngOriginUpdater 组件演示了如何使用 MapsService.MoveFloatingOrigin 方法使游戏世界重新居中。由于浮点舍入错误,因此在远离游戏原点时,会导致地图项的位置越来越错,从而使其变得越来越少。如需了解详情,请参阅浮动来源
RoadNamesUpdater 当 RoadNamesUpdater 组件处于活动状态时,加载的地图会将道路名称显示为标签。
BuildingNamesUpdater 当 BuildingNamesUpdater 组件处于活动状态时,加载的地图会将建筑物名称显示为标签。
ProgressBarUpdater 当 ProgressBarUpdater 组件处于活动状态时,HUD 会显示当前的加载进度。
SearchByPlaceIdUpdater SearchByPlaceIdUpdater 组件处于活动状态时,会跟踪加载的 placeId,并提供在加载的地图上搜索由选定 placeId 标识的游戏对象的方式。
MapFeaturesController MapFeaturesController 组件处于活动状态时,可用于将加载的地图几何图形分派到多个预定义存储分区(不同的 GameObject 父级)中。它还提供了一些方法,用于向 MapsService 说明应加载的 MapFeatures 类别。

默认情况下,此示例加载美国纽约曼哈顿中城的坐标。如果您停止该场景,随后可以在检查器Dynamic Maps Service 脚本组件的纬度经度字段中输入一组新的坐标。重新运行场景,显示另一个世界场景。

地图样式设置基础知识

此示例场景演示了如何在地图项加载过程中使用 Maps SDK for Unity 设置地图项的样式。

在运行时设置地图样式的方法有以下三种:

  1. 加载地图时,向 MapsService 组件提供样式配置 (GameObjectOptions)。
  2. 在 SDK 实例化之前,使用 WillCreate 事件为特定地图GameObject附加自定义样式说明。
  3. 创建 GameObjects 后,在运行时(在 DidCreate 事件中或收到 MapLoaded 事件之后)设置其样式。

“地图样式设置基础知识”示例展示了前两种方法。

处理每组参数的代码位于 /Assets/GoogleMaps/Examples/03_MapsStyling/Scripts 下的以下类中:

AreaWaterConfigView
ExtrudedStructureConfigView
ModeledStructureConfigView
RegionConfigView
SegmentConfigView

用于收集所有地图项样式并将其传递给 MapsService API 的代码位于 MapsStylingEditorView 类中。

地图寻路 101

此示例场景演示了如何使用 SDK 中的内置路径查找功能。此服务依赖 A* 算法和已加载地图的路格作为可遍历图。

该示例在屏幕上显示了两个字符。一个由玩家驱动,另一个由人工智能管理。

激活后,邪恶机器人(红色)会尝试跟上我们的头像(绿色)。所有路径都会实时更新。

该示例突出显示了已加载地图上可用的道路格点节点(或航点)图。

请注意,这些节点没有直观的表示形式。地图上显示的白色球体仅作说明之用。

此示例有意隐藏除了路段之外的所有地图项。

处理主要角色的代码位于 RoadLatticeCharacterController 组件中,而处理 AI 代理搜索行为的代码位于 RoadLatticeAIController 中。

高级主题

以下示例演示了创建 Unity 场景的高级功能。

修改时间预览

/Assets/GoogleMaps/Examples/04_Advanced/EditTimePreview 下的修改时间预览示例场景可让您大致了解一个新实现,该实现允许在修改时在编辑器中设置地图游戏对象的样式,而不是“地图样式设置 101”部分中介绍的运行时样式设置。

混合缩放

/Assets/GoogleMaps/Examples/04_Advanced/MixedZoom 下的混合缩放示例场景说明了如何在加载地图时根据主镜头的位置和到地图的距离来使用不同的缩放级别。此功能可用于处理不同级别的细节。

白天和夜晚

/Assets/GoogleMaps/Examples/04_Advanced/Miscellaneous 下的日间和夜间示例场景演示了如何使用 Unity 的 Skybox 系统、方向光和发光材料创建日夜循环。

此示例与九维切片示例几乎完全相同。唯一的区别是,此示例添加了 SunAndMoonControllerEmissionController 以控制材料的光线和发光颜色,以模拟日夜循环。将材料应用于建筑物的基本逻辑与九块切片示例中的相同。

此示例还使用了 DynamicMapsService 组件、BuildingTexturer 组件和 ErrorHandling 组件。

小地图

/Assets/GoogleMaps/Examples/04_Advanced/Miscellaneous 下的迷你地图示例场景演示了如何设置相机的渲染设置,以在界面元素中显示游戏世界的迷你地图视图。此场景使用 gameObject.layerCamera.cullingMask 来控制迷你地图中显示的内容。此场景还使用 RenderTexture 连接到 UI.RawImage 界面组件,以便显示为屏幕上的迷你地图。

营业地点关注者

/Assets/GoogleMaps/Examples/04_Advanced/Miscellaneous 下的位置跟踪程序示例场景演示了如何使用玩家的实际 GPS 坐标来更新其游戏世界位置。

更多样式示例

以下特定样式示例位于 /Assets/GoogleMaps/Examples/04_Advanced/MoreStyling 下。

9 切片

九个切片示例场景演示了如何使用九个切片的材质对建筑物进行纹理化处理。这些材料依赖于位于 /Assets/GoogleMaps/Examples/04_Advanced/MoreStyling/Materials/NineSlicing 下的自定义着色器 BuildingWall Wall (9 Slice)。

该组件使用 BuildingTexturer 组件来应用九个切片的材料,并使用 DynamicMapsService 组件实现环球导航,而 MapsService 组件始终只会加载地球上被查看的部分。

此示例还使用 ErrorHandling 组件来显示 MapsService 组件在加载世界几何图形时遇到的任何错误。

构建边界

建筑物边框示例场景演示了如何在建筑物底部周围添加边框。

此示例与九维切片示例几乎完全相同。唯一的区别在于,此示例使用 Extruder 类向建筑物的底部添加建模边界。

此示例还使用了 DynamicMapsService 组件、BuildingTexturer 组件和 ErrorHandling 组件。

护栏

护栏示例场景演示了如何向建筑物的顶部边缘添加护栏

此示例与九维切片示例几乎完全相同。唯一的区别在于,此示例使用 Extruder 在建筑物屋顶周围添加建模栏杆。它还使用了 DynamicMapsService 组件、BuildingTexturer 组件和 ErrorHandling 组件。

默认情况下,此示例加载澳大利亚墨尔本的坐标。

房屋推倒墙

建筑物挤压示例场景展示了如何在建筑物靠近玩家时将其挤压(即,将凸出的建筑物的高度降低为零)。此示例使用 ErrorHandling 组件来显示 MapsService 组件在加载几何图形时遇到的任何错误。

预制件更换

预制件替换示例场景演示了如何使用定义的预制件替换指定类型的建筑物,或替换 SDK 禁止的建筑物,因为这些建筑物的顶点数量超过了 Unity 支持的顶点数上限(每个网格可包含 65,000 个顶点)。

当此场景打开时,它会聚焦于伦敦的威斯敏斯特教堂(威斯敏斯特教堂被预制件取代),因为这个模型过于详细,Unity 无法处理(因此被抑制)。

此示例使用 ErrorHandling 组件来显示 MapsService 组件在加载几何图形时遇到的任何错误。