作为一个游戏的必要元素,摄像机、光源、场景有着不可磨灭的作用。下面这几期聊一聊我的看法。
摄像机
玩家要体验制作好的游戏,首先要看到画面,摄像机就是这样的作用。在我看来,游戏和电影没什么区别,自然,摄像机把游戏世界呈现给了我们。比如我们要做第一人称游戏,那么摄像机就可以放在人物的头部,如果要做第三人称,那么就放在人物后面。。。。。诸如此类。再者我们平时玩游戏出现的小地图,其实也可以通过一个摄像机俯视游戏世界,获取玩家位置做标记来完成。下面通过实际操作来认识摄像机。
首先我们在new一个project,可以发现有一个主摄像机,观察它的Inspector
我们再create一个Empty对象,给这个对象添加组件Camera
可以看到
这个空对象也成为了摄像机,可以看出摄像机其实是一个组件。
至于如何在视图中看到物体,简单来说,只要把物体放在摄像头前就行。如何确定方位呢,很多人都会说,在这样一个3D世界,玩游戏都容易迷路,更何况游戏制作的时候呢,其实很简单,unity3d采取的是左手法则确定方位,我们可以在Scene的右上角看到一个世界坐标系
可以发现,摄像机也有Transform,还有一系列属性,可以看出,摄像机其实也是一个GameObject。下面介绍它的主要属性
属性参考链接:http://www.manew.com/thread-47076-1-1.html
1.Clear Flags:清楚标记
- Skybox: 屏幕中的空白部分用天空盒的内容填充,如果没有设置天空盒,则使用背景颜色。
- Solid Color: 屏幕中的空白部分用背景颜色填充。
- Depth only: 仅按照物体的前后遮挡关系来呈现结果。
- Don’t Clear: 不清除任何颜色或深度缓存。结果是:每帧的呈现结果都叠加在一起。通常用于实现特殊的效果。
为了高度仿真,游戏可以加入天空元素,即天空盒,它是一个球体素材,需要在store中下载,然后将下载的资源import到porject中,在摄像机添加组件skybox,把资源拖入skybox中即可
2.Culling Mask
剔除遮罩。用于指定摄像机所作用的层(Layer)。
3.Field of View(FOV)
视野范围。只针对透视镜头,用于控制视角宽度与纵向角度。同上图此时FOV值为60,我们拖到10
可以这样理解,FOV值就是对镜头的缩放
4.Size
视口大小。只针对正交镜头,设定为相当于屏幕高度的一半。
5.Projection
分为透视(Perspective)和正交(Orthographic)
正交就是正交投影,三视图的关系,看到的物体是平面的,透视可以体现出物体间的远近,更能体现位置关系。两种投影都有不同的用处
我们再创建一个小球
透视图是这样的
可以感受到远近,而正交图
感觉像2D游戏。。。。。。
6.ClippingPlanes
表示摄像机的作用范围。只显示距离为[Near, Far]之间的物体。在此之外的无法看见
7.Viewport Rect
控制摄像机呈现结果对应到屏幕上的位置以及大小。屏幕坐标系:左下角是(0, 0),右上角是(1, 1)。绘制出来的都是矩形视图,通常可以用来作为副视图
8.Depth
当多个摄像机同时存在时,这个参数决定了呈现的先后顺序,值越大越靠后呈现。前面的会被后面呈现的覆盖
这两个属性我们用鸟瞰图来解释
将之前用空项目创建的摄像头放在两个物体上方,Rotation设为垂直向下
播放一次
为什么成这样了?我的天空呢,我的蓝色呢,其实就是Depth,我的main camera的Depth为-1,所以被覆盖了,修改后(比副摄像头大)可以看到天空又回来了,那么副摄像头呢?
先变回原样,副摄像头的Depth更大
将副摄像头的Viewport Rect设为(0.8, 0.8)(0.8,0.8)
鸟瞰图就出来了
Summary
Camera作为一个部件十分复杂,它的继承类树是这样的
只列出了部分变量和函数,详情可参考http://www.ceeger.com/Script/Camera/Camera.html
可以看出,Camera许多属性和方法其实都是来源于继承
而Object作为所有游戏元素的基类,自然也是Camera的基类。
Camera有很多静态属性
根据官网可查到,Camera的静态变量有以下:
* allCameras 返回所有可以使用的camera
* allCamerasCount 翻译场景中所有照相机的数量
* current 当前用于渲染的相机,只用于低级的渲染控制
* main 第一个被启用的Camera会被标记为main
* onPostRender 任何一个camera结束rendering都会触发的时间
* onPreCull 任何一个camera开始culling的时候触发的事件
* onPrerRender 任何一个camera在开始rendering之前都会触发的事件
我们可以通过程序来控制camera,首先重建一个project,创建三个摄像机,一个立方体和一个空对象用于挂载
在这里一个摄像头放得远,一个摄像头没有正对立方体,还有一个摄像头是鸟瞰
编写脚本CamerasControl
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamerasControl : MonoBehaviour {
private Camera MainCamera;
private Camera CurrentCamera;
private Camera[] Cameras;
// Use this for initialization
void Start () {
MainCamera = Camera.main;//获取主摄像机
Cameras = Camera.allCameras;//获取所有摄像机
CurrentCamera = Camera.current;//获取当前摄像机
}
// Update is called once per frame
void Update () {
ChangeCamera();
}
void ChangeCamera()
{
// 点击1,2,3切换canmera,注意3个camera必须在同一个display下
if (Input.GetKeyUp(KeyCode.Alpha1))
{
Cameras[0].enabled = true;
Cameras[1].enabled = false;
Cameras[2].enabled = false;
}
else if (Input.GetKeyUp(KeyCode.Alpha2))
{
Cameras[0].enabled = false;
Cameras[1].enabled = true;
Cameras[2].enabled = false;
}
else if (Input.GetKeyUp(KeyCode.Alpha3))
{
Cameras[0].enabled = false;
Cameras[1].enabled = false;
Cameras[2].enabled = true;
}
else if (Input.GetKeyUp(KeyCode.M))
{
//点击M后,所有camera设为false,除了主摄像机以外
Cameras[0].enabled = false;
Cameras[1].enabled = false;
Cameras[2].enabled = false;
MainCamera.enabled = true;
}
}
}
挂载到空对象,Run游戏
在键盘上按1是这样的
按2
按3
再来讲下如何用左手坐标系确定视图首先放置一个摄像头和立方体
其中摄像头散发出来的射线就是可视范围,我们点击世界坐标系的y
变成了这样,而y轴去哪了呢?可以这样简单理解,y轴的箭头方向从当前视角直戳我们的眼睛,此时修改摄像机Rotation的y值,就会绕y轴旋转,旋转正方向就是左手大拇指朝y轴正方向,手指弯曲方向为正方向,比如,修改y值为90,变成这样
摄像机还有很多好玩的属性,以后我会慢慢学习记录