根据游戏类型的不一样,会需要各种各样的摄像机,下面将分享三种典型的摄像机类型:(1)地下城摄像机;(2)第三人称跟随摄像机;(3)鼠标控制旋转摄像机。将这些控制脚本拖动到场景的MainCamera上即可。

  为了辅助测试,使用了下面的角色移动/旋转控制脚本:

using UnityEngine;
using System.Collections; public class Player : MonoBehaviour
{
public float movementSpeed = ;
public float turningSpeed = ; void Update()
{
float horizontal = Input.GetAxis("Horizontal") * turningSpeed * Time.deltaTime;
transform.Rotate(, horizontal, ); float vertical = Input.GetAxis("Vertical") * movementSpeed * Time.deltaTime;
transform.Translate(, , vertical);
} }

  看向固定目标的Camera的基本实现,主要使用transform.LookAt函数来实现:

public class LookAtCamera : MonoBehaviour
{
public GameObject target = null; void LateUpdate()
{
if (target == null)
return; transform.LookAt(target.transform);
}
}

  (1)地下城摄像机,就像暗黑3那样的,摄像机和角色保持固定距离和角度,摄像机不会绕着角色旋转:

public class DungeonCamera : MonoBehaviour
{
public GameObject target = null;
public Vector3 offset = Vector3.zero;
public float damping = ; void Start()
{
if (target == null)
return;
offset = transform.position - target.transform.position;
} void LateUpdate()
{
if (target == null)
return; Vector3 desiredPosition = target.transform.position + offset;
// 平滑变换过程,即不要立即变换
Vector3 position = Vector3.Lerp(transform.position, desiredPosition, Time.deltaTime * damping);
transform.position = position; // Camera始终看向目标
transform.LookAt(target.transform.position);
}
}

  (2)第三人称跟随摄像机,比较典型的3D游戏摄像机,摄像机会绕着角色一起旋转:

public class FollowCamera : MonoBehaviour
{
public GameObject target = null;
public Vector3 offset = Vector3.zero;
public float damping = ; void Start()
{
if (target == null)
return;
offset = transform.position - target.transform.position;
} void LateUpdate()
{
float currentAngle = transform.eulerAngles.y;
float desireAngle = target.transform.eulerAngles.y;
// 平滑角度变换
float angle = Mathf.LerpAngle(currentAngle, desireAngle, Time.deltaTime * damping);
Quaternion rotation = Quaternion.Euler(, angle, ); transform.position = target.transform.position + (rotation * offset); transform.LookAt(target.transform);
}
}

  (3)鼠标控制角色旋转摄像机,注意,鼠标控制旋转时不要做Lerp,因为鼠标控制需要精确,比如玩CS的时候,鼠标控制角色转动还要过程那还能玩吗 

public class MouseAimCamera : MonoBehaviour
{
public GameObject target = null;
public Vector3 offset = Vector3.zero;
public float rotateSpeed = ; void Start()
{
offset = target.transform.position - transform.position;
} void LateUpdate()
{
// 根据鼠标左键旋转目标物体
float horizontal = Input.GetAxis("Mouse X") * rotateSpeed;
target.transform.Rotate(, horizontal, ); float desiredAngle = target.transform.eulerAngles.y;
Quaternion rotation = Quaternion.Euler(, desiredAngle, );
transform.position = target.transform.position - (rotation * offset); transform.LookAt(target.transform); }
}

参考:http://code.tutsplus.com/tutorials/unity3d-third-person-cameras--mobile-11230

各种Camera,总有一款适合你(一)的更多相关文章

  1. 各种Camera,总有一款适合你(二)

    在实际的项目开发中,一般需要程序抽象出一些在几何意义上有明确意义的参数,这样方便策划或美术在自己的机器上进行调试. 下面是一个可变参的地下城摄像机的简单实现: // 第三人称摄像机,平移和旋转会同时进 ...

  2. 10款流行的Markdown编辑器,总有一款适合你

    摘要:作为一个开源人,如果你不会使用Markdown语法,那你就OUT了!Markdown 是 2004 年由 John Gruberis 设计和开发的纯文本格式的语法,非常的简单实用. 作为一个开源 ...

  3. .NET5都来了,你还不知道怎么部署到linux?最全部署方案,总有一款适合你

    随着2020进入4季度,.NET5正式版也已经与大家见面了.不过,尽管 .NET Core发布已经有四五年的时间,但到目前为止,依旧有很多.NET开发者在坚守者.NET4,原因不尽相同,但最大的问题可 ...

  4. 这么多TiDB负载均衡方案总有一款适合你

    [是否原创]是 [首发渠道]TiDB 社区 前言 分布式关系型数据库TiDB是一种计算和存储分离的架构,每一层都可以独立地进行水平扩展,这样就可以做到有的放矢,对症下药. 从TiDB整体架构图可以看到 ...

  5. [Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!

    引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询. 方案一 直接在浏览器中打开Office文档在页面上的链接.会弹出如下窗口: 优点:主流浏览器都支持. 缺点: ...

  6. 四大VDI客户端 总有一款适合你

    [TechTarget中国原创] 交付虚拟桌面时IT管理员必须要考虑到用户如何访问虚拟桌面,因为这会影响用户体验以及VDI部署最终的成败. IT可以转向简便的HTML5客户端,HTML 5客户端功能丰 ...

  7. 把 Console 部署成 Windows 服务,四种方式总有一款适合你!

    一:背景 1. 讲故事 上周有一个项目交付,因为是医院级项目需要在客户的局域网独立部署. 程序: netcore 2.0,操作系统: windows server 2012,坑爹的事情就来了, net ...

  8. [Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

    引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...

  9. 40个容易上瘾的HTML5网页游戏,总有一款适合你

    我记得姐姐家的孩子在刚刚才学会走路,说话还不能完整的时候就已经能自己用小手点出小游戏的网站来一个人自娱自乐.我一直在想这一代跟着计算机一起茁壮成长的孩子会不会也和美国那一代人一样,出现9岁的黑客和计算 ...

随机推荐

  1. Asset Catalog Help (二)---Creating an Asset Catalog

    Creating an Asset Catalog Create an asset catalog to simplify management of your app’s images. 创建一个a ...

  2. iOS开发----三目运算符

    一.三目运算符 1.基本格式 : (关系表达式) ? 表达式1 : 表达式2;  执行流程 : 关系表达式为 真 返回表达式1 关系表达式为假 返回表达式2 2.写一个例子来看一下三目运算符的使用: ...

  3. javaweb学习总结(二十)——JavaBean总结

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  4. 使用 multiprocessing.dummy 执行多线程任务

    # -*- coding: utf-8 -*- # from multiprocessing import Pool 多进程 from multiprocessing.dummy import Poo ...

  5. js异步加载的三种解决方案

    默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很大的javascript,如果放在页 ...

  6. iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

    iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...

  7. GO語言視頻教程

    第1课:https://github.com/Unknwon/go-fundamental-programming/blob/master/lectures/lecture1.md Go开发环境搭建h ...

  8. SIFT 特征提取算法总结

    原文链接:http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html   主要步骤 1).尺度空间的生成: 2).检测尺度空间极 ...

  9. NGUI 减少drawcall规则

    前置说明一: Unity中的drawcall定义: 每次引擎准备数据并通知GPU的过程称为一次Draw Call. Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎 ...

  10. arcgis手动启动服务提示端口4000被使用

    具体解决办法 参考 http://hi.baidu.com/xjx19860908/item/6b46376d92044694c4d249f6该博文. 手动启动,提示4000端口被占用,去查找4000 ...