Unity使用鼠标旋转缩放平移视角,供大家参考,具体内容如下

用代码在Game界面完美实现Scene界面的操作方法。

使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上。

视角跟踪的是一个空物体,当然如果你是做RPG游戏需要跟踪某一角色的视角,那就不需要中键平移功能,把空物体换成角色就行。

代码主要是分三部分功能进行实现。

1.右键拖动控制视角的旋转;

2.滚轮旋转控制视角的缩放;

3.中键拖动控制视角的平移。

右键拖动控制旋转主要是用GetAxis获得鼠标在x方向与y方向平移的距离,相机的旋转是通过旋转相机本体坐标系的x轴与y轴实现的,重要的是在旋转相机的同时,要控制相机和target物体的相对距离,即同时控制相机绕target物体的旋转。这个网上多数实现都相同,不赘述

中键滚轮控制视角的缩放,定义Distance变量控制相机与target的距离(相机z轴方向的距离),用GetAxis获得滚轮旋转的程度,控制Distance的变动。这里和网上已有的方法也没什么区别。

中键拖动控制视角的平移,之前在网上查找相关的实现,结果实际效果都比较差,所以自己实现了一下。视角的平移是通过获取中键在屏幕坐标系下的平移的方向向量,然后转换为世界坐标系下的target坐标的平移,然后调整相机的位置进行相应的平移以保证旋转和缩放不受影响。

屏幕坐标系的平移转换到世界坐标系下的平移,本质上就是世界坐标系下沿着相机的本体坐标系的x与y轴进行相应的平移。所以只需要求出屏幕坐标系x与y方向的平移,分别乘以相机x与y轴的方向向量,然后与target原来的坐标相加,就可以获得target平移后的位置,再将相机的位置平移过去即实现了视角的平移,这种平移保证了相机平面和target之间的相对距离保持不变。具体代码如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class MouseLookTest : MonoBehaviour {

//相机跟随的目标物体,一般是一个空物体

public Transform target;

private int MouseWheelSensitivity = 1; //滚轮灵敏度设置

private int MouseZoomMin = 1; //相机距离最小值

private int MouseZoomMax = 20; //相机距离最大值

private float moveSpeed = 10; //相机跟随速度(中键平移时),采用平滑模式时起作用,越大则运动越平滑

private float xSpeed = 250.0f; //旋转视角时相机x轴转速

private float ySpeed = 120.0f; //旋转视角时相机y轴转速

private int yMinLimit = -360;

private int yMaxLimit = 360;

private float x = 0.0f; //存储相机的euler角

private float y = 0.0f; //存储相机的euler角

private float Distance = 5; //相机和target之间的距离,因为相机的Z轴总是指向target,也就是相机z轴方向上的距离

private Vector3 targetOnScreenPosition; //目标的屏幕坐标,第三个值为z轴距离

private Quaternion storeRotation; //存储相机的姿态四元数

private Vector3 CameraTargetPosition; //target的位置

private Vector3 initPosition; //平移时用于存储平移的起点位置

private Vector3 cameraX; //相机的x轴方向向量

private Vector3 cameraY; //相机的y轴方向向量

private Vector3 cameraZ; //相机的z轴方向向量

private Vector3 initScreenPos; //中键刚按下时鼠标的屏幕坐标(第三个值其实没什么用)

private Vector3 curScreenPos; //当前鼠标的屏幕坐标(第三个值其实没什么用)

void Start () {

//这里就是设置一下初始的相机视角以及一些其他变量,这里的x和y。。。是和下面getAxis的mouse x与mouse y对应

var angles = transform.eulerAngles;

x = angles.y;

y = angles.x;

CameraTargetPosition = target.position;

storeRotation = Quaternion.Euler (y + 60, x, 0);

transform.rotation = storeRotation; //设置相机姿态

Vector3 position = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + CameraTargetPosition; //四元数表示一个旋转,四元数乘以向量相当于把向量旋转对应角度,然后加上目标物体的位置就是相机位置了

transform.position = storeRotation * new Vector3 (0, 0, -Distance) + CameraTargetPosition; //设置相机位置

// Debug.Log("Camera x: "+transform.right);

// Debug.Log("Camera y: "+transform.up);

// Debug.Log("Camera z: "+transform.forward);

// //-------------TEST-----------------

// testScreenToWorldPoint();

}

void Update () {

//鼠标右键旋转功能

if (Input.GetMouseButton (1)) {

x += Input.GetAxis ("Mouse X") * xSpeed * 0.02f;

y -= Input.GetAxis ("Mouse Y") * ySpeed * 0.02f;

y = ClampAngle (y, yMinLimit, yMaxLimit);

storeRotation = Quaternion.Euler (y + 60, x, 0);

var position = storeRotation * new Vector3 (0.0f, 0.0f, -Distance) + CameraTargetPosition;

transform.rotation = storeRotation;

transform.position = position;

} else if (Input.GetAxis ("Mouse ScrollWheel") != 0) //鼠标滚轮缩放功能

{

if (Distance >= MouseZoomMin && Distance <= MouseZoomMax) {

Distance -= Input.GetAxis ("Mouse ScrollWheel") * MouseWheelSensitivity;

}

if (Distance < MouseZoomMin) {

Distance = MouseZoomMin;

}

if (Distance > MouseZoomMax) {

Distance = MouseZoomMax;

}

var rotation = transform.rotation;

transform.position = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + CameraTargetPosition;

}

//鼠标中键平移

if (Input.GetMouseButtonDown (2)) {

cameraX = transform.right;

cameraY = transform.up;

cameraZ = transform.forward;

initScreenPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z);

Debug.Log ("downOnce");

//targetOnScreenPosition.z为目标物体到相机xmidbuttonDownPositiony平面的法线距离

targetOnScreenPosition = Camera.main.WorldToScreenPoint (CameraTargetPosition);

initPosition = CameraTargetPosition;

}

if (Input.GetMouseButton (2)) {

curScreenPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z);

//0.01这个系数是控制平移的速度,要根据相机和目标物体的distance来灵活选择

target.position = initPosition - 0.01f * ((curScreenPos.x - initScreenPos.x) * cameraX + (curScreenPos.y - initScreenPos.y) * cameraY);

//重新计算位置

Vector3 mPosition = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + target.position;

transform.position = mPosition;

// //用这个会让相机的平移变得更平滑,但是可能在你buttonup时未使相机移动到应到的位置,导致再进行旋转与缩放操作时出现短暂抖动

//transform.position=Vector3.Lerp(transform.position,mPosition,Time.deltaTime*moveSpeed);

}

