You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARSCNViewDelegate方法未触发问题求助

问题原因与解决方法

核心原因

你仅给ARSession设置了代理(self.arKitView.session.delegate = self),但未给ARSCNView本身设置代理。ARSCNViewDelegate的回调由ARSCNView触发,必须将其delegate属性指向实现该协议的对象(即你的ARSessionCameraView实例),否则不会触发相关方法。

另外存在场景适配问题:使用前置摄像头时,你配置的是ARFaceTrackingConfiguration,该配置不支持平面检测,所以即便代理设置正确,也不会产生ARPlaneAnchor相关的renderer回调——这类回调仅在后置摄像头开启平面检测的配置下才会触发。

解决步骤

1. 补充设置ARSCNView的代理

在setupARSession方法中添加一行代码,完成ARSCNView的代理绑定:

func setupARSession(position: AVCaptureDevice.Position) {
    if position == .back {
        let configuration = ARWorldTrackingConfiguration()
        configuration.planeDetection = [.horizontal]
        configuration.userFaceTrackingEnabled = true
        self.arKitView.session.run(configuration)
    } else if position == .front {
        let configuration = ARFaceTrackingConfiguration()
        configuration.isWorldTrackingEnabled = true
        self.arKitView.session.run(configuration)
    }
    self.arKitView.session.delegate = self
    // 新增该行,绑定ARSCNView的代理
    self.arKitView.delegate = self
}

2. 匹配测试场景

  • 若要测试平面检测相关的renderer(_:didAdd:for:)和renderer(_:didUpdate:for:)回调,请切换至后置摄像头,并确保测试环境存在清晰平面(如桌面、地面)。
  • 前置摄像头的ARFaceTrackingConfiguration仅会产生ARFaceAnchor,若需处理人脸相关逻辑,可在renderer方法中判断anchor is ARFaceAnchor。

3. 额外验证(可选)

确认setupViews方法中创建的ARSCNView实例是最终添加到界面的对象——如果代理设置在了未被显示的实例上,同样会导致回调失效。需保证self.delegate?.viewsDidCreate(arKitView: arKitView)传递的是同一个arKitView,且该对象已正确加入视图层级。


内容的提问来源于stack exchange,提问作者narner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:30:51