地图和导航模块
支持用户自己建设大地图、小地图、poi(兴趣点)以及导航信息等功能
1. 整体介绍
1.1. 空间小地图
支持以用户为中心的小地图展示,用户可通过小地图直接查看附近的建筑名称和建筑面貌,对周围环境概况有个大致了解。且随着用户角色的走动,小地图中象征用户角色的黄色小点也会跟着进行同样的移动,实时呈现用户在元宇宙世界中的方位,为用户提供清晰的方向指引,以避免用户迷失在虚拟世界中。

1.2 空间大地图
支持对世界全地图进行查看。在应用中点击世界小地图后可概览元宇宙世界整体面貌,并以3D球状进行呈现。在这个3D大地图中,以建筑为主要渲染、呈现对象,其余还支持可行走区渲染等。

1.3 地图标注目的地&坐标快捷导航
通过运营中台可以配置地图的poi(兴趣点),点击后可展示地点的详细信息,以及引导用户快速导航到目的地





3.主要功能对应数资及脚本
| 脚本或dll | 端 | Prefab | 说明 | 功能示意图 |
|---|---|---|---|---|
| Baidu.Meta.MCK.NavMap.UI.MiniMap | PC,Mobile ,VR | MiniMap | 小地图:显示底图、人物位置、poi位置、导航状态 | ![]() |
| Baidu.Meta.MCK.NavMap.TinyMapManager | 地图导航总管理,单例 | |||
| Baidu.Meta.MCK.NavMap.TinyMap.TinyMapNaviUIManager | PC,Mobile ,VR | TinyMap | 部分导航线路管理 | ![]() |
| Baidu.Meta.MCK.NavMap.TinyMap.TinyMapPanel | PC,Mobile ,VR | TinyMapUI | 大地图UI面板 | ![]() |
| Baidu.Meta.MCK.NavMap.UI.ActivityPage | PC,Mobile ,VR | ActivityPage | 大地图poi详情面板 | ![]() |
| Baidu.Meta.MCK.NavMap.UI.BaiduMapNavigationPage | PC,Mobile ,VR | BaiduMapNavigationPage | 大地图poi路线规划面板 | ![]() |
| Baidu.Meta.MCK.NavMap.TinyMap.MapPositionShareWindow | TinyMapUI包含 | 大地图非poi坐标面板 | ||
| Baidu.Meta.MCK.NavMap.UI.NavigationBase | 导航入口,包含交通工具,可开始暂停导航 | |||
| Baidu.Meta.MCK.NavMap.TransportSystem.Walk.WalkVehicle | 步行导航交通工具:路线规划、步行导航启动 | |||
| Baidu.Meta.MCK.NavMap.PlayerNaviController | 步行线路计算、导航avatar移动的具体实现 | |||
| Baidu.Meta.MCK.NavMap.UI.NaviTopPin | PC,Mobile ,VR | PublicTransportNavi_TopPin | 导航暂停顶部面板 | ![]() |
| Hotfix.Standard.UI.DownloadTopPin | PC,Mobile ,VR | Download_TopPin | poi导航开始预下载顶部面板 | ![]() |
3.客户端接口
| 接口 | 参数 | 返回 | 说明 |
|---|---|---|---|
| Hotfix.Custom.Adaptor.ComAdaptorMgr.Inst.Init_NavMap | void | 在hotfix中初始化导航组件适配器 | |
| Hotfix.DllMain.LoadTinyMap | void | 加载大地图 | |
| Baidu.Meta.MCK.NavMap.TinyMapManager.Inst.StartMap Baidu.Meta.MCK.NavMap.TinyMapManager.Inst.StartMap | void | 打开大地图 | |
| Baidu.Meta.MCK.NavMap.TinyMapManager.GoToDestination | pos : Vector3callback : Action |
void | 设置目标点,开始导航 |
| Baidu.Meta.MCK.NavMap.UI.NavigationBase.WalkVehicle.Resume | void | 自动导航到设置好的目标点 |
4. 功能介绍
4.1空间小地图启用
4.1.1后台数据配置(高级配置),可以控制小地图是否启用

"space_config": {
"mainUIArea": {
"miniMap": {
"show": true
}
}
}4.1.2 本地数据配置SpaceMap.json

*若不希望点击小地图弹出大地图,【big_size_map】和【big_map】一定要设为空串""
- 【space_id】:后台空间id,必填,否则相当于没有配置
- 确认地图中心(世界坐标),填入SpaceMap.json里具体空间的【space_center字段】
- 丈量实际地图大小(可以缩放cube,如图)

将丈量得到的长宽(unity单位),填入SpaceMap.json里具体空间的【space_width】和【space_height】
- 准备好小地图jpg一张,将addressable地址填入SpaceMap.json里具体空间的【map】

确认jpg的分辨率比例和地图大小的比例相同

