Unity中Camera.main和Camera.current的区别

在Unity中,Camera.main和Camera.current都是用来获取相机,那到底有什么区别呢?

一、异同及注意事项

1、相同点:

  • Camera.main和Camera.current都是用于获取相机的属性。
  • 它们都是静态属性,可以通过Camera类访问。
  • 它们都返回一个相机对象。

2、不同点:

  • Camera.main返回当前场景中激活的相机(如果存在多个相机,则返回其中的一个),而Camera.current返回当前渲染图形的相机。
  • Camera.main通常用于在代码中获取当前活动的相机,而Camera.current通常用于在渲染图形时获取当前相机的属性和状态。
  • Camera.current只在渲染图形期间有效,而在渲染图形之外的代码中,Camera.current属性的值为null。而Camera.main在任何时候都可以使用,但需要注意性能开销。

3、注意事项:

  • Camera.main的使用应该尽量避免在频繁调用的代码中,由于需要在场景中查找激活的相机,因此它的性能开销可能会比较高。如果需要在多个位置获取当前活动的相机,建议将其缓存到变量中,并在需要时使用该变量。
  • Camera.current只在渲染图形期间有效,因此在渲染图形之外的代码中,使用Camera.current属性会导致返回null。如果需要在渲染图形外的代码中获取相机的属性和状态,应该使用Camera.main属性。
  • 在使用Camera.current时,需要注意在正确的上下文中使用它。例如,在OnRenderImage方法中,Camera.current已被设置为当前渲染图形的相机,因此可以直接使用Camera.current。但在其他上下文中,Camera.current可能为null,因此需要进行空值检查。
  • 在使用Camera.main时,需要注意性能开销。由于需要在场景中查找激活的相机,因此Camera.main的使用应该尽量避免在频繁调用的代码中。如果需要在多个位置获取当前活动的相机,建议将其缓存到变量中,并在需要时使用该变量。

二、官方文档附录

附录1:Camera.current的官方说明
在这里插入图片描述

Unity关于Camera.current属性的官方文档解释:

【1】Camera.current属性是一个静态属性,用于获取当前使用的相机对象,仅用于低级别的渲染控制(只读)。

【2】大多数情况下,您应该使用Camera.main属性来获取场景中的主相机对象。只有在实现以下事件时才应该使用Camera.current属性:MonoBehaviour.OnRenderImage、MonoBehaviour.OnPreRender、MonoBehaviour.OnPostRender。

【3】在大多数情况下,建议使用Camera.main属性来获取场景中的主相机对象。只有在需要执行特殊的渲染操作时才应使用Camera.current属性。例如,在实现自定义后期处理效果时,您可以使用Camera.current属性来访问当前渲染的相机对象并进行特殊的图像处理操作。

【注意事项】:Camera.current属性只在特定的渲染事件中才能正常工作,并且在其他情况下将返回null。因此,在使用Camera.current属性时,您应该确保它是在正确的上下文中使用,并且已正确初始化。

附录2:Camer.main的官方说明
在这里插入图片描述

Camera.main属性的官方文档解释:

【1】Camera.main属性是一个只读属性,用于获取场景中被标记为“MainCamera”且启用的第一个相机组件。

【2】如果场景中没有被标记为“MainCamera”且启用的相机组件,则Camera.main属性将返回null。

【3】在内部,Unity缓存了所有被标记为“MainCamera”的GameObject对象。当您访问Camera.main属性时,Unity会从其缓存中返回第一个有效结果。访问此属性会产生一些CPU开销,与调用GameObject.GetComponent类似。在需要考虑CPU性能的情况下,可以考虑缓存此属性。

