Unity使用Face Manager时为何Start/Update无法切换World摄像头但按钮可以
问题原因
- ARFoundation的AR子系统(包括摄像头、人脸跟踪)初始化是异步流程:你在
Start方法执行时,ARSession、ARFaceManager、ARCameraManager的相关原生模块还没有完成初始化加载,此时直接修改requestedFacingDirection会打断未完成的初始化流程,导致配置不匹配,最终摄像头启动失败。 - ARFaceManager的人脸跟踪子系统初始化时会绑定当前设置的摄像头朝向,你在初始化未完成阶段修改朝向,会导致子系统的预设配置和实际摄像头参数不匹配,直接触发子系统初始化失败,摄像头完全无法启动。
- 按钮点击触发切换时,应用已经完成启动,前置摄像头的人脸跟踪子系统已经完全就绪,ARFoundation可以正常处理朝向切换的状态流转,所以可以成功切换到后置摄像头模式。
解决方案
你可以通过协程等待AR子系统初始化完成后再执行切换操作,示例代码如下:
public class FaceController : MonoBehaviour { public ARCameraManager camManager; public ARSession aRSession; IEnumerator Start() { // 等待ARSession完全就绪 while(aRSession.state != SessionState.Ready) { yield return null; } // 延迟1帧确保所有子系统初始化逻辑完成 yield return null; // 此时执行切换即可成功 camManager.requestedFacingDirection = CameraFacingDirection.World; } public void SwitchMode() { camManager.requestedFacingDirection = CameraFacingDirection.World; } }
如果上述方案偶现失败,可以再加一层校验,等收到第一帧前置摄像头画面后再切换:
private bool _hasSwitched = false; void OnEnable() { camManager.frameReceived += OnCameraFrameReceived; } void OnDisable() { camManager.frameReceived -= OnCameraFrameReceived; } private void OnCameraFrameReceived(ARCameraFrameEventArgs args) { if(!_hasSwitched && camManager.currentFacingDirection == CameraFacingDirection.User) { _hasSwitched = true; camManager.requestedFacingDirection = CameraFacingDirection.World; } }
内容的提问来源于stack exchange,提问作者Russ J
相关产品推荐
相关产品推荐