4.2空间大地图启用
4.2.1后台数据配置(高级配置),除了小地图配置要打开,还新增了spaceMap配置也需要填写

"space_config": {
"mainUIArea": {
"miniMap": {
"show": true
}
},
"spaceMap": {
"enable": true,
"map3D": true,
}
}4.2.2 本地数据配置SpaceMap.json

仍是这个配置,但需要填写【big_size_map】或【big_map】 【big_size_map】:图片的addressable地址,即用图片来呈现大地图(可选2D大地图) 【big_map】: prefab的addressable地址,即用3d物体呈现大地图(默认选择3D大地图) 若都填了,程序内部优先使用【big_map】。
4.2.2.1 2D大地图【big_size_map】配置方式 可以沿用小地图的图片,如上图,填入和【map】相同的图片地址,效果如下:

*假设开发者项直接使用图片作为大地图的呈现方式,则在工程中查看是否有当前的业务代码,如果没有则需确认当前代码是否最新版本
private void genBigMap(Texture bigsizemap)
{
myLowModel = new GameObject("LowMap");
var can = myLowModel.AddComponent<Canvas>();
can.renderMode = RenderMode.WorldSpace;
can.worldCamera = tinyCamera;
can.sortingOrder = -100;
GameObject ri = new GameObject("Plane");
ri.AddComponent<RawImage>();
// ri.transform.parent = can.transform;
ri.transform.SetParent(can.transform, false);
ri.GetComponent<RawImage>().texture = bigsizemap;
ri.GetComponent<RawImage>().SetNativeSize();
var rtrans = ri.GetComponent<RectTransform>();
rtrans.eulerAngles = new Vector3(90, 0, 0);
rtrans.position = CurSpaceData.spaceCenetr;
rtrans.sizeDelta = new Vector2(CurSpaceData.spaceWidth , CurSpaceData.spaceHeight);
myLowModel.layer = LayerMask.NameToLayer("TinyMap");
ri.layer = LayerMask.NameToLayer("TinyMap");
var collider = rtrans.gameObject.AddComponent<BoxCollider>();
collider.size = rtrans.sizeDelta;
}4.2.2.2 3D大地图【big_map】配置方式 客户美术同学可自制导航低模,可参考效果如下:

需要保证prefab中各建筑大小与实际场景近似。 big_size_map:准备好图片即可,其它无需额外配置 big_map:将自制的prefab的所有gameObject的layer设置为TinyMap

4.3导航功能启用
用于本地步行导航的数据构建,以下的生成示例(用户依据真实的地图场景进行设置) 4.3.1 导航网格烘焙 将需要烘焙的物体勾上Navigation Static

将可行走部分标记为Walkable

将障碍物标记为Not Walkable

参考MetaStack大世界的烘焙参数;清除旧导航网格数据后重新生成

烘焙成功,蓝色部分为导航网格可行走区域

4.3.2 保证导航网格文件包含进副本数资 检查生成的导航网格文件

保证该导航数据在数资内

4.4 导航
4.4.1 非poi(非地标)导航

大地图关闭,导航提示、箭头、小地图闪烁。表明步行导航开始

4.4.2 poi(地标)导航
点击poi(地标),弹出介绍窗口

进入poi(地标)路线规划界面,展示步行线路规划,点击开始导航

若该poi需要下载,会弹出顶部预下载UI

4.4.3 导航中断
导航过程中人物自由移动,将中断导航,弹出顶部UI

4.4.4 在地图上添加poi(地标)
目前支持两种方式添加poi
4.4.4.1后台配置


4.4.4.2本地配置
poi本地配置:参考【areas】部分,在大小地图上添加poi

4.4.5 重要注意事项
非poi导航,导航目的地的坐标点y值(大概率需要开发者重写)

/// <summary>
/// 获取点击地图对应的坐标
/// </summary>
/// <returns></returns>
private Vector3 ClickWorldPosition()
{
Vector3 clickedPosition = Vector3.zero;
Ray ray = tinyCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit[] hits = Physics.RaycastAll(ray);
for (int i = 0; i < hits.Length; i++)
{
if (hits[i].transform.gameObject.layer == LayerMask.NameToLayer("TinyName"))
{
return Vector3.zero;
}
if (hits[i].transform.name == "Plane" && hits[i].transform.gameObject.layer == LayerMask.NameToLayer("TinyMap"))
{
float groundHeight = -7f;
float aspect = (groundHeight - tinyCamera.transform.position.y) / (hits[i].point.y - tinyCamera.transform.position.y);
clickedPosition = new Vector3(aspect * (hits[i].point.x - tinyCamera.transform.position.x) + tinyCamera.transform.position.x,
-7, aspect * (hits[i].point.z - tinyCamera.transform.position.z) + tinyCamera.transform.position.z);
}
}
return clickedPosition;
}





