1. 如果把代码放到按钮事件中调用,达不到想要的效果

2. 可以不用委托,但是要在Update函数中写调用CameraZoonIn的代码

3. 有很多需要改进的地方,可以参考使用 iTween 插件达到更好的效果

using UnityEngine;
using System.Collections; public class test : MonoBehaviour
{ public delegate void dgCameraCompleted(Vector3 pos, Vector3 rot);
public dgCameraCompleted CameraCompleted; public Camera currentCamera; //摄像机 public static float originFov; //源视野 private Vector3 posStart;
private Vector3 rotStart;
private static Vector3 posEnd;
private static Vector3 rotEnd;
private static Vector3 dPos;
private static Vector3 dRot; public static bool cameraIsMoving = false;
// 摄像机当前的状态 zoom in or out
public static bool cameraIsZoomIn = false; public static float minFov = 5f;
public static float maxFov = 90f;
public static float sensitivity = 10f;
private int i = 0; // 通过帧数控制摄像机移动的速度
private static int closeFrames = 70; Vector3 posBe, rotBe;
private static Vector3 localPositionOrigin;
private static Vector3 localRotationOrigin; public GameObject target;
void Start()
{
localPositionOrigin = currentCamera.transform.localPosition;
localRotationOrigin = currentCamera.transform.localEulerAngles; originFov = currentCamera.fieldOfView; //目标位置
posBe = target.transform.position + new Vector3(-0.06f, 0.38f, -0.06f);
rotBe = new Vector3(94f, 270f, 0f);
} private void Update()
{
if (CameraCompleted != null)
{
CameraCompleted(posBe, rotBe); }
// 照相机从源到目标
if (cameraIsZoomIn)
{
if (cameraIsMoving)
{
i++;
// 摄像机每帧移动固定的位置和角度,closeFrames帧后到达目标位置
currentCamera.transform.position += dPos;
currentCamera.transform.eulerAngles += dRot; if (i == closeFrames)
{
cameraIsMoving = false;
i = 0;
}
}
} // 通过滑轮控制视野大小
else
{
float fov = currentCamera.fieldOfView; fov -= Input.GetAxis("Mouse ScrollWheel") * sensitivity;
fov = Mathf.Clamp(fov, minFov, maxFov); currentCamera.fieldOfView = fov;
} }
public void CameraZoomIn(Vector3 posTar, Vector3 rotTar)
{
currentCamera.fieldOfView = originFov; posEnd = posTar;
rotEnd = rotTar;
Debug.Log("posTar=" + posTar);
Debug.Log("rotTar=" + rotTar); posStart = currentCamera.transform.position; dPos = new Vector3((posEnd.x - posStart.x) / closeFrames, (posEnd.y - posStart.y) / closeFrames, (posEnd.z - posStart.z) / closeFrames); rotStart = currentCamera.transform.eulerAngles;
dRot = (rotEnd - rotStart) / closeFrames; cameraIsMoving = true;
cameraIsZoomIn = true; FixCameraView(true);
} private static void FixCameraView(bool bFixed)
{
// 如果有地方用到了摄像机,需要进行修正
if (cameraIsZoomIn == bFixed)
{
//mainCamera.transform.parent.GetComponent<CharacterMotor>().enabled = !bFixed;
//mainCamera.GetComponent<MouseLook>().enabled = !bFixed;
//mainCamera.transform.parent.GetComponent<MouseLook>().enabled = !bFixed;
}
} void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 40, 40), "开始"))
{
CameraCompleted += CameraZoomIn;
Debug.Log(CameraCompleted);
}
if (GUI.Button(new Rect(10, 55, 40, 40), "结束"))
{
CameraZoomOut();
CameraCompleted = null;
}
} public void CameraZoomOut()
{
if (currentCamera == null)
Debug.Log("camera");
if (localPositionOrigin == null)
Debug.Log("localposition");
currentCamera.transform.localPosition = localPositionOrigin;
currentCamera.transform.localEulerAngles = localRotationOrigin;
cameraIsMoving = false;
cameraIsZoomIn = false;
FixCameraView(false);
} }

  

