Unity Camera深度指南——全面解析实例对象的属性及其应用

前言

Camera实例对象的属性涵盖了从基本视图和投影设置到高级性能和渲染选项。每个属性都有其特定的用途和配置场景,允许开发者在Unity中精细地控制摄像机的行为。


Tips:找到你想看的属性点击即可跳转到相应的解释哦~

一、基本视图设置:

fieldOfView: 定义了摄像机的视角宽度。
nearClipPlane: 定义了摄像机视锥的近平面。
farClipPlane: 定义了摄像机视锥的远平面。
aspect: 表示摄像机视锥的宽高比,即视图宽度除以视图高度的比率。
orthographic: 一个布尔值,用于切换摄像机的投影模式。
orthographicSize: 定义了摄像机视图半高的大小。

二、渲染路径与技术:

actualRenderingPath: 用于确定摄像机的实际渲染路径。
renderingPath: 允许你选择摄像机应使用的渲染路径。
allowHDR: 指定摄像机是否允许使用高动态范围 (HDR) 渲染。
allowMSAA: 控制摄像机是否使用多重采样抗锯齿 (MSAA)。
depthTextureMode: 用于控制摄像机是否应生成深度纹理或运动矢量纹理。
opaqueSortMode: 定义了不透明物体的排序方式。
transparencySortMode: 控制透明物体的排序方式。

三、性能优化:

allowDynamicResolution: 允许摄像机动态调整其分辨率以提高性能或图像质量。
useOcclusionCulling: 允许摄像机利用遮挡剔除来提高渲染效率,不渲染被其他物体完全遮挡的对象。
layerCullDistances: 允许你为每个图层设置一个特定的剔除距离。
layerCullSpherical: 用来决定剔除计算是基于球形体(true)还是基于相机平面的距离(false)

四、VR和立体视觉:

stereoEnabled: 摄像机是否处于立体模式。
stereoSeparation: 表示左右眼摄像机之间的距离,影响立体视觉的强度。
stereoConvergence: 控制收敛点的位置,影响物体在3D空间中的感知深度。
areVRStereoViewMatricesWithinSingleCullTolerance: 检查VR(虚拟现实)环境中左右眼视图矩阵是否足够接近。

五、输出和显示设置:

activeTexture: 当前摄像机渲染到的活动纹理。
targetTexture: 当前摄像机目标纹理。
pixelRect: 定义了摄像机视口在屏幕上的位置和大小。
targetDisplay: 用于指定摄像机的输出目标显示器。
rect: 定义了摄像机视口的矩形区域。
cameraType: 定义摄像机的类型。
forceIntoRenderTexture: 是否应该总是将摄像机的输出渲染到一个纹理中。

六、高级属性与杂项:

worldToCameraMatrix: 一个Matrix4x4,表示从世界坐标系到摄像机坐标系的转换。
projectionMatrix: 一个Matrix4x4,用于定义摄像机的投影矩阵。
nonJitteredProjectionMatrix: 提供了一个不包含抖动(jitter)效果的投影矩阵版本。
velocity: 摄像机的移动速度和方向。
sensorSize: 定义了摄像机传感器的大小。
usePhysicalProperties: 启用物理属性。
overrideSceneCullingMask: 设置自定义的剔除蒙版,这个蒙版决定了哪些层(Layer)的对象应该被渲染或忽略。
clearFlags: 摄像机在开始渲染之前应该如何渲染颜色和深度缓冲区。
backgroundColor: 摄像机屏幕背景颜色。
cullingMask: 哪些层(Layer)被当前摄像机渲染。
eventMask: 控制哪些层(Layer)上的事件可以被当前摄像机所注册。
clearStencilAfterLightingPass: 一个布尔值,用于指定在光照阶段后是否清除模板缓冲区。
gateFit: 当摄像机的纵横比与物理摄像头的纵横比不匹配时,如何调整图像以适应视口。
transparencySortAxis: 定义透明对象的排序轴。


一、基本视图设置:

fieldOfView

定义:
fieldOfView 属性定义了摄像机的视角宽度,以度为单位。
 
用途:
这是摄像机视锥的垂直视角,影响场景的透视强度。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.fieldOfView = 60.0f; // 设置视角宽度为60度
}

nearClipPlane 和 farClipPlane

定义:
这两个属性定义了摄像机视锥的近平面和远平面。
 
用途:
只有在这两个平面之间的物体才会被摄像机渲染。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.nearClipPlane = 0.1f; // 最近裁剪面
    camera.farClipPlane = 1000.0f; // 最远裁剪面
}

