Unity 相机的聚焦功能
摘要:本文原创,转载请注明出处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 相机的聚焦功能的更多相关文章
- 转:HTML5页面如何在手机端浏览器调用相机、相册功能
HTML5页面如何在手机端浏览器调用相机.相册功能 开发微信端浏览器访问的HTML5的页面,页面中有一个<input id="input" type="file&q ...
- HTML5页面如何在手机端浏览器调用相机、相册功能
最近在做一个公司的保险信息处理系统项目,开发微信端浏览器访问的HTML5的页面,页面中有一个<input id="input" type="file"/& ...
- unity相机跟随Player常用方式
固定跟随,无效果(意义不大) public class FollowPlayer : MonoBehaviour { public Transform Player; private Vector3 ...
- unity, 相机空间 与 相机gameObject的局部空间
在unity里 相机空间 与 相机gameObject的局部空间 不重合. Camera.worldToCameraMatrix的文档中有这样一句话: Note that camera space m ...
- Unity相机平滑跟随
简介 unity中经常会用到固定视角的相机跟随,然后百度发现大家都是自己写的,然后偶也写咯一个,分享一下 PS: 由于刚学C#不久,才发现delegate这个东东,也不知道对性能影响大不大,但是看MS ...
- 淺談Unity 5.4新功能:Light Probe Proxy Volume
作者:CHRISTOPHER POPE 原文連結 Unity 5.4進入到Beta的階段.当中一個特別的功能是光照探頭代理Light Probe Proxy Volume(LPPV).本篇會向大家介紹 ...
- Unity自带网络功能——NetworkView组件、Serialize、RPC
Unity拥有大量的第三方插件,专门提供了对网络功能的支持.可是,大部分开发人员第一次接触到的还是Unity自带的网络功能,也就是大家常常说到的Unity Networking API.这些API是借 ...
- Unity 鼠标控制视角功能和动画播放冲突解决办法
环境是 unity 5.6.4 情况说明: 1 模型动画单独播放是没问题的. 2 鼠标控制模型是没问题的. 3 在start中播放模型动画,即使鼠标控制视角代码还挂载着,但是模型却无法用鼠标旋转等操作 ...
- |原创|unity 4.3 2D功能SpriteRenderer修改颜色的方法
4.3增加了不少2D功能,然后实在没有找到有人分享,在国外查资料研究一下午然后给个简单的教程 ===================================================== ...
随机推荐
- 《Shell脚本学习指南》学习笔记之自定义函数
Shell的函数在使用之前必须先定义,定义格式: [ function ] funname [()] { action; [return int;] } 可以带function fun()定义,也可以 ...
- Java日志工具之java.util.logging.Logger
今天总结下JDK自带的日志工具Logger,虽然它一直默默无闻,但有时使用它却比较方便.更详细的信息可以查看JDK API手册,本文只是简单示例入门. 创建Logger 我们可以使用Logger的工厂 ...
- 通过JS将BSAE64生成图片并下载
HTML:<div style="display:block;margin:0 auto;width:638px;height:795px;"><div id=& ...
- bootstrap禁用点击空白处关闭模态框
原博主地址:http://www.cnblogs.com/godlovelian/p/4530342.html
- 说说如何用js实现一个模板引擎
本文同步更新在: https://github.com/whxaxes/blog/issues/4 ,在 github 看文章显示效果会更好一些. 前言 不知不觉就很长时间没造过什么轮子了,以前一直想 ...
- Kubernetes 1.5安装
Kubernetes从1.3开始引入kubeadm来试图简化其复杂的安装.但kubeadm至今仍不稳定,而且我个人觉得kubeadm反而麻烦,还不如直接用脚本或者其他自动化工具来安装来的利索.关于ku ...
- Android: Toolbar、AppBarLayout
ToolBar是google退出的一个应用程序动作条 包括: 设置导航栏图标 设置应用程序Logo 设置标题 设置子标题 添加各种自定义控件 添加动作条菜单 API:https://developer ...
- JavaWeb之Ajax
一.什么是Ajax 1.1.Ajax的定义 Ajax:(Asynchronous JavaScript And XML)指异步 JavaScript 及 XML 不是一种新的编程语言,而是一种用于创建 ...
- Selenium自动化脚本开发总结
Selenium Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具. Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mo ...
- Java日期获取需求大全
刚进公司,作为熟悉技术,为公司做了一个小的点餐系统的网站,其中大量用到了时间日期作为唯一标示或是显示设置.特总结了一下和大家分享. package com.lucis.ordering.Utils; ...