版权声明:个人原创,转载请注明出处 https://blog.csdn.net/dengshunhao/article/details/84646958
为了方便AR开发交流,博主建立了一个群 :891555732,欢迎一起讨论
一.多人共享数据
官方案例源码 : https://github.com/Unity-Technologies/SharedSpheres
①.获取数据及保存
public enum ARWorldMappingStatus
{
//世界地图不可用.
ARWorldMappingStatusNotAvailable,
//世界地图是可用的,但功能有限。
//对于设备的当前位置,不建议重新定位会话的世界地图。
ARWorldMappingStatusLimited,
//世界映射是通过用户的运动积极地扩展地图。
//世界地图将可为以前访问过的地区重新定位,但仍在为目前的空间更新。
ARWorldMappingStatusExtending,
//世界地图已经充分地映射了可见区域。
//该映射可用于重新定位设备的当前位置 .
ARWorldMappingStatusMapped
}
public class UpdateWorldMappingStatus : MonoBehaviour
{
public Text text;
public Text tracking;
public UnityARSessionNativeInterface session;
public ARWorldMap m_ARWorldMap;
public string path = Path.Combine(Application.persistentDataPath, "myFirstWorldMap.worldmap");
void Start ()
{
session = UnityARSessionNativeInterface.GetARSessionNativeInterface();
UnityARSessionNativeInterface.ARFrameUpdatedEvent += CheckWorldMapStatus;
}
void CheckWorldMapStatus(UnityARCamera cam)
{
if(cam.worldMappingStatus != ARWorldMappingStatus.ARWorldMappingStatusMapped)
{
text.text = cam.worldMappingStatus.ToString();
tracking.text = cam.trackingState.ToString() + " " + cam.trackingReason.ToString();
}
else
{
session.GetCurrentWorldMapAsync(OnWorldMap);
}
}
void OnDestroy()
{
UnityARSessionNativeInterface.ARFrameUpdatedEvent -= CheckWorldMapStatus;
}
void OnWorldMap(ARWorldMap worldMap)
{
m_ARWorldMap = worldMap;
}
public void Save()
{
if(m_ARWorldMap != null)
{
m_ARWorldMap.Save(path);
}
}
}
②.加载本地空间数据
更改ARKitWorldTrackingSessionConfiguration中的worldMap即可
public void OnLoadClick()
{
UnityARSessionNativeInterface.ARSessionShouldAttemptRelocalization = true; //重定位
ARWorldMap new_worldmap = ARWorldMap.Load(path);
ARKitWorldTrackingSessionConfiguration config = unityARCameraManage.sessionConfiguration;
config.worldMap = new_worldmap;
UnityARSessionRunOption sessionRunOption = UnityARSessionRunOption.ARSessionRunOptionRemoveExistingAnchors | UnityARSessionRunOption.ARSessionRunOptionResetTracking; //重置 移除
session.RunWithConfigAndOptions(config, sessionRunOption);
}
实现原理 : 将现在扫描的环境特征点与保存的ARWorldMap 中特征点进行匹配
③.多人联网
官方演示案例中使用了CaptainsMess插件 : https://github.com/hengineer/CaptainsMess,封装了Unet,本文直接使用Unet实现
以下是测试,服务端更改球的颜色同步至客户端
创建一个空物体添加以下脚本:
创建三个btn,一个inputField,一个text,添加点击事件及赋值
创建Sphere预制体 :
需要在网络上流通的物体需要唯一的标识符,添加以上两个脚本服务端就会同步位置到客户端
创建好的 Sphere预制体赋值:
④.传输worldMap数据
unet 通过网络发送大量数据(切块传输):https://answers.unity.com/questions/1113376/unet-send-big-amount-of-data-over-network-how-to-s.html(直接拷贝脚本并修改通道为0即可即可)
创建使用脚本:
创建按钮,点击事件调用OnStartGame
⑤.多设备共享
接受数据完成后加载