正交相机下实现滚轮按钮拖动,滚动滚轮缩放的功能

实现了一个功能,鼠标滚轮键按下可以拖动视野内的物体全体(其实是相机自己在移动),滚动滚轮可以缩放内容(其实是改变相机视野大小)

效果如下

代码奉上

 1 using UnityEngine;
 2 using UnityEngine.UI;
 3
 4 /// <summary>
 5 /// 挂载在主相机上
 6 /// </summary>
 7 public class Cont : MonoBehaviour
 8 {
 9     private new Camera camera;
10     private bool isDrag = false;//是否处在拖动状态
11     private Vector3 startMousePosition;//开始拖动的时候鼠标在屏幕上的位置
12     private Vector3 startCameraPosition;//开始拖动的时候相机在世界空间上的位置
13
14     private Text text;//显示屏幕分辨率的,可忽略
15     private void Start()
16     {
17         text = GameObject.FindWithTag("Text").GetComponent<Text>();
18         camera = GetComponent<Camera>();
19         temp = camera.orthographicSize;
20
21         text.text = camera.scaledPixelWidth + "  " + camera.scaledPixelHeight;
22         dragScaleX = 1.0f / camera.scaledPixelHeight;//横向缩放值
23         dragScaleY = 1.0f / camera.scaledPixelHeight;//纵向缩放值
24     }
25
26     void Update()
27     {
28         Drag();//拖动
29         Scale();//滚轮缩放
30     }
31
32     [SerializeField]
33     private float ScrollScale = 0.1f;
34     private float temp;
35     private float tempAxis;
36     private void Scale()//滚轮缩放
37     {
38         tempAxis = Input.GetAxis("Mouse ScrollWheel");//获取滚轮输入,-1/0/1
39         if (tempAxis == 0) return;
40
41         temp -= tempAxis * ScrollScale * temp;
42         if (temp < 0)  //控制不让视野为负值,导致内容被中心对称
43         {
44             temp += tempAxis * ScrollScale * temp;
45             return;
46         }
47         camera.orthographicSize = temp;
48     }
49
50     private void Drag()//拖动
51     {
52         if (Input.GetMouseButtonDown(2))//滚轮按钮
53         {
54             isDrag = true;
55             startMousePosition = Input.mousePosition;//开始拖动前记录鼠标位置
56             startCameraPosition = transform.localPosition;//开始拖动前记录相机位置
57         }
58         if (Input.GetMouseButtonUp(2))
59         {
60             isDrag = false;
61         }
62
63         MoveScene();
64     }
65     [SerializeField]
66     private float dragScaleX = 0.001f;
67     [SerializeField]
68     private float dragScaleY = 0.001f;
69     private Vector3 worldDir;
70     private void MoveScene()
71     {
72         if (!isDrag) return;
73
74         worldDir = (startMousePosition - Input.mousePosition) * 2 * camera.orthographicSize;
75         worldDir.x *= dragScaleX;
76         worldDir.y *= dragScaleY;
77         transform.localPosition = startCameraPosition + worldDir;
78     }
79
80     private void OnGUI()
81     {
82         text.text = camera.pixelWidth + "  " + camera.pixelHeight;
83     }
84 }

使用的时候只要把组件挂载在主相机上就可以了

功能算是完成了,但是有一点很不解,为什么代码中 22行23行用的都是 1/camera.scaledPixelHeight 。如果不是 camera.scaledPixelHeight 而是 camera.scaledPixelWidth 的话会出现鼠标滞后或超前的情况,望指教。

原文地址:https://www.cnblogs.com/Yukisora/p/8747167.html

时间: 2024-08-29 20:22:13

正交相机下实现滚轮按钮拖动,滚动滚轮缩放的功能的相关文章

Libgdx之正交相机 OrthographicCamera

本翻译自Libgdx Wiki 本文主要介绍OrthographicCamera相机类和用法.OrthographicCamera是正交相机,用在2D游戏开发中,无论游戏物体放在游戏世界中的那个位置,用正交相机看到的物体都不会被缩放. 描述 正交相机的操作非常简单,就像我们在现实世界中操作相机一样,文章中主要介绍: 相机的移动和旋转 相机的放到和缩小 改变相机的视窗大小 在窗口(widow)坐标系和(世界)坐标系之间切换点的位置 使用正交相机可以在不必去操作矩阵的情况下非常方便的来移动游戏世界,

Unity3D Camera透视相机到正交相机插值

事实上效果并不怎么好,因为延迟光照下的很多效果不支持正交,许多后期效果会炸掉,需要酌情使用 通过对投影矩阵进行插值来实现 如果透视相机的远截面和正交相机的远截面差太多,插值时会很奇怪,需要注意. 效果: 代码: using UnityEngine; using System.Collections; public class ProjectionLerp : MonoBehaviour { [Range(0, 0.9f)] public float lerp; public float near

js 鼠标左键拖动滚动

鼠标左键拖动滚动 原作者: http://blog.csdn.net/lisatisfy/article/details/6606026 本文在源代码的基础上 增加支持水平滚动 的功能 html <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

javaScript判断鼠标滚轮的上下滚动

分享一个js实现判断鼠标滚轮的上下滚动: 1 <script type="text/javascript"> 2 var scrollFunc = function (e) { 3 e = e || window.event; 4 if (e.wheelDelta) { //判断浏览器IE,谷歌滑轮事件 5 if (e.wheelDelta > 0) { //当滑轮向上滚动时 6 alert("滑轮向上滚动"); 7 } 8 if (e.wheel

jquery 文字滚动大全 scroll 支持文字或图片 单行滚动 多行滚动 带按钮控制滚动

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

Android多个按钮下本Activity按钮事件处理

当界面上有 两个Button按钮 假设他们的id 分别为btn1 , btn2 先让 Activity 实现接口  implements   OnClickListener 声明 两个 Button b1,  Button b2 在onCreate方法里 对应找到这两个 Button findviewbyid......不再赘述 b1.setOnClickListener(this); b2.setOnClickListener(this); 然后单独 定义重写方法 onClick(View v

android手势事件 快速移动 长按触摸屏 按下触摸屏,并拖动

/* 用户按下触摸屏.快速移动后松开 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { //参数解释: // e1:第1个ACTION_DOWN MotionEvent // e2:最后一个ACTION_MOVE MotionEvent // velocityX:X轴上的移动速度,像素/秒 // velocityY:Y轴上的移动速度,像素/秒 // 触发条件 : /

XP系统中,系统属性→计算机名中,网络ID是灰色的不可用状态,还有下面的“更改”按钮点进去,“隶属于”的域和工作组也是灰色不可用

XP系统中,系统属性→计算机名中,网络ID那个按钮是灰色的不可用状态,还有下面的“更改”按钮点进去,“隶属于”的域和工作组也是灰色不可用. 一般提供的解决方法:在运行中键入Msconfig,在服务标签中钩选workstation服务,即可!另,也可在控制面板中选择“管理工具”---“服务”----开启workstation服务即可! 假如没有workstation服务,请在网络中安装microsoft网络客户端! 但是在启用服务的时候却出现问题了:windows 不能在本地计算机中启用 work

BootStrap学习(2)_下拉菜单&amp;按钮组

一.下拉菜单 1.基本下拉菜单 如需使用下列菜单,只需要在class .dropdown 内加上下拉菜单即可.下面的实例演示了基本的下拉菜单: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"