WebCam 纹理是渲染实时视频输入的纹理。
在 Android、iOS 和 WebGL 平台上,WebCamTexture
需要相机权限。在 Android 上,您可以使用 Permission API 在运行时请求它。有关更多信息,请参阅 请求运行时权限 文档。
在 iOS 和 WebGL 上,您可以使用 Application.RequestUserAuthorization 在运行时请求相机权限。
注意:在 Android 和 iOS 平台上,Unity 不支持同时使用多个 WebCamTexture。
以下代码示例演示了如何在 iOS、Android 和 WebGL 平台上请求用户相机权限。
using UnityEngine; using System; using System.Collections; using UnityEngine; #if UNITY_ANDROID using UnityEngine.Android; #endif
public class WebCam : MonoBehaviour { #if UNITY_IOS || UNITY_WEBGL private bool CheckPermissionAndRaiseCallbackIfGranted(UserAuthorization authenticationType, Action authenticationGrantedAction) { if (Application.HasUserAuthorization(authenticationType)) { if (authenticationGrantedAction != null) authenticationGrantedAction();
return true; } return false; }
private IEnumerator AskForPermissionIfRequired(UserAuthorization authenticationType, Action authenticationGrantedAction) { if (!CheckPermissionAndRaiseCallbackIfGranted(authenticationType, authenticationGrantedAction)) { yield return Application.RequestUserAuthorization(authenticationType); if (!CheckPermissionAndRaiseCallbackIfGranted(authenticationType, authenticationGrantedAction)) Debug.LogWarning($"Permission {authenticationType} Denied"); } } #elif UNITY_ANDROID private void PermissionCallbacksPermissionGranted(string permissionName) { StartCoroutine(DelayedCameraInitialization()); }
private IEnumerator DelayedCameraInitialization() { yield return null; InitializeCamera(); }
private void PermissionCallbacksPermissionDenied(string permissionName) { Debug.LogWarning($"Permission {permissionName} Denied"); }
private void AskCameraPermission() { var callbacks = new PermissionCallbacks(); callbacks.PermissionDenied += PermissionCallbacksPermissionDenied; callbacks.PermissionGranted += PermissionCallbacksPermissionGranted; Permission.RequestUserPermission(Permission.Camera, callbacks); } #endif
void Start() { #if UNITY_IOS || UNITY_WEBGL StartCoroutine(AskForPermissionIfRequired(UserAuthorization.WebCam, () => { InitializeCamera(); })); return; #elif UNITY_ANDROID if (!Permission.HasUserAuthorizedPermission(Permission.Camera)) { AskCameraPermission(); return; } #endif InitializeCamera(); }
private void InitializeCamera() { WebCamTexture webcamTexture = new WebCamTexture(); Renderer renderer = GetComponent<Renderer>(); renderer.material.mainTexture = webcamTexture; webcamTexture.Play(); } }
devices | 返回可用设备的列表。 |
autoFocusPoint | 此属性允许您设置/获取相机的自动对焦点。这仅适用于 Android 和 iOS 设备。 |
deviceName | 设置为指定要使用的设备的名称。 |
didUpdateThisFrame | 视频缓冲区在本帧中是否更新? |
isDepth | 如果纹理基于深度数据,则此属性为 true。 |
isPlaying | 返回相机当前是否正在播放。 |
requestedFPS | 设置相机设备的请求帧率(以帧/秒为单位)。 |
requestedHeight | 设置相机设备的请求高度。 |
requestedWidth | 设置相机设备的请求宽度。 |
videoRotationAngle | 返回一个顺时针角度(以度为单位),可用于旋转多边形,以便相机内容以正确的方向显示。 |
videoVerticallyMirrored | 返回纹理图像是否垂直翻转。 |
WebCamTexture | 创建一个 WebCamTexture。 |
GetPixel | 获取坐标 (x, y) 处的像素颜色。 |
GetPixels | 获取某个mipmap级别的像素颜色数据作为 Color 结构体。 |
GetPixels32 | 获取某个mipmap级别的像素颜色数据作为 Color32 结构体。 |
Pause | 暂停相机。 |
Play | 启动相机。 |
Stop | 停止相机。 |
allowThreadedTextureCreation | 允许 Unity 内部在任何线程(而不是专用的渲染线程)上执行纹理创建。 |
currentTextureMemory | 场景中所有纹理使用的内存量。 |
desiredTextureMemory | 如果没有任何其他约束,Unity 加载的纹理的总大小(以字节为单位)。在 Unity 加载任何纹理之前,它会应用内存预算,如果纹理大小超过其值,则会降低加载的纹理分辨率。desiredTextureMemory 值考虑了 Unity 请求或手动设置的 mipmap 级别。例如,如果 Unity 未以全分辨率加载纹理,因为纹理距离较远或其请求的 mipmap 级别大于 0,则 Unity 会减少 desiredTextureMemory 值以匹配所需的总内存。desiredTextureMemory 值可能大于 Texture.targetTextureMemory 值。 |
GenerateAllMips | 可与采用 mip 计数的纹理构造函数一起使用,以指示应生成所有 mip。此字段的值为 -1。 |
nonStreamingTextureCount | 场景中非流式纹理的数量。这包括 Texture2D 和 CubeMap 纹理的实例。这并不包括任何其他纹理类型,也不包括 Unity 在内部创建的 2D 和 CubeMap 纹理。 |
nonStreamingTextureMemory | Unity 为场景中的非流式纹理分配的内存量。这仅包括 Texture2D 和 CubeMap 纹理的实例。这并不包括任何其他纹理类型,也不包括 Unity 在内部创建的 2D 和 CubeMap 纹理。 |
streamingMipmapUploadCount | 由于纹理 mipmap 流式传输而上传纹理的次数。 |
streamingRendererCount | 向纹理流式传输系统注册的渲染器数量。 |
streamingTextureCount | 流式纹理的数量。 |
streamingTextureDiscardUnusedMips | 此属性强制流式纹理系统丢弃所有未使用的 mipmap,而不是在纹理内存预算超过之前将其缓存。当您分析或编写测试以在内存中保留一组可预测的纹理时,这很有用。 |
streamingTextureForceLoadAll | 强制流式纹理加载所有 mipmap 级别。 |
streamingTextureLoadingCount | 当前正在加载 mipmap 的流式纹理的数量。 |
streamingTexturePendingLoadCount | 待加载的流式纹理的 mipmap 数量。 |
targetTextureMemory | Unity 在应用内存预算并完成纹理加载后,为场景中的纹理分配的纹理内存总量。`targetTextureMemory` 也考虑了 mipmap 流式传输设置。此值仅包括 Texture2D 和 CubeMap 纹理的实例。此值不包括任何其他纹理类型,也不包括 Unity 在内部创建的 2D 和 CubeMap 纹理。 |
totalTextureMemory | 如果 Unity 以 mipmap 级别 0 加载所有纹理,则 Unity 将使用的纹理内存总量。这是一个理论值,不考虑流式传输系统或任何其他输入,例如当您手动设置`Texture2D.requestedMipmapLevel`时。要查看考虑输入的纹理内存值,请使用`desiredTextureMemory`。`totalTextureMemory` 仅包括 Texture2D 和 CubeMap 纹理的实例。此值不包括任何其他纹理类型,也不包括 Unity 在内部创建的 2D 和 CubeMap 纹理。 |
hideFlags | 对象是否应隐藏、与场景一起保存或用户可修改? |
name | 对象的名称。 |
anisoLevel | 定义纹理的各向异性过滤级别。 |
dimension | 纹理的维度(类型)(只读)。 |
filterMode | 纹理的过滤模式。 |
graphicsFormat | 返回纹理对象的 GraphicsFormat 格式或颜色格式。 |
graphicsTexture | 表示上传到图形设备的纹理资源的 GraphicsTexture(只读)。 |
height | 纹理的高度(以像素为单位)(只读)。 |
imageContentsHash | 纹理的哈希值。 |
isDataSRGB | 如果纹理像素数据位于 sRGB 颜色空间中,则返回 true(只读)。 |
isReadable | Unity 是否在 CPU 可寻址内存中存储此纹理的像素数据的额外副本。 |
mipMapBias | 纹理的 mipmap 偏差。 |
mipmapCount | 此纹理中包含多少个 mipmap 级别(只读)。 |
updateCount | 更新纹理时,此计数器会递增。 |
width | 纹理的宽度(以像素为单位)(只读)。 |
wrapMode | 纹理坐标环绕模式。 |
wrapModeU | 纹理 U 坐标环绕模式。 |
wrapModeV | 纹理 V 坐标环绕模式。 |
wrapModeW | Texture3D 的纹理 W 坐标环绕模式。 |
GetInstanceID | 获取对象的实例 ID。 |
ToString | 返回对象的名称。 |
GetNativeTexturePtr | 检索到纹理资源的本机(底层图形 API)指针。 |
IncrementUpdateCount | 递增更新计数器。 |
Destroy | 删除 GameObject、组件或资源。 |
DestroyImmediate | 立即销毁对象 obj。强烈建议您使用 Destroy 代替。 |
DontDestroyOnLoad | 加载新场景时不要销毁目标对象。 |
FindAnyObjectByType | 检索类型为 type 的任何活动加载对象。 |
FindFirstObjectByType | 检索类型为 type 的第一个活动加载对象。 |
FindObjectsByType | 检索类型为 type 的所有加载对象的列表。 |
Instantiate | 克隆对象 original 并返回克隆。 |
InstantiateAsync | 捕获原始对象(必须与某些 GameObject 相关)的快照并返回 AsyncInstantiateOperation。 |
SetGlobalAnisotropicFilteringLimits | 设置各向异性限制。 |
SetStreamingTextureMaterialDebugProperties | 此函数在 mipmap 流式传输系统已知的全部材质上设置 mipmap 流式传输调试属性。 |
bool | 对象是否存在? |
operator != | 比较两个对象是否引用不同的对象。 |
operator == | 比较两个对象引用以查看它们是否引用同一个对象。 |