【注意事项】:Camera.main属性通常用于获取场景中的主相机对象,因为它提供了一种简单而方便的方式来访问主相机。但是,如果场景中有多个相机对象被标记为“MainCamera”,则Camera.main属性将返回其中一个相机对象,但您无法确定它是哪个相机对象。因此,在使用Camera.main属性时,您应该确保场景中只有一个相机对象被标记为“MainCamera”。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity可以通过Android的Camera2 API来访问USB摄像头。 首先,在Unity创建一个Android插件,该插件将使用Android的Camera2 API来访问USB摄像头。然后,在Unity调用该插件以获取从USB摄像头获取的视频数据。 以下是一个简单的Unity Android插件示例,可以用于访问USB摄像头: ```java public class USBCameraPlugin { private static CameraDevice camera; private static CaptureRequest.Builder previewBuilder; private static SurfaceTexture surfaceTexture; private static Surface previewSurface; private static HandlerThread handlerThread; private static Handler handler; private static Semaphore cameraOpenCloseLock = new Semaphore(1); public static void startCamera(int textureId) { // Open the camera CameraManager manager = (CameraManager) UnityPlayer.currentActivity.getSystemService(Context.CAMERA_SERVICE); String[] cameraIds = null; try { cameraIds = manager.getCameraIdList(); } catch (CameraAccessException e) { e.printStackTrace(); } if (cameraIds == null || cameraIds.length == 0) { return; } String cameraId = cameraIds[0]; try { if (!cameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) { throw new RuntimeException("Time out waiting to lock camera opening."); } manager.openCamera(cameraId, new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice cameraDevice) { cameraOpenCloseLock.release(); camera = cameraDevice; startPreview(textureId); } @Override public void onDisconnected(@NonNull CameraDevice cameraDevice) { cameraOpenCloseLock.release(); cameraDevice.close(); camera = null; } @Override public void onError(@NonNull CameraDevice cameraDevice, int error) { cameraOpenCloseLock.release(); cameraDevice.close(); camera = null; } }, handler); } catch (InterruptedException e) { throw new RuntimeException("Interrupted while trying to lock camera opening.", e); } catch (CameraAccessException e) { e.printStackTrace(); } } public static void stopCamera() { if (camera != null) { camera.close(); camera = null; } } private static void startPreview(int textureId) { if (camera == null) { return; } try { // Create a surface texture to receive camera data surfaceTexture = new SurfaceTexture(textureId); surfaceTexture.setDefaultBufferSize(1920, 1080); previewSurface = new Surface(surfaceTexture); // Build the preview request previewBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); previewBuilder.addTarget(previewSurface); // Create a handler thread to handle camera events handlerThread = new HandlerThread("CameraBackground"); handlerThread.start(); handler = new Handler(handlerThread.getLooper()); // Start the preview camera.createCaptureSession(Arrays.asList(previewSurface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { try { cameraCaptureSession.setRepeatingRequest(previewBuilder.build(), null, handler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { stopCamera(); } }, handler); } catch (CameraAccessException e) { e.printStackTrace(); } } } ``` 然后,在Unity调用该插件以访问USB摄像头。以下是一个简单的C#脚本示例,可以用于在Unity调用Android插件并从USB摄像头获取视频数据: ```csharp public class USBCamera : MonoBehaviour { private AndroidJavaObject plugin; private Texture2D texture; private byte[] data; private int width = 1920; private int height = 1080; void Start () { // Create the Android plugin object plugin = new AndroidJavaObject("com.example.usbcamera.USBCameraPlugin"); // Set the texture to display camera data texture = new Texture2D(width, height, TextureFormat.RGBA32, false); GetComponent<Renderer>().material.mainTexture = texture; // Call the Android plugin to start the camera plugin.Call("startCamera", texture.GetNativeTexturePtr().ToInt32()); } void OnDestroy() { // Call the Android plugin to stop the camera plugin.Call("stopCamera"); } void Update () { // Update the texture with the latest camera data if (data == null) { data = new byte[width * height * 4]; } texture.LoadRawTextureData(data); texture.Apply(); } private void OnApplicationQuit() { // Call the Android plugin to stop the camera plugin.Call("stopCamera"); } } ``` 这样,你就可以在Unity通过Android插件访问USB摄像头并获取视频数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值