所以我将Unity 2017.2.0f3与Vuforia Extension一起使用,我在https://github.com/blitzagency/ios-unity5教程之后在现有的iOS项目中导入了该项目。现有的iOS项目包括一个视图,您可以在其中切换使用Vuforia的AR视图和可以扫描条形码的原生iOS AVCaptureSession。前者工作没有错误,但是一旦我尝试session.addInput
或session.addOutput
后一个功能崩溃:
EXC_BAD_ACCESS
com.apple.avfoundation.videodataoutput.bufferqueue
队列中。 我尝试使用NSZombie来了解更多关于什么类型的对象试图发送消息,但我只能在物理设备上运行应用程序,因此我无法了解它尝试的实际对象发送导致崩溃的消息。
我的理由是,它可能与Vuforia持久引用已释放的VIdeoDataOutput缓冲区队列有关,该队列是由我创建的AVCaptureSession
AVCaptureOutput
和AVCaptureInput
新的CameraCapture.mm
触发的}。棘手的是,我不知道如何确定这一点与否,因为它是第三方图书馆。唯一一个具有Objective-C包装器的ViewController被称为NSLogs
,但这似乎是一个残留的Unity唯一的视图控制器,因为我在该方法中放置的任何private func setupCamera() {
guard let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo),
let input = try? AVCaptureDeviceInput(device: device) else {
return
}
if session.canAddInput(input) {
session.addInputWithNoConnections(input)
}
previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewLayer.frame = self.view.bounds
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
view.layer.addSublayer(previewLayer)
cameraPreviewView.layer.addSublayer(previewLayer)
let metadataOutput = AVCaptureMetadataOutput()
if session.canAddOutput(metadataOutput) {
session.addOutputWithNoConnections(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes
} else {
print("Could not add metadata output")
}
}
或断点都不会被调用。
AppDelegate
调用上述方法后,即使在闪电战教程appDelegate.stopUnity()
中调用echo $value;
函数后,也始终会崩溃应用程序。
答案 0 :(得分:0)
所以基本上我得到的错误来自Unity在后台时并没有真正退出。这是一个可以在Unity本身中为iOS Unity导出配置的设置。如果你去编辑>播放器设置>然后在其他设置下右侧的检查器中,有一个名为背景中的行为的字段。我的原始导出将此设置为 Suspend ,这导致Unity / Vuforia中的Camera固有的AVCaptureSession在视频输出委托缓冲区方面不可能被清除,而Unity并非如此因此,当我认为Unity停止并开始新的EXC_BAD_ACCESS
时,生成AVCaptureSession
。所以通过将背景中的行为切换到退出,然后在我的应用程序中保证我在为新{appDelegate.stopUnity()
设置输入/输出对之前调用了AVCaptureSession()
1}}成功解决了这个问题。