摄像机 Camera
建议阅读本节前,先阅读总结中的坐标系转化。
属性
- 透视模式时越远的物体显示的越小。
- 正焦模式时摄像机拍摄到的物体不会因为远近而发生显示大小变化。
- 视野范围有Nare和Far两个值。距离超过Far的物体不会显示在摄像机中,这样可以节省性能。距离小于Nare的也不会显示在摄像机中,这样就避免了摄像机被遮挡。
- 用
Culling Mask
可以选择摄像机能拍摄到的层,这样就能过滤一部分游戏对象。
摄像机的运用
- 摄像机跟随
摄像机跟随可以直接把摄像机做为子物体就可以了。如果要灵活的控制摄像机,也可以用代码来实现。
using UnityEngine;
using System.Collections;
public class FollowCamera : MonoBehaviour {
// 在其他对象修改完数据后,再去调整摄像机,所以用LateUpdate。
void LateUpdate () {
// 计算当前物体身后5米,上方2米位置的坐标。
Vector3 pos = transform.TransformPoint(new Vector3 (0, 2, -5));
// 将摄像机移到这个位置
Camera.main.transform.position = pos;
// 朝向目标
Camera.main.transform.LookAt (transform);
}
}
- 摄像机平滑跟随
using UnityEngine;
using System.Collections;
public class FollowCamera : MonoBehaviour {
// 在其他对象修改完数据后,再去调整摄像机,所以用LateUpdate。
void LateUpdate () {
// 计算当前物体身后5米,上方2米位置的坐标。
Vector3 pos = transform.TransformPoint(new Vector3 (0, 2, -5));
// 将摄像机平滑移到这个位置
Camera.main.transform.position = Vector3.Lerp (Camera.main.transform.position, pos, Time.deltaTime * 2f);
// 朝向目标
Camera.main.transform.LookAt (transform);
}
}
- 视角切换
实现思路:用两个摄像机拍摄,一个有效,一个无效。
using UnityEngine;
using System.Collections;
public class PSController : MonoBehaviour {
// 第一人称摄像机和第三人称摄像机
public GameObject fps, tps;
void Start () {
// 设置初始状态为第一人称摄像机
fps.SetActive (true);
tps.SetActive (false);
}
void Update () {
if (Input.GetKeyDown (KeyCode.Alpha1)) {
// 切换摄像机
fps.SetActive (!fps.activeSelf);
tps.SetActive (!tps.activeSelf);
}
}
}
- 交错运动,远景移动效果。
实现思路:2D游戏中为了给玩家一种空间立体感,可以使远景和近景以不同速度动画。
using UnityEngine;
using System.Collections;
public class Background : MonoBehaviour {
// 所以背景的父物体,背景按远近层次顺序放到里面。
private Transform background;
// 记录上次主角位置
private float lastX;
void Start () {
background = GameObject.Find ("Background").transform;
lastX = transform.position.x;
}
void LateUpdate() {
// 计算这一帧中主角移动的偏移量
float delta = transform.position.x - lastX;
// 同步移动每一层背景
for (int i = 0; i < background.childCount; i++) {
var item = background.GetChild(i);
// 每一层背景的速率不一样
item.Translate (-delta*0.05f * i, 0, 0);
}
// 记录这一帧主角的位置
lastX = transform.position.x;
}
}
- 画中画,小地图。
实现思路:用两个摄像机拍摄,得到两个画面。用Depth
属性让小地图的显示在上层。再通过Viewport Rect
设置小地图的位置和大小,小地图变小后下一层的画面就会显示出来。
- 场景动态切换
实现思路:一个摄像机拍游戏角色,另一个摄像机拍场景。用Depth
属性将前景与场景放在上下两个层。Clear Flag
设为depth only
将两个层的画面都显示出来。将多个场景平行铺开。当切换场景时只需要将场景摄像机的y坐标下移就可以了。
- 沿特定路线拍摄
实现思路:和塔防项目中怪物沿着一条路点移动的实现方式一样,摄像机沿着特定的路线拍摄,可以给玩家一种电影中的感觉。
- 震动特效
实现思路:通过修改摄像机的移动、旋转等属性可以模拟出震动的效果,这个过程中要频繁修改数据,可以打开Animation窗口,录制一个动画来实现。
相关参考
- 3D数学/坐标系
- 总结/坐标系转化
- 总结/插值与平滑