透视相机和正交相机

Unity支持两种摄像机 透视相机和正交相机
透视相机:符合一般视觉规律,即近大远小、近清晰远模糊。相机像一个点一样观察世界。
正交相机:显示的对象不随距离变远而缩小的摄像机称为正交摄像机

获取camera

  • 使用Camera.main;
  • 使用名称获取Camera
    Camera mainCamera;//使用public字段,在Unity Editor里面绑定
    GameObject gameObject=GameObject.Find("Main Camera");
    mainCamera=gameObject.GetComponent<Camera>();
    
  • 使用ObjectType获取Camera(推荐)
    Camera mainCamera = FindObjectOfType<Camera>();
    

相机的关键参数

camera的位置和尺寸

  • camera.transform.posision//获取位置
  • camera.rect//视区的尺寸

相机的大小有两种设置方式,这两种方式其实是等价的。一种方式是设置相机到画布中心的距离,另一种方式是设置视区的高度。

  • 视区:viewport,表示相机能够看到的最远的那个面,一个四面椎体内的东西都是可见的。如果是2d应用,则视区是一个平面矩形。
  • aspect:宽高比,宽度除以高度。宽高比是系统参数,程序无法改变这个参数。
  • orthographicSize:视区的高度。程序可以改变这个参数。

屏幕的大小:

  • Screen.width
  • Screen.height

设置完orthographicSize之后,视区是一个坐标系。水平方向为x轴,竖直方向为y轴。x的范围是[-width,width],其中width=orthographicSize*aspect

画布字太小

更改画布的Canvas Scaler:设置为Scale With Screen Size。随着屏幕大小缩放画布。

Unity提供了几种光源,分别是什么

答: 四种。
平行光:Directional Light
点光源:Point Light
聚光灯:Spot Light
区域光源:Area Light

使用RayCast找到游戏对象

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit2D hit = Physics2D.Raycast (ray.origin, ray.direction, Mathf.Infinity);
if (hit.collider !=null) {
    Debug.Log (hit.collider.gameObject.name);

坐标转换

Camera下面有8个与点和坐标转换相关的函数:

  • Vector3 WorldToScreenPoint(Vector3 position)
  • Vector3 WorldToViewportPoint(Vector3 position)
  • Vector3 ViewportToWorldPoint(Vector3 position)
  • Vector3 ViewportToScreenPoint(Vector3 position)
  • Vector3 ScreenToWorldPoint(Vector3 position)
  • Vector3 ScreenToViewportPoint(Vector3 position)
  • Ray ViewportPointToRay(Vector3 pos)
  • Ray ScreenPointToRay(Vector3 pos, Camera.MonoOrStereoscopicEye eye)

其中涉及四个概念:

  • ScreenPoint:是一个二维点,表示屏幕上的坐标
  • ViewportPoint:是一个二维点,与摄像机的ViewportRect有关,是一个相对于摄像机的坐标系
  • WorldPoint:一个二维点,与摄像机有关。
  • Ray:一束光线

ViewportPoint是一个以左下角为原点的一个矩形,ViewportPoint的x和y的坐标取值都是0到1之间。
WorldPoint是一个以中心为原点的坐标系,在2d中,z的取值为相机的z坐标,xy为相机的视区坐标。

ClearFlags:重绘标志

什么叫重绘标志?相机所看到的是画布,画布每帧重绘的时候需要执行Clear()清空上一帧的东西。
ClearFlags表示重绘之前应该如何处理画布。

  • Skybox:天空盒,每帧重绘的时候,首先把天空盒画上去。
  • SolidColor:纯色,每帧重绘的时候,使用纯色绘制。
  • DepthOnly:仅深度
  • Don't Clear:不清除,表示每帧绘制的时候不执行Canvas.Clear()操作。如果有一个旋转的物体,则会看到这个物体的重影。

Culling Mask:

Culling:宰杀,部分捕杀
Culling Mask:选择性让相机渲染哪些Layer的物体

Layer:层级

Unity的场景是由GameObject组成的,每个GameObject可以指定Layer。其中前七个Layer是Unity内置的。

  • nothing:什么都没有,这个层空空如也
  • everything:什么都有,这个层包括全部的GameObject
  • default
  • transparent FX
  • ignore raycast
  • water
  • UI

一个相机的CullingMask是一个int数字,所以Unity最多支持32个层。

1.用于只渲染某一层
_camera.cullingMask = 1<<8; //cube 只渲染第八层
_camera.cullingMask = 1<<9; //sphere 只渲染第九层
_camera.cullingMask = 1<<10; //capsule 只渲染第十层
只渲染第8、9、10层
_camera.cullingMask = (1 << 10) + (1<<9) +(1<<8);

2.渲染所有层
_camera.cullingMask = -1; //对应 everything

3.任何层都不渲染
_camera.cullingMask = 0; //对应 nothing

4.在原来基础添加某一层
_camera.cullingMask |= (1 << 10); //在原来的基础上增加第10层

5.在原来基础减去某一层
_camera.cullingMask &= ~(1 << 10); //在原来的基础上减掉第10层
6.渲染除了某一层外的所有层
_camera.cullingMask = ~(1 << 10); //渲染除第10层之外的其他所有层
**

场景设置天空盒

在Window/Render/Lightning打开窗口,设置Scene/Environment,选择SkyboxMaterial。
创建Material,设置Shader为Skybox下面的6面体模式,使用6张图片作为背景图。