摘要:本文原创,转载请注明出处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. jQuery入门(一)

    相信学js的人多多少少听过JQuery,JQuery对于前端开发人员来说是不可或缺的,他让开发变得更加简单.那到底什么是JQuery呢?用一句话来说,JQuery就是一个javascript的库.所谓 ...

  2. Strtus2 S2-045漏洞

    S2-045漏洞已经爆发几天了,但还很多网址都存在此漏洞,很多金融类网站也收到了保护费通知...唉,收保护费少,报警无效!只能酌情处理了!做黑产的,还是少做为秒,常在河边站哪有不湿鞋,劝各位早日金盆洗 ...

  3. 消消乐、candy crush类三消游戏程序逻辑分析

    最近在开发一款类似消消乐的三消游戏,在碰到实现斜方向下落的时候卡住了很长时间.好几天没有思路,原本的思路是一次性预判多个宝石的一连串运动路径,运用缓动运动队列来实现宝石运动路径,例如 下落->滑 ...

  4. 在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理

    在之前一篇随笔<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>介绍了PostSharp框架的使用,试用PostSharp能给我带来很多便利和优势,减少代码冗余,提高可 ...

  5. wemall开源商城免费商城系统部分代码(内含代码地址)

    wemall开源商城免费商城系统部分代码,下面分享部分代码,供学习者学习: 开源版把install文件夹下的install.lock删除之后可进行自动安装 后台访问地址:http:// www.xxx ...

  6. GUID的获取

    全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符. GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx ...

  7. Untiy文档总结(1)-Profiling

    这段时间上班了,不是什么大公司,虽说很闲但是不能断了学习,就开始看优化有关的文档,虽说自己英语渣的要死,但也要读下去,逼着自己翻译完了,里面有抄Unity圣典的,但自己是看Unity5.5文档写的,只 ...

  8. BootStrap入门教程 (四)

    本文转自 http://www.cnblogs.com/ventlam/archive/2012/06/17/2536728.html 上讲回顾:Bootstrap组件丰富同时具有良好可扩展性,能够很 ...

  9. JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

    一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...

  10. DBProxy 入门到精通系列(二):DBProxy快速入门教程

    这里主要用来了解有关DBProxy方面的部署及基本的配置,以及模拟架构 1 DBProxy方面的安装部署 1)基础环境的部署 # .x86_64 Percona-Server-client-.x86_ ...