地图和导航模块

支持用户自己建设大地图、小地图、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 : Vector3
callback : 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值(大概率需要开发者重写)

由于Metastack地面高度是-7,旧代码中是写死的,如果需要在大地图中点击目的地并开始导航,需要根据项目实际需求填写地面高度。可修改如下方法,填写实际需要的高度。
/// <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;
}
拍摄管理模块智能语音对话模块