aspect

定义:
示摄像机视锥的宽高比,即视图宽度除以视图高度的比率。
 
用途:
这个比率影响摄像机视图的形状。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.aspect = 16.0f / 9.0f; // 设置宽高比为16:9
}

orthographic

定义:
orthographic 是一个布尔值,用于切换摄像机的投影模式。
 
用途:
当设置为 true 时,摄像机将使用正交投影,这种投影不会使物体因距离远近而产生大小变化。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.orthographic = true; // 开启正交投影
}

orthographicSize

定义:
当摄像机处于正交模式时,orthographicSize 属性定义了摄像机视图半高的大小。
 
用途:
这个值表示从摄像机的中心到视图顶部的距离。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.orthographic = true; // 确保是正交模式
    camera.orthographicSize = 5.0f; // 视图半高设置为5单位
}

二、渲染路径与技术:

actualRenderingPath

定义:
属性表示摄像机实际使用的渲染路径。
 
用途:
这个属性是只读的,它依赖于项目设置和摄像机的renderingPath设置。

  • DeferredShading: 延迟渲染路径,允许更多的光照和影响效果。
  • Forward: 正向渲染路径,适用于需要较多透明物体或特殊效果的场景。
  • VertexLit: 顶点光照渲染路径,适用于性能有限的平台。

示例:

void Start() {
    Camera camera = Camera.main;
    Debug.Log("摄像机实际使用的渲染路径: " + camera.actualRenderingPath);
}

renderingPath

定义:
允许你选择摄像机应使用的渲染路径。
 
用途:
这个属性可以被设置为上述三种路径之一,或者设置为UsePlayerSettings来使用全局项目设置。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.renderingPath = RenderingPath.DeferredShading;
    Debug.Log("渲染路径设置为: " + camera.renderingPath);
}

allowHDR

定义:
allowHDR 属性指定摄像机是否允许使用高动态范围 (HDR) 渲染。
 
用途:
开启HDR可以增强场景的光照和色彩表现,但可能会增加GPU负载。

示例:

void Start() {
    Camera camera = Camera.main;
    // 允许HDR渲染
    camera.allowHDR = true;
}

allowMSAA

定义:
allowMSAA 控制摄像机是否使用多重采样抗锯齿 (MSAA)。
 
用途:
MSAA可以提高图像质量,使边缘更平滑,但会增加渲染成本。

示例:

void Start() {
    Camera camera = Camera.main;
    // 开启MSAA
    camera.allowMSAA = true;
}

depthTextureMode

定义:
用于控制摄像机是否应生成深度纹理或运动矢量纹理。
 
用途:
这些纹理对于实现某些视觉效果(如屏幕空间反射、阴影等)至关重要。

  • None: 不生成任何纹理。
  • Depth: 生成包含深度信息的纹理。
  • DepthNormals: 生成包含深度和法线信息的纹理。
  • MotionVectors: 生成包含运动向量信息的纹理。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.depthTextureMode = DepthTextureMode.Depth;
}

opaqueSortMode

定义:
定义了不透明物体的排序方式。
 
用途:
对于渲染性能和正确的视觉输出有重要影响。

  • Default: 使用Unity的默认排序方法。
  • FrontToBack: 物体按从前到后的顺序排序,有助于提高渲染效率。
  • NoDistanceSort: 不按距离排序,这在某些特定情况下可能有用。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.opaqueSortMode = OpaqueSortMode.FrontToBack;
}

transparencySortMode

定义:
控制透明物体的排序方式,类似于 opaqueSortMode,但是专门针对透明物体的。
 
用途:
正确的排序对于防止渲染透明物体时出现的视觉错误非常关键。

  • Default: 使用Unity的默认排序方法。
  • Perspective: 从视角的透视效果中对透明物体进行排序。
  • Orthographic: 在正交视图中按深度对透明物体进行排序。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.transparencySortMode = TransparencySortMode.Perspective;
}

三、性能优化:

allowDynamicResolution

定义:
allowDynamicResolution 允许摄像机动态调整其分辨率以提高性能或图像质量。
 
示例:

void Start() {
    Camera camera = Camera.main;
    // 启用动态分辨率
    camera.allowDynamicResolution = true;
    Debug.Log("动态分辨率启用: " + camera.allowDynamicResolution);
}

useOcclusionCulling

