1. 权限申请与设备初始化
在Unity中调用摄像头拍照,第一步就是要搞定权限申请。这就像你去朋友家做客,得先敲门获得许可才能进门一样。我刚开始做这个功能时,就遇到过用户拒绝授权导致整个功能瘫痪的情况,后来才发现是权限请求的逻辑没处理好。
Unity提供了Application.RequestUserAuthorization方法来申请摄像头权限,但这里有个坑:这个方法是个异步操作。什么意思呢?就像你点外卖不能立刻拿到食物,得等骑手送过来。代码也需要等待用户响应,所以必须用协程来处理:
csharp复制IEnumerator RequestCameraPermission()
{
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
if (Application.HasUserAuthorization(UserAuthorization.WebCam))
{
Debug.Log("摄像头权限已获取");
InitCameraDevice();
}
else
{
Debug.LogError("用户拒绝了摄像头权限");
// 这里可以添加友好的提示UI
}
}
获取到权限后,下一步是初始化摄像头设备。现在的手机通常都有前后两个摄像头,所以我们需要先获取设备列表:
csharp复制WebCamDevice[] devices = WebCamTexture.devices;
if(devices.Length == 0)
{
Debug.LogError("没有检测到可用摄像头");
return;
}
// 默认使用第一个摄像头
string cameraName = devices[0].name;
WebCamTexture webcamTexture = new WebCamTexture(cameraName, 1920, 1080);
这里有个实用技巧:分辨率设置。如果你发现画面卡顿,可以把1920x1080调低,比如1280x720。实在不确定的话,直接传0,0会让Unity使用设备默认分辨率。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实时预览与画面渲染
拿到摄像头访问权限后,我们需要把实时画面显示在屏幕上。这就像给摄像头画面找个"显示器",在Unity里通常用RawImage组件来承载。
csharp复制[SerializeField] RawImage cameraDisplay;
void StartCameraPreview()
{
cameraDisplay.texture = webcamTexture;
webcamTexture.Play();
}
但这里我踩过一个坑:画面方向问题。有些移动设备(特别是iOS)的摄像头画面是横屏的,直接显示会导致画面旋转90度。解决方法是通过检查webcamTexture.videoRotationAngle来调整RawImage的旋转:
csharp复制// 在Update中持续修正画面方向
void Update()
{
if(webcamTexture != null && webcamTexture.isPlaying)
{
cameraDisplay.rectTransform.localEulerAngles =
new Vector3(0, 0, -webcamTexture.videoRotationAngle);
// 同时可能需要调整缩放
float ratio = (float)webcamTexture.
