摄像机 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数学/坐标系
  • 总结/坐标系转化
  • 总结/插值与平滑