Unity基础学习(十)Camera组件_unity camera
目录
一、认识Camera面板
1、Clear Flags 如何清除背景
2、Culling Mask 剔除遮罩 选择性渲染部分层级 可以指定只渲染对应层级的对象。就是说可以只渲染你想要渲染的部分,按层级确定。也就是前面提到的Layer的作用
3、Project 投影类型
3-1Perspective:3D透视投影(FOV生效)
3-2Orthographic:2D正交投影(Size参数生效)
4、Clipping Planes 裁剪平面
5、Viewport Rect视口范围 屏幕上将绘制该摄像机视图的位置 主要用于双摄像机游戏 0~1 相当于宽高百分比
6、Depth 渲染顺序上的深度 刚才上面提到的
7、Redering path 渲染路径
8、Target Texture 渲染纹理 可以把摄像机画面渲染到一张图 主要用于制作小地图 在Project右键创建 Render Texture
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、重要静态成员
//1.获取摄像机//如果用之前的知识来获取摄像机,需要先获取摄像机所在的物体,然后获取摄像机组件//主摄像机的获取//如果通过下面这种方式快速获取,那么场景上必须得有一个tag为MainCamera的物体,否则会返回nullprint(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.出来使用的
//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);
补充一个发射射线的方法:这个射线我们后面会详细讲解
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().material.color = Color.yellow; } } }}
上面的都是主要内容,下面的了解,即可。
Camera.main
MainCamera
的摄像机实例(若不存在则返回null
)。Camera.allCameras
Camera[]
)。Camera.allCamerasCount
Camera.current
Camera.onPreCull
Camera.onPreRender
Camera.onPostRender
ScreenToWorldPoint
Vector3 screenPos
(屏幕坐标,Z为距相机的深度)Vector3
(世界坐标)Vector3 worldPos = cam.ScreenToWorldPoint(Input.mousePosition);
WorldToScreenPoint
Vector3 worldPos
(世界坐标)Vector3
(屏幕坐标)Vector3 screenPos = cam.WorldToScreenPoint(objectTransform.position);
ViewportToWorldPoint
Vector3 viewportPos
(视口坐标,Z为距相机的深度)Vector3
(世界坐标)Vector3 center = cam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 10));
WorldToViewportPoint
Vector3 worldPos
(世界坐标)Vector3
(视口坐标)if (cam.WorldToViewportPoint(pos).z > 0 && pos.x is between 0-1)
ScreenToViewportPoint
Vector3 screenPos
(屏幕坐标)Vector3
(视口坐标)Vector3 viewportPos = cam.ScreenToViewportPoint(Input.mousePosition);
ScreenPointToRay
Vector3 screenPos
(屏幕坐标)Ray
(射线对象)Ray ray = cam.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray, out hit);
ViewportPointToRay
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)string replacementTag
(替换标签)void
cam.RenderWithShader(depthShader, \"RenderType\");
ResetAspect
void
aspect
导致的变形:cam.ResetAspect();
ResetCullingMatrix
void
CalculateFrustumCorners
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();
好了 就这样 债见!