if (Input.GetMouseButtonUp (2)) {

Debug.Log ("upOnce");

//平移结束把cameraTargetPosition的位置更新一下,不然会影响缩放与旋转功能

CameraTargetPosition = target.position;

}

}

//将angle限制在min~max之间

static float ClampAngle (float angle, float min, float max) {

if (angle < -360)

angle += 360;

if (angle > 360)

angle -= 360;

return Mathf.Clamp (angle, min, max);

}

void testScreenToWorldPoint () {

//第三个坐标指的是在相机z轴指向方向上的距离

Vector3 screenPoint = Camera.main.WorldToScreenPoint (CameraTargetPosition);

Debug.Log ("ScreenPoint: " + screenPoint);

// var worldPosition = Camera.main.ScreenToWorldPoint(new Vector3(1,1,10));

// Debug.Log("worldPosition: "+worldPosition);

}

}

实现的效果如下图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

uinty 为什么一旋转鼠标镜头就倒了_Unity3D使用鼠标旋转缩放平移视角相关推荐

  1. Unity3D使用鼠标旋转缩放平移视角

    Unity使用鼠标旋转缩放平移视角 用代码在Game界面完美实现Scene界面的操作方法. 使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上. 视角跟踪的是一个空物体,当然如果你是做RPG游 ...

  2. Unity 基础 之 鼠标控制 相机(摄像机Camera)的旋转,移动和 fov 的简单使用整理

    Unity 基础 之 鼠标控制 相机(摄像机Camera)的旋转,移动和 fov 的简单使用整理 目录 Unity 基础 之 鼠标控制 相机(摄像机Camera)的旋转,移动和 fov 的简单使用整理 ...

  3. 鼠标经过变大1.2倍、旋转360度并改变背景色。

    鼠标经过变大1.2倍.旋转360度并改变背景色. HTML代码部分 <div class="demo_box demo_rotate">鼠标经过变大1.2倍.旋转360 ...

  4. 苹果屏幕旋转怎么设置_笔记本电脑维修|笔记本电脑屏幕旋转90度怎么复原

    大家在使用笔记本电脑的时候,有没有遇到过这样一个问题.在某一次打开电脑的时候,突然就发现笔记本电脑的屏幕旋转了90度,而且不管打开哪个界面,都是旋转了90度的.遇到这个问题的时候,有小伙伴不知道怎么解 ...

  5. html右键滚轮不起作用,鼠标滚轮上下失灵处理方法 为什么鼠标滚轮不管用

    有些电脑用户会反映,在使用鼠标点击电脑时,会出现鼠标滚轮上下失灵的现象,而有的时候这种现象还会自行消失,那么为什么鼠标滚轮会出现失灵的现象呢,接下来随小编一起了解下鼠标滚轮上下失灵处理方法以及为什么鼠 ...

  6. html鼠标四种,鼠标有哪些种类?四种鼠标类型的优缺点

    鼠标的种类有很多,目前常用的鼠标按照定位原理分为光电鼠标.激光鼠标.蓝光鼠标和蓝影鼠标,可能大部分用户并不了解它们之间的区别,只有少数游戏玩家听说过这些鼠标种类.今天我们就来说说光电鼠标.激光鼠标.蓝 ...

  7. UIDeviceOrientation 和 UIInterfaceOrientation 设备旋转的用法 (实例)  和 IOS6屏幕旋转详解

    1. UIDeviceOrientation 和 UIInterfaceOrientation 设备旋转的用法 (实例) 博客分类: IOS / Objective-C UIDeviceOrienta ...

  8. 向量学习3:蝌蚪随鼠标移动且蝌蚪头部总是指向鼠标

    游戏设计中,一些角色随鼠标移动,要求角色的头部总是指向鼠标.例如小蝌蚪随鼠标移动,蝌蚪头部必须指向鼠标,否则鼠标向蝌蚪尾部方向移动,看起来蝌蚪向后倒退,显然不合理.角色随鼠标移动比较容易做到,只要令角 ...

  9. 荒野行动 android 鼠标,荒野行动pc版鼠标一直移出去怎么办 荒野行动鼠标出界分析...

    荒野行动pc版其实就是电脑上下载模拟器来玩,其实版本跟手机中的一样,只是开启的方式不同,最近很多玩家反映用模拟器玩鼠标老是飘出去,搞得各个都很烦.下面就一起来看下荒野行动鼠标出界分析吧,希望可以给大家 ...

  10. 计算机类和鼠标类是什么关系,四种鼠标类型的优缺点

    四种鼠标类型的优缺点 鼠标的种类有很多,目前常用的鼠标按照定位原理分为光电鼠标.激光鼠标.蓝光鼠标和蓝影鼠标,可能大部分用户并不了解它们之间的区别,只有少数游戏玩家听说过这些鼠标种类.下面就来和小编一 ...