定义:
useOcclusionCulling属性允许摄像机利用遮挡剔除来提高渲染效率,不渲染被其他物体完全遮挡的对象。
 
示例:

void Start() {
    Camera camera = Camera.main;
    // 开启遮挡剔除
    camera.useOcclusionCulling = true;
    Debug.Log("Occlusion Culling是否激活: " + camera.useOcclusionCulling);
}

layerCullDistances

定义:
允许你为每个图层设置一个特定的剔除距离。这个数组包含了与Unity中每个图层(Layer)相对应的距离值。
 
用途:
当摄像机与一个对象的距离超过该对象所在图层对应的距离时,该对象将不会被渲染。使用这种方法,可以减少视野中不必要的渲染调用,特别是在场景中远处不需要高详细度显示的对象。
示例:

void Start() {
    Camera camera = Camera.main;
    float[] distances = new float[32]; // Unity有32个可用的图层
    distances[0] = 100; // 第0层的剔除距离设置为100米
    distances[1] = 500; // 第1层的剔除距离设置为500米
    // 其他层可以根据需要设置
    camera.layerCullDistances = distances;
}

layerCullSpherical

定义:
一个布尔值,用来决定剔除计算是基于球形体(true)还是基于相机平面的距离(false)。默认情况下,这个值是false,意味着剔除是基于对象到相机的平面距离来计算的。
 
用途:
如果设置为true,剔除将基于对象到相机的球形距离来计算,这通常可以提供更自然的剔除效果,特别是在大范围的3D环境中。
示例:

void Start() {
    Camera camera = Camera.main;
    camera.layerCullSpherical = true; // 设置为基于球形距离剔除
}

四、VR和立体视觉:

stereoEnabled

定义:
摄像机是否处于立体模式。
 
用途:
用于查询和控制摄像机是否渲染立体视图,例如在VR应用中。


stereoConvergence 和 stereoSeparation

定义:
这两个属性用于控制立体3D视觉的参数。stereoConvergence 控制收敛点的位置,影响物体在3D空间中的感知深度。stereoSeparation 表示左右眼摄像机之间的距离,影响立体视觉的强度。
 
示例:

void Start() {
    Camera camera = Camera.main;
    // 设置立体视觉参数
    camera.stereoConvergence = 10.0f;
    camera.stereoSeparation = 0.1f;
}

areVRStereoViewMatricesWithinSingleCullTolerance

定义:
此属性检查VR(虚拟现实)环境中左右眼视图矩阵是否足够接近。
 
用途:
以便可以在单次剔除操作中处理它们,这有助于提高VR渲染性能。

示例:

void Start() {
    Camera camera = Camera.main;
    // 检查VR立体视图矩阵是否在单次剔除公差范围内
    bool areWithinTolerance = camera.areVRStereoViewMatricesWithinSingleCullTolerance;
    Debug.Log(areWithinTolerance);
}

五、输出和显示设置

activeTexture

定义:
activeTexture属性显示当前摄像机渲染到的活动纹理。
 
用途:
这在多摄像机渲染或动态渲染纹理时特别有用。

示例:

// 将摄像机的输出设置一个新的RenderTexture
void Start() {
    Camera camera = Camera.main;
    RenderTexture rt = new RenderTexture(1024, 768, 24);
    camera.targetTexture = rt;
    Debug.Log("活动纹理:" + camera.activeTexture.name);
}

targetTexture

定义:
允许将摄像机的输出渲染到一个纹理而非直接到屏幕。
 
用途:
这对于创建效果如屏幕空间效果、渲染到UI元素或离屏处理等非常有用。

示例参照上面


pixelRect

定义:
pixelRect属性定义了摄像机视口在屏幕上的位置和大小。
 
用途:
它可以用于设置多摄像机布局。

示例:

void Start() {
    Camera camera = Camera.main;
    // 设置摄像机的视口为屏幕左半部分
    camera.pixelRect = new Rect(0, 0, Screen.width / 2, Screen.height);
}

targetDisplay

定义:
targetDisplay属性用于指定摄像机的输出目标显示器。
 
用途:
这在多显示器设置中非常有用。

示例:

void Start() {
    Camera camera = Camera.main;
    // 设置摄像机输出到第二个显示器
    camera.targetDisplay = 1;
}

rect

定义:
定义了摄像机视口的矩形区域,其值是一个Rect类型,范围从0到1,代表相对于屏幕或窗口的位置和大小。
 
