1.获取相机对象
2.核心属性和设置
3.坐标转换
4.射线检测
5.高级功能
1.获取相机对象
public Camera myCamera;
Camera myCamera = Camera.main;
Camera myCamera = GameObject.Find("Camera Name").GetComponent<Camera>();
Camera myCamera = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>();
Camera myCamera = GetComponent<Camera>();
Camera myCamera = GetComponentInParent<Camera>();
2.核心属性和设置
1).视野(Field of View)
a.透视摄像机的视野角度(Unity中默认是指"整个垂直方向的张口角度")
myCamera.fieldOfView = 60f;
b.设置为正交摄像机(2D游戏常用)
myCamera.orthographic = true;
c.正交摄像机的大小
myCamera.orthographicSize = 5f; 该值定义了从相机中心到屏幕顶部(或底部)的世界单位距离
Unity中的单位是一个相对度量标准, 没有固定的物理尺寸
a.精灵Sprite
- 当你在Photoshop等软件中制作图片时, 图片有像素尺寸(比如 128x128 像素)
- 导入Unity时, 在Import Settings中有个Pixels Per Unit(PPU)设置
- PPU = 100 表示图片中的100个像素 = Unity世界中的1个单位
- 所以如果你的角色图片高200像素, PPU = 100, 那么角色在Unity中就是2个单位高

b.3D模型或原始物体
- 在3D软件中创建的模型有自己的尺度
- Unity 默认倾向于1个单位 = 1米(特别是使用物理系统时)
- 比如: 一个Cube的默认尺寸是 1x1x1
2).裁剪平面 (Clipping Planes)
a.近裁剪面, 比这个近的物体不渲染
myCamera.nearClipPlane = 0.3f;
b.远裁剪面, 比这个远的物体不渲染
myCamera.farClipPlane = 1000f;
3).视口矩形(Viewport Rect), 参数为(左下角x, 左下角y, 宽度, 高度), 范围0 - 1
a.左半屏
myCamera.rect = new Rect(0, 0, 0.5f, 1f);
b.右上角小窗口
myCamera.rect = new Rect(0.5f, 0, 0.5f, 0.5f);
4).清除标志(clearFlags)
a.clearFlags
决定了相机在每次渲染之前如何清除屏幕上的内容
b.Skybox
使用天空盒来清除屏幕, 这是默认值; 如果摄像机没有设置天空盒, 则会退回到使用Solid Color
c.Solid Color
使用纯色(由backgroundColor指定)来清除屏幕
d.Depth Only
只清除深度缓冲区(Depth Buffer), 这通常用于多个摄像机渲染同一场景时, 比如UI摄像机叠加在主要场景摄像机之上这样
UI摄像机只清除深度, 从而确保UI绘制在之前渲染的场景之上
e.Don't Clear
不清除任何颜色或深度缓冲区, 这样每一帧都会在上一帧的基础上绘制. 可能导致画面重叠和混乱, 一般用于特殊效果
5).背景颜色(blackgroundColor)
当clearFlags设置为Solid Color时, 摄像机将使用这个颜色来清除屏幕; 如果clearFlags是其他模式, 那么这个颜色可能
不会被使用(除非天空盒模式但没有设置天空盒, 则会回退到使用这个颜色)
使用UI相机时, 希望UI显示在屏幕的最上层, 而不清除颜色缓冲是因为我们希望保留之前相机渲染的场景画面; 只清除深度
缓冲: 确保UI相机渲染的元素不会因为深度测试而被场景中的物体遮挡
6).
3.坐标转换
Camera的函数可以用在世界坐标, 屏幕坐标和视口坐标之间进行转换
void Update() {
Vector3 worldPos = transform.position;
Vector3 screenPos = myCamera.WorldToScreenPoint(worldPos);
Vector3 mouseScreenPos = Input.mousePosition;
mouseScreenPos.z = 10f;
Vector3 worldPoint = myCamera.ScreenToWorldPoint(mouseScreenPos);
Vector3 viewportPoint = myCamera.ScreenToViewportPoint(Input.mousePosition);
if(viewportPoint.x > 0 && viewportPoint.x < 1 && viewportPoint.y > 0 && viewportPoint.y < 1) {
}
Vector3 worldToViewport = myCamera.WorldToViewportPoint(someWorldPosition);
}
4.射线检测
void Update() {
if (Input.GetMouseButtonDown(0)) {
Ray ray = myCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit)) {
Debug.Log("点击到了: " + hit.transform.name);
Debug.Log("点击位置: " + hit.point);
}
RaycastHit2D hit2D = Physics2D.Raycast(ray.origin, ray.direction);
if (hit2D.collider != null) {
Debug.Log("点击到了2D物体: " + hit2D.collider.name);
}
}
}
5.高级功能
myCamera.Render();
myCamera.RenderWithShader(shader, "Tag");
myCamera.depth = 1;
myCamera.targetTexture = renderTexture;