NOTICE: Google Maps Platform gaming services is deprecated as of October 18, 2021. Current users will have continued access until December 31, 2022. During this time, we will continue to provide support and fixes to major bugs and outages. See the Gaming Services Transition Guide for resources to help you plan the next steps for your projects.

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_基础知识 地图服务 101 详细说明如何使用地图服务与 SDK 进行通信。
    03_地图样式 样式地图 101 提供了在运行时为地图项设置样式的全面示例。
    04_高级 多个场景 重新分组了一些示例,展示了高级修改主题(例如修改时间(样式)预览、混合缩放、可播放位置、路径查找和高级样式)。
  3. 双击要运行的示例场景。场景会显示在 Hierarchy 窗格中。

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

  5. 点击运行按钮。

使用入门

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

如果您停止场景,可以在 LatitudeLongitude 字段(位于 Inspector 中的 Basic Example (Script) 组件内)中输入一组新的坐标,然后重新运行场景,并将显示不同的世界场景。

启用与 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 组件会始终加载 Camera.main 视口,从而卸载视口外的所有内容。
FloatingLatLngOriginUpdater 当用户(在本例中为主相机)与初始位置的距离达到 FloatingOriginRange 值时,移动浮动来源并更新所有已加载地图项的相对位置。

FloatingLatLngOriginUpdater 组件演示了如何使用 MapsService.MoveFloatingOrigin 方法重新将游戏世界居中。由于浮点数舍入误差(这会导致地图特征在游戏内容远离游戏源头的位置越来越不当),因此必须这样做。如需了解详情,请参阅浮动来源
道路更新程序 启用 RoadNamesUpdater 组件后,加载的地图会将道路名称显示为标签。
建筑物名称更新程序 如果 BuildingNamesUpdater 组件有效,则加载的地图会将建筑物名称显示为标签。
进度条更新器 当 ProgressBarUpdater 组件处于活动状态时,HUD 会显示当前的加载进度。
SearchByPlaceIdUpdater 当 SearchByPlaceIdUpdater 组件处于活动状态时,它会跟踪已加载的 placeId,并提供一种在已加载的地图上搜索由所选 placeId 识别的游戏对象的方式。
地图项控制器 MapFeaturesController 组件处于活动状态时,提供了一种方法,可将加载的地图几何图形分派到多个预定义的存储分区(不同的游戏对象父级)。它还为 MapsService 指明了应加载的 MapFeatures 类别。

默认情况下,此示例将加载美国纽约曼哈顿中城的坐标。如果您停止场景,则可以在检查器动态地图服务脚本组件的纬度经度字段中输入一组新的坐标。重新运行场景,系统会显示另一个世界场景。

地图样式设置基础知识

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

您可以通过以下三种方式在运行时设置地图样式:

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

地图样式设置 101 示例展示了前两种方法。

处理每组参数的代码可在以下类(位于 /Assets/GoogleMaps/Examples/03_MapsStyling/Scripts 下)中找到:

AreaWaterConfigView
ExtrudedStructureConfigView
ModeledStructureConfigView
区域配置视图
细分受众群配置视图

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

Google 地图路径查找基础知识 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 下的迷你地图示例演示了如何设置 Camera 的渲染设置,以便在界面元素中显示游戏世界的迷你地图视图。此场景使用 gameObject.layerCamera.cullingMask 来控制迷你地图中显示的内容。此场景还使用 RenderTexture 连接到 UI.RawImage 界面组件,以在屏幕上显示为迷你地图。

位置关注者

/Assets/GoogleMaps/Examples/04_Advanced/Miscellaneous 下的位置跟踪示例场景演示了如何使用玩家的真实 GPS 坐标来更新其 Gameworld 位置。

更多样式示例

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

九片

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

它使用 BuildingTexturer 组件来应用九个切片的材料,并使用 DynamicMapsService 组件在全球范围内导航,MapsService 组件始终仅加载世界上的视图部分。

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

建筑物边框

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

此示例与九宫格示例几乎完全相同。 唯一的区别在于,此示例使用 Extruder 类为模型基础添加建模边框。

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

parapet 示例场景演示了如何将 parapet 添加到建筑物的顶部边缘。

此示例与九宫格示例几乎完全相同。 唯一的区别在于,此示例使用 Extruder 在建筑物屋顶周围添加建模的图块。此外,它还使用 DynamicMapsService 组件、BuildingTexturer 组件和 ErrorHandling 组件。

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

建筑挤压

“建筑物挤压示例”场景演示了如何在靠近玩家的位置时挤压建筑物(即将凸出的建筑物的高度降至零)。此示例使用 ErrorHandling 组件,以展示加载地图时 MapsService 组件遇到的所有错误。

预制件更换

预制件替换示例场景演示了如何使用定义的预制件来替换给定类型的建筑物,或者替换 SDK 抑制的建筑物,因为它们的顶点数超过了 Unity 支持的最大顶点数(每个网格最多 65000 个顶点)。

当此场景打开时,它会重点呈现威斯敏斯特修道院(伦敦),后者似乎已被预制件所取代,因为这一特定模型过于详细,导致 Unity 无法处理(因而遭到抑制)。

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