用途:
这允许多个摄像机渲染到同一个屏幕的不同区域,常用于实现分屏效果或者在界面上显示小的预览窗口。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.rect = new Rect(0, 0, 0.5f, 1.0f); // 摄像机视口占据屏幕左半部分
}

cameraType

定义:
摄像机的类型
 
用途:
允许你定义摄像机的类型,这影响了渲染和优化过程中的行为。

  • Game: 主游戏摄像机。
  • SceneView: 在编辑器中用于场景视图的摄像机。
  • Preview: 用于预览的摄像机。
  • VR: 专门用于虚拟现实的摄像机。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.cameraType = CameraType.Game;
}

forceIntoRenderTexture

定义:
是一个布尔值,它指示Unity是否应该总是将摄像机的输出渲染到一个纹理中,即使targetTexture属性为null。
 
用途:
这对于一些特定的渲染效果或者当需要操作摄像机输出的像素数据时非常有用。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.forceIntoRenderTexture = true;
}

六、高级属性与杂项:

worldToCameraMatrix

定义:
是一个Matrix4x4,表示从世界坐标系到摄像机坐标系的转换。
 
用途:
默认情况下,这个矩阵由摄像机的位置和旋转自动计算,但可以手动设置来实现特殊的效果或修正视图。手动设置worldToCameraMatrix可以用于创建定制的摄像机效果,如镜头扭曲或特殊视角。

示例:

void Start() {
    Camera camera = Camera.main;
    Matrix4x4 m = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3.one);
    camera.worldToCameraMatrix = m;
}

projectionMatrix

定义:
是一个Matrix4x4,用于定义摄像机的投影矩阵,这决定了如何将3D场景映射到2D屏幕。
 
用途:

  • 可以设置这个矩阵来实现非标准的透视效果或正交视图。
  • 自定义projectionMatrix,开发者可以实现如广角镜头、鱼眼效果等特殊的摄像效果。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.projectionMatrix = Matrix4x4.Perspective(60, camera.aspect, 0.3f, 1000f);
}

nonJitteredProjectionMatrix

定义:
提供了一个不包含抖动(jitter)效果的投影矩阵版本。
 
用途:
这在实现延迟渲染或需要稳定不变投影矩阵的后处理效果时非常有用。

示例:

Matrix4x4 stableMatrix = Camera.main.nonJitteredProjectionMatrix;

velocity

定义:
提供了摄像机的移动速度和方向,这是一个Vector3。
 
用途:
对于实现基于速度的效果非常有用,比如运动模糊。

示例:

Vector3 camVelocity = Camera.main.velocity;

sensorSize

定义:
是一个Vector2,定义了摄像机传感器的大小。
 
用途:
这个值影响焦距和视场的计算,模拟真实世界的摄像机。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.sensorSize = new Vector2(36, 24); // 35mm全幅相机
}

usePhysicalProperties

定义:
是一个布尔值,当设置为true时,摄像机将使用物理基础的属性(如sensorSize和focalLength)来计算视场(Field of View,FOV)和其它相关参数,模拟现实世界的摄像机行为。
 
用途:
启用物理属性可以帮助开发者更精确地控制摄影效果,特别是在需要模拟真实摄像机操作的仿真或高级视觉效果中。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.usePhysicalProperties = true;
    camera.sensorSize = new Vector2(36, 24); // 35mm全幅
    camera.focalLength = 50; // 50mm焦距
}

overrideSceneCullingMask

定义:
允许开发者为摄像机设置一个自定义的剔除蒙版,这个蒙版决定了哪些层(Layer)的对象应该被渲染或忽略。这是一个64位整数,可以通过位操作来设置多层。
 
用途:
使用overrideSceneCullingMask可以优化性能,通过确保摄像机只渲染场景中重要或必要的部分。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.overrideSceneCullingMask = (ulong)(1 << LayerMask.NameToLayer("UI"));
}

clearFlags

定义:
定义了摄像机在开始渲染之前应该如何渲染颜色和深度缓冲区。
 
用法:
选择合适的clearFlags可以根据需要减少渲染负担,提高性能。

  • Skybox:使用场景的天空盒填充背景。
  • Solid Color:使用单一颜色渲染背景。
  • Depth only:不渲染颜色缓冲区,只渲染深度。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.clearFlags = CameraClearFlags.SolidColor;
    camera.backgroundColor = Color.black;
}

backgroundColor

定义:
当摄像机的clearFlags设置为Solid Color时,backgroundColor属性定义了用于渲染屏幕的颜色。
 
用法:
这个设置常用于需要特定背景颜色的游戏或应用场景。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.backgroundColor = Color.green;
}