最新文章

  1. Android Sensors (2) 传感器API的使用
  2. Python回顾与整理10:模块
  3. Java中的文件下载
  4. 制作Python的安装模块
  5. Linux远程复制命令SCP
  6. 如何将对象中的内容按照一定的顺序进行排序
  7. 笔记本windows7设置WIFI教程(超详细)
  8. 文字排版不在单调!可临摹的网页UI设计模板,轻松驾驭!
  9. 将数据从MySql导入数据至SQL Server 2000
  10. CSS控制div宽度最大宽度/高度和最小宽度/高度
  11. 数据表的类型(INNODB与MYISAM 的区别)
  12. c++string类的相关操作
  13. 中国快递包裹总量的预测-基于SARIMA模型
  14. 博弈论模型(巴什博弈)
  15. MySQL 复制表结构、数据
  16. QQ快速登录的实现原理
  17. 【实战练习】汽油辛烷值优化建模(二)(问题一的详细讲解)
  18. JZ2440开发板nand flash出现坏块的解决办法
  19. 电脑硬盘右击计算机就卡死,电脑右键就卡死是什么原因?
  20. 一切就绪,2019年新型智慧城市峰会将展现怎样的“新益阳”

热门文章

  1. android 语音库,安卓系统也能用苹果语音库:Vocalizer TTS语音引擎及语音包合集
  2. VJC案例-走五角星
  3. 基于SSM的电脑商城(源码)
  4. 7 EDA实用技术教程【基本语句3】
  5. 《Java就业培训教程》_张孝祥_书内源码_08
  6. 791A.Bear and Big Brother
  7. u盘重装惠普服务器系统,教你hp惠普u盘重装win10系统
  8. Python调用科大讯飞语音合成离线SDK
  9. Java JSON解析教程
  10. sas硬盘安装linux,Intel SAS RAID安装CentOS 5.4 Linux操作系统方法附教程下载