10. 将摄像机对准物体,并显示整个对准过程,摄像机Zoom的更多相关文章

  1. Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果

    Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果 梗概: 一. 摄像机围绕目标物体旋转, 即摄像机离目标物体有一定的距离且旋转轴心为该物体的位置. 二. 当目标物体被障碍物挡住后, 需要将摄像机 ...

  2. [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 在<仙剑奇侠传>.<古剑奇谭>等游戏中,常常须要玩家在一个3D场景中 ...

  3. Java基础-多线程编程-1.随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。

    1.随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread ...

  4. MiniProfiler.3.0.10 用于MVC4.0中不能显示SQL语句

    MiniProfiler.3.0.10 用于MVC4.0中可以显示执行时间,但是不能显示SQL语句,怎么解决?

  5. 【opengl】OpenGL中三维物体显示在二维屏幕上显示的变换过程

    转自:http://blog.sina.com.cn/s/blog_957b9fdb0100zesv.html 为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机(Camera)模 ...

  6. Android进阶笔记10:ListView篇之ListView显示多种类型的条目(item)

    ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似. 1. 这是MainActivity,MainActivity的布局就是一个ListView,太简单了这里就不写了,直接 ...

  7. AJ学IOS 之微博项目实战(10)微博cell中图片的显示以及各种填充模式简介

    AJ分享,必须精品 :一效果 如果直接设置会有拉伸等等的状况,这里主要介绍图片显示的一些细节 二:代码 代码实现其实很简单,微博当中用了一个photos来存放九宫格这些图片,然后用了一个photo类来 ...

  8. 10.1 ifconfig:配置或显示网络接口信息

    ifconfig命令 用于配置网卡IP地址等网络参数或显示当前网络的接口状态,其类似于Windows下的ipconfig命令,这两个命令很容易混淆,读者需要区分一下.此外,ifconfig命令在配置网 ...

  9. KindEditor 4.1.10 (2013-11-23)首行空格不能显示在编辑器内

    KindEditor版本: KindEditor 4.1.10 (2013-11-23) 一.BUG再现步骤: 1.文章前面插入二个全角空格作为缩进,因为并非所有段落都有缩进故不采用 CSS 的 te ...

随机推荐

  1. SpringMVC使用@ResponseBody注解返回中文字符串乱码的问题

    先说一下我的经历,以及解决问题的而过程. 在使用SpringMVC的时候,最开始的时候在配置文件中使用<mvc:annotation-driven />去自动注册DefaultAnnota ...

  2. Android开发常见问题及解决方法

    http://blog.csdn.net/silangquan/article/details/8104414

  3. sql索引碎片产生的原理 解决碎片的办法(sql碎片整理)(转)

    本文讲述了SQL SERVER中碎片产生的原理,内部碎片和外部碎片的概念.以及解决碎片的办法和填充因子.在数据库中,往往每一个对于某一方面性能增加的功能也会伴随着另一方面性能的减弱.系统的学习数据库知 ...

  4. iOS推送通知流程

    ①注册推送通知使用方法:registerUserNotificationSettings, registerForRemoteNotifications ④APP发送deviceToken到第三方: ...

  5. OC2_分数类

    // // Fraction.h // OC2_分数类 // // Created by zhangxueming on 15/6/10. // Copyright (c) 2015年 zhangxu ...

  6. 循环/loop 结构/structure

    1.Shell loop 2.C++/CPlusPlus ①.std::for_each ②.for loop ③.Iterator library 3.Python Loop ①.Python.or ...

  7. (转)MySql可视化工具MySQL Workbench使用教程

    转自:http://www.cnblogs.com/daimage/archive/2012/02/25/2367534.html 1. MySQL Workbench MySQL Workbench ...

  8. Poj 2159 / OpenJudge 2159 Ancient Cipher

    1.链接地址: http://poj.org/problem?id=2159 http://bailian.openjudge.cn/practice/2159 2.题目: Ancient Ciphe ...

  9. asp.net导出excel较为简约的代码

    ds为数据源 Response.Buffer = true; Response.AppendHeader("Content-Disposition", "attachme ...

  10. iOS 多态的简单思想

    /** * 多态:多种形态,是对于对象而言的,如果没有继承就没有多态 * * 在代码中体现:就是通过定义父类指针指向子类的对象 * * 好处:在函数或者方法的参数中如果传入的是父类指针,那么实现的时候 ...