摘要:本文原创,转载请注明出处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. html 框架 2017-03-11

    1. 框架frameset   (不在body中编写) Eg: 显示如下框架 第一步: <frameset rows="100,100,*" frmameborder=&qu ...

  2. OpenFlow硬件交换机制作及刷机教程

    1.目的 将普通路由器升级成为一台支持OpenFlow的交换机. 具体哪些路由器可以刷OpenFlow可以参考:OpenWRT:http://wiki.openwrt.org/toh/start#su ...

  3. Adapter基本用法

    使用流程 graph LR A(新建适配器) -->B(绑定数据源) B-->C(设置适配器) 1. ArrayAdapter new ArrayAdapter<?>(cont ...

  4. Spring学习笔记①

    我觉得Spring之所以发展的好,主要是理论研究与实践是并轨的,能跟得上时代的步伐,尤其是基础理论的研究(可能是最近看三体看多了,对基础理论非常崇拜).微服务的实现啊,RESTful的实现,对应的Sp ...

  5. jenkins gradle 编译遇到tomcat异常

    使用gradle在jenkins 上构建的时候遇到 进行构建的时候报"Could not load Logmanager org.apache.juli.ClassLoaderLogMana ...

  6. [LeetCode] Decode String 题解

    题目 题目 s = "3[a]2[bc]", return "aaabcbc". s = "3[a2[c]]", return " ...

  7. iOS开发之类扩展

    在以往写代码时,我们经常是把声明写在.h文件中,把实现写在.m文件中,但是在实际开发中,如果把声明写在.h文件中会暴露程序很多属性(成员变量.成员变量的get和set方法),为了安全考虑,引入了类扩展 ...

  8. Rsync的工作方式

    Rsync的工作方式(来自网络) 1)拷贝本地文件: 当SRC和DES路径信息中不包含冒号":"分隔符时,就启用这种工作模式: [root@cmmailapp1 /]# rsync ...

  9. 使用Docker容器来源码编译etcd

    背景 etcd是CoreOS公司开发的分布式键值对存储库.在Kubernetes中,我们需要使用etcd作为所有REST API对象的持久化存储. 不幸的是,在github的release中,Core ...

  10. unity插件开发——一个例子:简单的svn集成

    在unity开发过程中,通常我们习惯性地在Windows操作系统下使用svn进行版本管理,而每次提交更新,都需要回到文件夹下的这种操作让人无法忍受.是不是可以集成svn到unity中呢?查了一圈uni ...