摘要:本文原创,转载请注明出处http://www.cnblogs.com/AdvancePikachu/p/6742796.html

需求:

在游戏的任务编辑场景进行编辑的时候,摄像机需要在多个需要编辑的物体之间来回切换,如果只是用摄像机的移动旋转,对于相对位置较近的物体还好说,当相对位置过远的时候,就需要有一个聚焦的功能,可以很方便的自动把相机聚焦到需要编辑物体的一个相对可设置的位置。

如图:

如果有聚焦功能,就可以很方便的让摄像机在 Cube和Sphere之间聚焦。

 public Transform _cube;
// Use this for initialization
void Start () {
_cube = GameObject.Find ("Cube").transform;
ViewSwitch.Instacne.GetRelativePosition (-, , );
} // Update is called once per frame
void Update () {
if(Input.GetKey(KeyCode.Space))
ViewSwitch.Instacne.GetData(this.transform,_cube);
}

一个简单的调用即可达到下图的效果:

废话不多说,上代码:

 //===== AdvancePikachu 2017 ========
//文件功能描述;相机聚焦
//创建表示;AdvancePikachu 2017/4/20
//======================================================== using UnityEngine;
using System.Collections; public class ViewSwitch : MonoBehaviour { private static ViewSwitch instance; public static ViewSwitch Instacne {
get {
if (instance == null) {
GameObject go = new GameObject ();
go.name = "ViewSwitch";
instance = go.AddComponent<ViewSwitch> ();
}
return instance;
}
} public float speed = 10f; int method;
bool isBreakSwitch = true;
Transform startTransform;
Transform targetTransform;
Vector3 endPosition;
Quaternion endQuaternion;
Vector3 relativeEulers = new Vector3 (, , );
Vector3 relativePositon = new Vector3 (-, , ); /// <summary>
/// Gets the start transform.
/// </summary>
/// <returns>The start transform.</returns>
/// <param name="start">Start.</param>
Transform GetStartTransform(Transform start){
startTransform = start;
return startTransform;
} /// <summary>
/// Gets the target transform.
/// </summary>
/// <returns>The target transform.</returns>
/// <param name="target">Target.</param>
Transform GetTargetTransform(Transform target){
targetTransform = target;
GetEndPosition ();
GetEndQuaternion ();
return targetTransform;
} /// <summary>
/// Gets the relative position.
/// </summary>
/// <returns>The relative position.</returns>
/// <param name="forword">Forword.</param>
/// <param name="up">Up.</param>
/// <param name="right">Right.</param>
public Vector3 GetRelativePosition(float forword = -50f,float up = 30f,float right = 0f){
relativePositon = new Vector3(forword,up,right);
return relativePositon;
} /// <summary>
/// Gets the relative eulers.
/// </summary>
/// <returns>The relative eulers.</returns>
/// <param name="eulerX">Euler x.</param>
/// <param name="eulerY">Euler y.</param>
/// <param name="eulerZ">Euler z.</param>
public Vector3 GetRelativeEulers(float eulerX=20f,float eulerY=,float eulerZ=){
relativeEulers = new Vector3 (eulerX, eulerY, eulerZ);
return relativeEulers;
} /// <summary>
/// Gets the end position.
/// </summary>
/// <returns>The end position.</returns>
Vector3 GetEndPosition(){
endPosition = targetTransform.position +
targetTransform.forward * relativePositon.x +
targetTransform.up * relativePositon.y +
targetTransform.right * relativePositon.z;
return endPosition;
} /// <summary>
/// Gets the end quaternion.
/// </summary>
/// <returns>The end quaternion.</returns>
Quaternion GetEndQuaternion(){
endQuaternion = Quaternion.Euler (targetTransform.eulerAngles + relativeEulers);
return endQuaternion;
} /// <summary>
/// Gets the data.
/// </summary>
/// <param name="start">Start.</param>
/// <param name="target">Target.</param>
/// <param name="i">The index.</param>
public void GetData(Transform start,Transform target,int i=){
if (target != null)
isBreakSwitch = false;
else {
isBreakSwitch = true;
return;
} GetStartTransform (start);
GetTargetTransform (target);
method = i;
if (i == )
ViewChangeImmediately ();
} /// <summary>
/// Views the change.
/// </summary>
void ViewChange(){
if (!isBreakSwitch) {
startTransform.position = Vector3.Slerp (startTransform.position, endPosition, Time.deltaTime * speed);
startTransform.rotation = Quaternion.Slerp (startTransform.rotation, endQuaternion, Time.deltaTime * speed); if (Vector3.Distance (startTransform.position, endPosition) <= 0.5f &&
Quaternion.Angle (startTransform.rotation, endQuaternion) <= 0.5f) {
Debug.Log ("Camera Arrived at the specified location!");
isBreakSwitch = true;
}
} else
return;
} /// <summary>
/// Views the change immediately.
/// </summary>
void ViewChangeImmediately(){
if (!isBreakSwitch) {
startTransform.position = Vector3.Slerp (startTransform.position, endPosition, Time.time);
startTransform.rotation = Quaternion.Slerp (startTransform.rotation, endQuaternion, Time.time); if (Vector3.Distance (startTransform.position, endPosition) <= 0.5f &&
Quaternion.Angle (startTransform.rotation, endQuaternion) <= 0.5f) {
Debug.Log ("Camera Arrived at the specified location!");
isBreakSwitch = true;
}
} else
return;
} /// <summary>
/// Breaks the switch.
/// </summary>
/// <returns><c>true</c>, if switch was broken, <c>false</c> otherwise.</returns>
/// <param name="isBreak">If set to <c>true</c> is break.</param>
public bool BreakSwitch(bool isBreak=true){
isBreakSwitch = isBreak;
return isBreakSwitch;
} void Update () {
if (method == )
ViewChange ();
}
}

