Unity基础学习(十)Camera组件

目录

一、认识Camera面板

[1、Clear Flags 如何清除背景](#1、Clear Flags 如何清除背景)

[2、Culling Mask 剔除遮罩 选择性渲染部分层级 可以指定只渲染对应层级的对象。就是说可以只渲染你想要渲染的部分,按层级确定。也就是前面提到的Layer的作用](#2、Culling Mask 剔除遮罩 选择性渲染部分层级 可以指定只渲染对应层级的对象。就是说可以只渲染你想要渲染的部分,按层级确定。也就是前面提到的Layer的作用)

[3、Project 投影类型](#3、Project 投影类型)

3-1Perspective:3D透视投影(FOV生效))

3-2Orthographic:2D正交投影(Size参数生效)

[4、Clipping Planes 裁剪平面](#4、Clipping Planes 裁剪平面)

[5、Viewport Rect视口范围 屏幕上将绘制该摄像机视图的位置 主要用于双摄像机游戏 0~1 相当于宽高百分比](#5、Viewport Rect视口范围 屏幕上将绘制该摄像机视图的位置 主要用于双摄像机游戏 0~1 相当于宽高百分比)

[6、Depth 渲染顺序上的深度 刚才上面提到的](#6、Depth 渲染顺序上的深度 刚才上面提到的)

[7、Redering path 渲染路径](#7、Redering path 渲染路径)

[8、Target Texture 渲染纹理 可以把摄像机画面渲染到一张图 主要用于制作小地图 在Project右键创建 Render Texture](#8、Target Texture 渲染纹理 可以把摄像机画面渲染到一张图 主要用于制作小地图 在Project右键创建 Render Texture)

[9、Occlusion Culling 是否启用剔除遮挡 顾名思义 就是一个开关作用](#9、Occlusion Culling 是否启用剔除遮挡 顾名思义 就是一个开关作用)

其余:

二、认识Camera这个类

1、重要静态成员

2、重要方法


一、认识Camera面板

今天我们来学习Camera组件的相关内容,随意打开一个摄像机,可以看到如下面板,我们来一次介绍下面面板上面参数的作用。

1、Clear Flags 如何清除背景

如下图 这是一个最初始的游戏界面图,通过更改Clear Flags 这里的各种选项,就可以实现不同的背景效果

skybox 用天空盒填充背景(需配合场景天空盒设置) 默认的是天空盒 可以在这里修改

Window > Rendering > Lighting->Environment

Solid Color颜色填充 使用指定纯色作为背景(通过下方Background颜色选择)

Depth only 只画该层,背景透明。简单来说,就是场景上有多个摄像机时,后面出现的摄像机,会将前面出现的摄像机渲染出来的东西给覆盖掉,只会绘制当前摄像机中能够渲染的内容。这个可以通过一个参数叫做Depth深度自己手动选择。越大的越后渲染,出现在最前面。

Don't Clear 不移除,覆盖渲染不执行任何颜色/深度缓冲清除操作​ 新渲染内容直接叠加在上一帧画面上

2、Culling Mask 剔除遮罩选择性渲染部分层级 可以指定只渲染对应层级的对象。就是说可以只渲染你想要渲染的部分,按层级确定。也就是前面提到的Layer的作用

3、Project 投影类型

3-1Perspective:3D透视投影(FOV生效)

下面这个Field Of View 就可以调节你的可以看见的视野范围

FOV Axis 视场角 轴 决定了光学仪器的视野范围

Field of view 视口大小

可以看出 摄像机 渲染的范围 其实是一个台体,你通过改变Field Of View 的调节 就可以改变下面这个白色框线的大小。简单来记忆 就是渲染3D的模型,就需要用到摄像机的这个模式

可以看到下面还有一个Physical Camera,这个的作用是啥呢,使用来模拟现实中的摄像机的。由于我不会,只能简单介绍下参数:

物理摄像机

勾选后可以模拟真实世界中的摄像机 焦距 传感器尺寸 透镜移位等等

Focal Length 焦距

Sensor Type 传感器类型

Sensor Size 传感器尺寸

Lens Shift 透镜移位

Gate Fit 闸门配合

3-2Orthographic:2D正交投影(Size参数生效)

我们可以看到,将模式转变之后,渲染框线就变成了一个长方体,这个时候你在游戏画面上看到的就只有一个2D投影。通过Size可以改变这个大小。简单来记忆,这个模式就是专门渲染2D动画使用的

4、Clipping Planes 裁剪平面

Near:0.01-10(单位:米),过小会导致近处穿模

Far:1-100000,建议根据场景规模动态调整(开放世界推荐5000+)

调试技巧:通过Scene视图的裁剪平面指示器可视化调整

刚才说了,这实际上渲染的是一个台体范围内的对象,所以我们可以自由的移动上下台面,怎么移动呢,就是通过上面两个参数,达到控制渲染范围的目的

5、Viewport Rect视口范围

屏幕上将绘制该摄像机视图的位置
主要用于双摄像机游戏
0~1 相当于宽高百分比

通过修改不同摄像机的范围 就可以达到不同的视角

6、Depth 渲染顺序上的深度 刚才上面提到的

7、Redering path 渲染路径

Forward:前向渲染(移动端首选)

Deferred:延迟渲染(支持更多动态光源)

剩下两个都是自定实现 默认就行 除非你有特殊需求

8、Target Texture 渲染纹理

可以把摄像机画面渲染到一张图 主要用于制作小地图
在Project右键创建 Render Texture

Target Texture​ 是相机渲染输出的重定向控制器,可将画面输出到 ​Render Texture​(渲染纹理),而非直接显示在屏幕上。注意在配置这个属性时,要将Depth设置为-1,避免影响主摄像机的渲染。

9、Occlusion Culling 是否启用剔除遮挡 顾名思义 就是一个开关作用

其余:

Allow HDR

是否允许高动态范围渲染

Allow MSAA

是否允许抗锯齿

Allow Dynamic Resolution

是否允许动态分辨率呈现

Target Display

用于哪个显示器

主要用来开发有多个屏幕的平台游戏

二、认识Camera这个类

下面的内容掌握了,基本上就足够使用了。

1、重要静态成员

cs 复制代码
//1.获取摄像机
//如果用之前的知识来获取摄像机,需要先获取摄像机所在的物体,然后获取摄像机组件
//主摄像机的获取
//如果通过下面这种方式快速获取,那么场景上必须得有一个tag为MainCamera的物体,否则会返回null
print(Camera.main.name);
//获取摄像机的数量
print(Camera.allCamerasCount);
//获取所有的摄像机
Camera[] cameras = Camera.allCameras;
print(cameras.Length);

//2.渲染相关委托
//OnPreCull:在摄像机剔除场景之前调用
Camera.onPreCull += (c)=>
{

};
//OnPreRender:在摄像机渲染场景之前处理的委托 传的是自己
Camera.onPreRender += (c) =>
{
};
//OnPostRender:在摄像机渲染场景之后处理的委托 传的是自己
Camera.onPostRender += (c) =>
{
    
};

2、重要方法

注意 这里 是通过Camera.main.出来使用的

cs 复制代码
//1.界面上的所有参数 都可以在Camera中获取到
//比如下面这句代码 就是得到主摄像机对象上的深度 进行设置
Camera.main.depth = 1;
//2.世界坐标转屏幕坐标
//转换过后 x和y对应的就是 屏幕坐标 z对应的是这个3D物体离我们有多远
//我们会用这个来做的功能 最多的就是 头顶血条相关的功能
Vector3 v3 = Camera.main.WorldToScreenPoint(transform.position);
print(v3);

//3.屏幕坐标转世界坐标
//之所以改变Z轴 是因为 如果不改的话 z默认是0,而0是摄像机的前方,所以会看不到
//转换过去世界坐标系的点 永远都只是一个点 可以理解为 视口相交的 焦点
//如果改变了z那么转换过去的 世界坐标的点 就是相对于摄像机前方多少单位的横截面上的世界坐标点
Vector3 v4 =Input.mousePosition;
v3.z = 10;
Vector3 worldPos = Camera.main.ScreenToWorldPoint(v3);

补充一个发射射线的方法:这个射线我们后面会详细讲解

cs 复制代码
using UnityEngine;

public class ObjectSelector : MonoBehaviour
{
    public LayerMask selectableLayer; // 在Inspector中指定可选中物体的层级

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            // 从鼠标位置发射射线
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, 100, selectableLayer))
            {
                // 选中物体逻辑
                GameObject selectedObj = hit.collider.gameObject;
                Debug.Log("选中物体:" + selectedObj.name);

                // 示例:高亮选中物体
                selectedObj.GetComponent<Renderer>().material.color = Color.yellow;
            }
        }
    }
}

上面的都是主要内容,下面的了解,即可。

静态成员 类型 功能描述
Camera.main 属性 获取场景中标签为MainCamera的摄像机实例(若不存在则返回null)。
Camera.allCameras 属性 返回场景中所有激活的摄像机数组(Camera[])。
Camera.allCamerasCount 属性 返回场景中激活的摄像机数量。
Camera.current 属性 (仅在渲染管线中有效)返回当前正在渲染的摄像机实例(用于Shader等底层逻辑)。
Camera.onPreCull 事件 在相机开始剔除之前触发的事件(可插入自定义逻辑)。
Camera.onPreRender 事件 在相机开始渲染之前触发的事件。
Camera.onPostRender 事件 在相机完成渲染后触发的事件。
方法名称 功能描述 参数 返回值 使用场景/示例
坐标转换
ScreenToWorldPoint 将屏幕坐标转换为世界坐标(需考虑Z值深度)。 Vector3 screenPos(屏幕坐标,Z为距相机的深度) Vector3(世界坐标) 将鼠标位置转换为3D世界中的点: Vector3 worldPos = cam.ScreenToWorldPoint(Input.mousePosition);
WorldToScreenPoint 将世界坐标转换为屏幕坐标(原点在左下角)。 Vector3 worldPos(世界坐标) Vector3(屏幕坐标) 在UI上显示3D物体的位置: Vector3 screenPos = cam.WorldToScreenPoint(objectTransform.position);
ViewportToWorldPoint 将视口坐标(0-1范围)转换为世界坐标。 Vector3 viewportPos(视口坐标,Z为距相机的深度) Vector3(世界坐标) 在视口中心生成物体: Vector3 center = cam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 10));
WorldToViewportPoint 将世界坐标转换为视口坐标(0-1范围)。 Vector3 worldPos(世界坐标) Vector3(视口坐标) 检测物体是否在相机视野内: if (cam.WorldToViewportPoint(pos).z > 0 && pos.x is between 0-1)
ScreenToViewportPoint 将屏幕坐标转换为视口坐标(归一化到0-1范围)。 Vector3 screenPos(屏幕坐标) Vector3(视口坐标) 适配不同分辨率: Vector3 viewportPos = cam.ScreenToViewportPoint(Input.mousePosition);
射线投射
ScreenPointToRay 从屏幕点发射一条射线,用于3D拾取或碰撞检测。 Vector3 screenPos(屏幕坐标) Ray(射线对象) 检测鼠标点击的物体: Ray ray = cam.ScreenPointToRay(Input.mousePosition); Physics.Raycast(ray, out hit);
ViewportPointToRay 从视口点(0-1范围)发射射线。 Vector3 viewportPos(视口坐标) Ray(射线对象) 在视口中心发射射线: Ray ray = cam.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0));
渲染控制
Render 立即渲染相机的视图(通常用于手动控制渲染时机)。 void 生成自定义渲染纹理: cam.targetTexture = renderTexture; cam.Render();
RenderWithShader 使用指定Shader渲染相机视图(用于特殊效果,如遮罩或后处理)。 Shader shader(使用的Shader) string replacementTag(替换标签) void 生成深度图: cam.RenderWithShader(depthShader, "RenderType");
ResetAspect 重置相机的宽高比为屏幕的默认宽高比。 void 修复因手动修改aspect导致的变形: cam.ResetAspect();
ResetCullingMatrix 重置相机的剔除矩阵为默认值。 void 恢复相机的默认剔除计算。
视口与投影
CalculateFrustumCorners 计算视锥体在指定Z深度处的四个角点(用于自定义投影或特效)。 Vector3[] corners(存储角点的数组) float z(深度值) void 生成自定义投影网格: cam.CalculateFrustumCorners(rect, z, Camera.MonoOrStereoscopicEye.Mono, corners);
CalculateObliqueMatrix 生成一个倾斜的近裁剪平面矩阵(用于剪切水面等效果)。 Vector4 clipPlane(裁剪平面方程,如Ax + By + Cz + D = 0 Matrix4x4(投影矩阵) 实现水面反射: cam.projectionMatrix = cam.CalculateObliqueMatrix(clipPlane);
其他功能
CopyFrom 复制另一个相机的属性到当前相机。 Camera other(源相机) void 快速同步多个相机的设置: camera2.CopyFrom(camera1);
Reset 重置相机的所有属性为默认值。 void 调试时恢复初始状态。
ResetProjectionMatrix 重置相机的投影矩阵为默认值(基于当前参数)。 void 撤销手动修改的投影矩阵: cam.ResetProjectionMatrix();

好了 就这样 债见!

相关推荐
绵绵细雨中的乡音8 分钟前
Linux进程学习【进程地址】
linux·学习
阿月浑子202118 分钟前
[C#]Task.Run()和Task.Factory.StartNew()对比(腾讯元宝)
开发语言·c#
Eiceblue1 小时前
如何通过C# 获取Excel单元格的数据类型
开发语言·visualstudio·c#·excel
请你喝好果汁6411 小时前
TWAS / FUSION
学习
Li.Yc2 小时前
Linux 学习笔记2
linux·笔记·学习
大白的编程日记.2 小时前
【Linux学习笔记】系统文件IO之重定向原理分析
linux·笔记·学习
喜欢便码3 小时前
python线上学习进度报告
学习
蔗理苦3 小时前
2025-05-07 Unity 网络基础7——TCP异步通信
网络·tcp/ip·unity·异步通信
zhuziheniaoer4 小时前
rust-candle学习笔记12-实现因果注意力
笔记·学习·自然语言处理·rust