相信每一个接触过Unity的人,应该都认识Unity引擎自带的那个水管工,也一定知道那个小人模型上挂着3个脚本控制着小人的一切,今天我就来说一下关于Unity背后视角摄像机的实现,当然方法并不唯一,这只是笔者自己学习中总结的一些方法和经验而已。
    我们先拖一个第三视角的小人到屏幕上,如果没有就先导入包吧。把小人重名为Person,并删除它本身自带的三个脚本。我们将自己动手来写脚本控制摄像机。其实背后视角摄像机的原理很简单,只须一直保持着摄像机位于角色的背后,并且保持一定的距离和角度即可。下面我们就来动手写一下。

首先新建一个脚本命名为CameraController(名字和语言随意,这里我使用C#),新建一个private Camera camera = null来保存对场景中主摄像机的引用,并在Start()方法中初始化它 camera = Camera.mainCamera; 现在我们有了对主摄像机的引用就可以操控它了:
      第一步,先把摄像机拉倒角色的位置
           camera.transform.position = gameObject.transform.position;
      因为我们的脚本将挂在角色模型上,所以直接用gameObject就可以获得角色引用。
 
      第二步,将摄像机转向角色所面向的方向,并将镜头向下偏转一定角度
      这里我们要用到Quaternion.LookRotation方法来设置物体的旋转角度。传说中的四元数,你可以把这个LookRotation方法理解成是对坐标系的一种旋转,他一共有两个参数都是Vector3类型的,其中第一个参数是用来指名旋转后Z轴正向所指的方向,而第二个参数则是当z轴指定之后Y轴被旋转到的方向,默认是Vector3.up也就是向上,这里要注意,第二个参数其实只能是一个参考作用,因为Unity中只有笛卡尔坐标系,也就是坐标轴之间必然相互垂直,如果你给定的两个参数互相不垂直,那么我们要将y轴沿与z轴平行和垂直分解,并去与z轴垂直的方向作为y轴正方向。另外说明在一般情况下这两个参数都是对世界坐标而言。
      我们先通过Vector3 personForward = gameObject.transform.TransformDirection(Vector3.forward);来获得角色的正前方在世界坐标上的方向向量。这样通过Quaternion.LookRotation(personForward)就可以获得将摄像机旋转到角色正前方向方位的相应四元数了。
      先别急,我们还要将相机的角度再向下偏移些,这样效果更好,我们同样可以通过Quaternion.LookRotation来达到这个效果,上面我说过一般时候LookRotation的两个参数都是世界坐标的,但是当我们紧接着将另一个Quaternion.LookRotation乘在后面的话,那后一个LookRotation的两个参数的坐标是在前一个LookRotation旋转完毕后所新城的新坐标系中来说的。这点要注意,所以我们可以构造一个斜向下的方向向量Vector3 v1 = Vector3.forward + Vector3.down.这里我们就取45度了,如果想构造其他角度只要在两个单位向量前乘以相应的系数就可以了。
     下面我们完成的把这个过程写下来:
     Vector3 personForward = gameObject.transform.TransformDirection(Vector3.forward);
     Vector3 v1 = Vector3.forward + Vector3.down;
     camera.transform.rotation = Quaternion.LookRotation(personForward) * Quaternion.LookRotation(v1);
     这样子我们就达到了上面的要求,如果你不理解的话,也不要在意,可能是我讲解的不太好,我更想说的是这个Quaternion的应用真不是一两个例子就能说明的,你应该好好的研究,自己动手试试才能感觉出来,只看API是没有什么用的。
 
     第三步:将相机向后移动并且向上移动一段距离,因为之前我们的相机一直是和角色位置重合的这样子是不行的
     我们先通过camera.transform.Translate(Vector3.back*2);来将相机向后移动一些,移动多远自己看着来,我们再将摄像机向上移动一些这时候注意了,Translate函数默认是以物体的自身坐标系为基准来移动的,因为我们的相机现在是斜向下的所以他的正上方并不是世界坐标的正上方,不过我们然人可以使用Translate函数,只是这次再用的时候就要将他的第二个参数Space.World写上了,即camera.transform.Translate(Vector3.up,Space.World);
 
     还要记住将上面3步的内容要写到脚本的Update函数中,每帧我们都要调整摄像机的位置,这样才能保证一直跟在玩家后面。

下面是完成的脚本代码:

using UnityEngine;
using System.Collections; public class CameraController : MonoBehaviour { private Camera camera = null;
// Use this for initialization
void Start () {
camera = Camera.mainCamera;
} // Update is called once per frame
void Update () {
camera.transform.position = gameObject.transform.position;
Vector3 personForward = gameObject.transform.TransformDirection(Vector3.forward);
Vector3 v1 = Vector3.forward + Vector3.down;
camera.transform.rotation = Quaternion.LookRotation(personForward) * Quaternion.LookRotation(v1);
camera.transform.Translate(Vector3.back * 2);
camera.transform.Translate(Vector3.up,Space.World); } }

到此,一个最基本的背后视角摄像机完成了,当然我们还没有让角色动起来也就没法观看移动中摄像机跟踪角色的效果了,不过角色移动对于大家来说应该不难,我会在后面的系列文章中继续讲解Unity的一些知识。
 
 ps:第一次写Unity相关的文章,本人也接触Unity不就,了解尚浅,难免有误,还望见谅,多多批评指正,以后我会总结更多Unity相关的知识和大家讨论。

Unity小厨房之-----背后视角摄像机的更多相关文章

  1. 自制Unity小游戏TankHero-2D(4)关卡+小地图图标+碰撞条件分析

    自制Unity小游戏TankHero-2D(4)关卡+小地图图标+碰撞条件分析 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm ...

  2. 自制Unity小游戏TankHero-2D(3)开始玩起来

    自制Unity小游戏TankHero-2D(3)开始玩起来 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的.仅 ...

  3. 自制Unity小游戏TankHero-2D(1)制作主角坦克

    自制Unity小游戏TankHero-2D(1)制作主角坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...

  4. 自制Unity小游戏TankHero-2D(5)声音+爆炸+场景切换+武器弹药

    自制Unity小游戏TankHero-2D(5)声音+爆炸+场景切换+武器弹药 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm ...

  5. 自制Unity小游戏TankHero-2D(2)制作敌方坦克

    自制Unity小游戏TankHero-2D(2)制作敌方坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...

  6. Unity小知识---第三人称中设置摄像机的简单跟随

    第三人称中设置摄像机的简单跟随 private Transform player; private Vector3 offect; private float smooothing = 3f; //插 ...

  7. unity中鼠标左键控制摄像机视角上下左右移动

    enum RotationAxes { MouseXAndY, MouseX, MouseY } RotationAxes axes = RotationAxes.MouseXAndY; //@Hid ...

  8. unity实现用鼠标右键控制摄像机视角上下左右移动

    using System;using System.Collections.Generic;using UnityEngine;public class ViewControl{ enum Rotat ...

  9. 喵的Unity游戏开发之路 - 轨道摄像机

    前言        很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3 ...

随机推荐

  1. Redis 利用锁机制来防止缓存过期产生的惊群现象-转载自 http://my.oschina.net/u/1156660/blog/360552

    首先,所谓的缓存过期引起的“惊群”现象是指,在大并发情况下,我们通常会用缓存来给数据库分压,但是会有这么一种情况发生,那就是在一定时间 内生成大量的缓存,然后当缓存到期之后又有大量的缓存失效,导致后端 ...

  2. [linux] linux下编译安装zlib

    zlib官方网站:http://www.zlib.net上下载源码来安装zlib软件包. 目前最新版本zlib是zlib1.2.8,安装开始:$wget http://www.zlib.net/zli ...

  3. EF LEFT JON 关联查找

    var query = (from a in context.OQC_INSPECTION_SAMPLE.Where(expression).Where(a => context.OQC_INS ...

  4. Windows蓝屏后产生的.dmp分析原因

    Windows系统电脑出现蓝屏后都会自动重启,重启后电脑屏幕会提示蓝屏的相关信息,此时如果你没有来得及查看,你也可以进入windows7的“事件查看器”(位置为:控制面板--系统和安全--管理工具-- ...

  5. oracle imp导入数据到另一个表空间

    http://blog.163.com/darlingchenlin@126/blog/static/7156283420100531431855/ 1.在第一个数据库导出数据:qlyg_xs_db_ ...

  6. 详解 “Android UI”设计官方教程

    我们曾经给大家一个<MeeGo移动终端设备开发UI设计基础教程>,同时很多朋友都在寻找Android UI开发的教程,我们从Android的官方开发者博客找了一份幻灯片,介绍了一些Andr ...

  7. Redis作者谈Redis应用场景(转)

    毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象 ...

  8. 1. redis简介

    一. redis简介 Redis是一种面向"键/值"对数据类型的内存数据库,可以满足我们对海量数据的读写需求. redis的键只能是字符串,redis的值支持多种数据类型: (1) ...

  9. iphone dev 入门实例1:Use Storyboards to Build Table View

    http://www.appcoda.com/use-storyboards-to-build-navigation-controller-and-table-view/ Creating Navig ...

  10. VS 开发工具中的Remote Debug 功能远程调试程序经验分享

    前言: 有时候我们Dev(开发人员)需要debug tester(测试人员)或者customer(客户)的环境,可tester的机器上没有Code,是不是有点着急? 而且是多版本应用且tester 发 ...