我写了两个聚焦的方法,一个是立即聚焦,一个是有时间差的聚焦,大家可以自行选择需要的。

这里我把此脚本做成了单例,由于对单例的理解还比较浅显,所以看起来比较简单,如果各位道友有更好的单例方法,请多多指点,小弟谢过!!!

Unity 相机的聚焦功能的更多相关文章

  1. 转:HTML5页面如何在手机端浏览器调用相机、相册功能

    HTML5页面如何在手机端浏览器调用相机.相册功能 开发微信端浏览器访问的HTML5的页面,页面中有一个<input id="input" type="file&q ...

  2. HTML5页面如何在手机端浏览器调用相机、相册功能

    最近在做一个公司的保险信息处理系统项目,开发微信端浏览器访问的HTML5的页面,页面中有一个<input id="input" type="file"/& ...

  3. unity相机跟随Player常用方式

    固定跟随,无效果(意义不大) public class FollowPlayer : MonoBehaviour { public Transform Player; private Vector3 ...

  4. unity, 相机空间 与 相机gameObject的局部空间

    在unity里 相机空间 与 相机gameObject的局部空间 不重合. Camera.worldToCameraMatrix的文档中有这样一句话: Note that camera space m ...

  5. Unity相机平滑跟随

    简介 unity中经常会用到固定视角的相机跟随,然后百度发现大家都是自己写的,然后偶也写咯一个,分享一下 PS: 由于刚学C#不久,才发现delegate这个东东,也不知道对性能影响大不大,但是看MS ...

  6. 淺談Unity 5.4新功能:Light Probe Proxy Volume

    作者:CHRISTOPHER POPE 原文連結 Unity 5.4進入到Beta的階段.当中一個特別的功能是光照探頭代理Light Probe Proxy Volume(LPPV).本篇會向大家介紹 ...

  7. Unity自带网络功能——NetworkView组件、Serialize、RPC

    Unity拥有大量的第三方插件,专门提供了对网络功能的支持.可是,大部分开发人员第一次接触到的还是Unity自带的网络功能,也就是大家常常说到的Unity Networking API.这些API是借 ...

  8. Unity 鼠标控制视角功能和动画播放冲突解决办法

    环境是 unity 5.6.4 情况说明: 1 模型动画单独播放是没问题的. 2 鼠标控制模型是没问题的. 3 在start中播放模型动画,即使鼠标控制视角代码还挂载着,但是模型却无法用鼠标旋转等操作 ...

  9. |原创|unity 4.3 2D功能SpriteRenderer修改颜色的方法

    4.3增加了不少2D功能,然后实在没有找到有人分享,在国外查资料研究一下午然后给个简单的教程 ===================================================== ...

随机推荐

  1. Java中代理对象的使用小结

    在某些情况下,一个客户不想或不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到了中介作用,这不仅仅使用代理模式,还可以实现适配器模式.装饰模式等. 代理对象内部含有对真实对象的引用,从而 ...

  2. LeetCode 2. Add Two Numbers 解题报告

    题意: 有两个链表,它们表示逆序的两个非负数.例 (2 -> 4 -> 3)表示342,求两个数字的和,并用同样的方式逆序输出.如342+465 = 807,你需要把结果表达为(7 -&g ...

  3. 2017年最新chrome必备插件推荐

    1. 上网必备 Speed dial plus新标签页, 直接替换掉chrome自带的毫无新意的新标签页,简洁优美快速,我本人非常喜欢. &amp;lt;img src="https ...

  4. servlet匹配规则和顺序

    1.  写法 ①完全匹配:以“/”开头,以字母(非“*”)结束    如:<url-pattern>/test/list.do</url-pattern> ②目录匹配:以“/” ...

  5. 【NFS项目实战二】NFS共享数据的时时同步推送备份

    [NFS项目实战二]NFS共享数据的时时同步推送备份 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品, ...

  6. Linux centos7环境下安装Nginx

    Linux centos7环境下安装Nginx的步骤详解 1.    首先到Nginx官网下载Nginx安装包 http://nginx.org/download/nginx-1.5.9.tar.gz ...

  7. iOS性能之WebP

    当今互联网,无论网页还是APP,流量占用最大的,多数都是因为图片,越是良好的用户体验,对图片的依赖度越高.但是图片是一把双刃剑,带来了用户体验,吸引了用户注意,却影响了性能,因为网络请求时间会相对比较 ...

  8. 【iOS】7.4 定位服务->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理编码和反地理编码

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  9. pcntl_fork 导致 MySQL server has gone away 解决方案

    pcntl_fork 前连数据库,就会报 MySQL server has gone away 错误.原因是子进程会继承主进程的数据库连接,当mysql返回数据时,这些子进程都可以通过这个连接读到数据 ...

  10. supervisor安装配置

    1.安装 下载:https://codeload.github.com/Supervisor/supervisor/zip/3.1.3 2.安装 .zip cd supervisor- python ...