我正在使用WWDC2018:Creating a multiuser AR experience中引入的ARKit 2.0测试苹果的多用户AR演示应用程序。
文档说,在每个设备重新本地化到相同的World Map之后,只有重新创建每个用户操作所需的信息才会在设备之间共享(例如,如果用户点击屏幕并出现3D对象,则只有该新对象的ARAnchor应该发送到其他设备)。对我来说,虽然它显示了发送设备在捕获和发送世界地图之前放置的所有3D角色,但它不显示在发送世界地图之后添加的任何对象。我得到的错误是:
// can't decode data recieved from peer.有没有人遇到过这个问题,并且知道它是关于什么的?
我没有更改演示代码中的任何内容。
发布于 2018-09-25 03:49:02
我也遇到了同样的问题,但我还是以这种方式解决了它。
(1)首先创建一个变量来检查世界地图是否已发送。
变量worldMapHasInited: Bool = false
(2)然后在函数按钮(_shareSession: UIButton)中,将此行添加到下面的末尾
Self.multipeerSession.sendToAllPeers(数据)
self.worldMapHasInited =真
(3)最后在对等函数数据(_:receivedData,from peer: MCPeerID)中
检查世界地图是否已发送,如果已发送,则跳过检查数据中是否包含世界地图。
if !worldMapHasInited {
if let worldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: data)
{
//....
// when received world map, set the receiver's
// worldMapHasInited to true
self.worldMapHasInited = true
}
}
else
if let anchor = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARAnchor.self, from: data) {
// ...
}这将直接检查数据是否包含锚点。
发布于 2020-06-26 22:22:31
在MultipeerConnectivity ARSession中,多个对等点之间共享数据。但发送和接收的数据必须首先存档,然后使用NSKeyedArchiver和NSKeyedUnarchiver类的两个实例方法取消存档:
func archive(worldMap: ARWorldMap) throws {
let data = try NSKeyedArchiver.archivedData(withRootObject: worldMap,
requiringSecureCoding: true)
try data.write(to: worldMapURL, options: [.atomic])
}和:
func unarchive(worldMapData: Data) -> ARWorldMap? {
guard let unarchievedData = try? NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self,
from: worldMapData)
else { return nil }
return unarchievedData
}因此,如果您在Xcode控制台中收到以下消息:
"can't decode data received from peer"表示传输或解压ARWorldMap数据时出错。
https://stackoverflow.com/questions/52075159
复制相似问题