cullingMask

定义:
决定哪些层(Layer)被当前摄像机渲染。这是通过位掩码来配置的,允许开发者精确控制每个摄像机可以看到哪些对象。
 
用法:
正确设置cullingMask可以优化渲染性能,尤其是在复杂场景中,通过确保摄像机只处理视觉上重要的对象。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.cullingMask = (1 << LayerMask.NameToLayer("Player")) | (1 << LayerMask.NameToLayer("Enemy"));
}

eventMask

定义:
用来控制哪些层(Layer)上的事件可以被当前摄像机所注册。
 
用法:
这主要影响如鼠标点击、射线投射等由摄像机触发的事件处理程序。
正确设置eventMask可以优化事件处理的性能,尤其是在复杂场景或多摄像机环境中,确保事件只被必要的摄像机捕捉和处理。

示例:

void Start() {
    Camera camera = Camera.main;
    // 只在Player层上接收事件
    camera.eventMask = 1 << LayerMask.NameToLayer("Player");
}

clearStencilAfterLightingPass

定义:
是一个布尔值,用于指定在光照阶段后是否清除模板缓冲区。
 
用法:
这可以有助于在特定的渲染流程中管理模板缓冲区的内容,特别是在使用后处理效果或其他需要模板缓冲区的技术时。
启用此选项可能会影响性能,因此只有当确实需要在光照渲染后清除模板缓冲区时才应该开启。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.clearStencilAfterLightingPass = true;
}

gateFit

定义:
定义了当摄像机的纵横比与物理摄像头的纵横比不匹配时,如何调整图像以适应视口。
 
它的选项包括:

  • Vertical:保持垂直维度匹配,水平方向可能被裁剪。
  • Horizontal:保持水平维度匹配,垂直方向可能被裁剪。
  • None:不进行任何调整,图像可能不会完全填充视口或有额外的空白。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.gateFit = Camera.GateFitMode.Vertical;
}

transparencySortAxis

定义:
允许开发者定义透明对象的排序轴,这对于正确渲染重叠的透明物体至关重要。
 
用途:
1.默认情况下,Unity按摄像机的视线方向排序透明物体,但在某些场景中可能需要按不同的轴进行排序。
2.通过自定义transparencySortAxis,开发者可以优化透明物体的渲染效果,特别是在复杂场景中,这有助于减少排序错误导致的视觉问题。

示例:

void Start() {
    Camera camera = Camera.main;
    camera.transparencySortAxis = new Vector3(0, 1, 0); // 按Y轴排序
}

总结

要充分利用这些属性,建议进一步实验和调整,观察它们对你的特定项目的影响。
不断探索和学习,保持好奇心和创新精神,是每一位游戏开发者技术成长的关键。

希望这篇文章也值得您们收藏~

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Unity解析JSON对象的过程可以分为以下几个步骤: 1. 导入Json解析Unity使用JsonUtility类解析JSON对象,需要导入UnityEngine.dll和UnityEngine.Networking.dll两个库。 2. 定义实体类 定义一个与JSON对象结构相同的实体类,该实体类的属性名需要与JSON对象的键名相同,类型需要与JSON对象的值类型相同。 3. 调用JsonUtility.FromJson()方法 使用JsonUtility.FromJson()方法将JSON字符串转换成实体对象。该方法接收两个参数:一个是JSON字符串,另一个是实体类的类型。 4. 获取实体对象属性值 通过访问实体对象属性来获取JSON对象的值。在获取属性值之前,需要先将JSON字符串转换成实体对象。 5. 销毁实体对象 使用完实体对象后需要调用Destroy()方法将其销毁,以释放内存。 下面是一个简单的示例代码: ```csharp [System.Serializable] public class PlayerInfo { public string name; public int level; } string jsonString = "{\"name\":\"Tom\",\"level\":10}"; PlayerInfo playerInfo = JsonUtility.FromJson<PlayerInfo>(jsonString); Debug.Log(playerInfo.name); Debug.Log(playerInfo.level); Destroy(playerInfo); ``` 在上面的代码中,我们定义了一个名为PlayerInfo的实体类,该类包含name和level两个属性,代表了JSON对象的结构。然后,我们使用JsonUtility.FromJson()方法将JSON字符串转换成PlayerInfo对象,并通过访问PlayerInfo对象属性来获取JSON对象的值。最后,我们调用Destroy()方法将PlayerInfo对象销毁。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Y仙森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值