【转】Unity3D的输入(Input)——键盘和鼠标
http://blog.csdn.net/lingyun_blog/article/details/41451565
Unity3D使用input类控制用户的输入,输入包括了用户键盘,鼠标,触摸,重力感应以及地理位置输入等输入方式。
本节我们介绍Unity3D中如何监听用户的鼠标、键盘输入。
首先我们介绍一个很重要的类KeyCode,此类中的值记录各种按键,详细键码参照Unity圣典:http://game.ceeger.com/Script/Enumerations/KeyCode/KeyCode.html。
一.键盘的输入
•GetKey,GetKeyDown,GetKeyUp三个方法分别获取用户键盘按键的输入
GetKey:用户长按按键有效;
GetKeyDown:用户按下按键时有效;
GetKeyUp:用户抬起按键时有效;
示例:
- public class Test1 : MonoBehaviour {
- void Update ()
- {
- bool down = Input.GetKeyDown(KeyCode.Space);
- bool held = Input.GetKey(KeyCode.Space);
- bool up = Input.GetKeyUp(KeyCode.Space);
- if(down)
- {
- GUI.Label(new Rect(100,100,400,100),"down");
- }
- else if(held)
- {
- GUI.Label(new Rect(100,100,400,100),"held");
- }
- else if(up)
- {
- GUI.Label(new Rect(100,100,400,100),"up");
- }
- else
- {
- GUI.Label(new Rect(100,100,400,100),"else");
- }
- }
- }
• anyKey,anyKeyDown
anyKey用于监听用户的任意按键输入或鼠标点击,事件触发后返回true。anyKeyDown:当任意按键松开时返回true。
示例:
- public class Test2 : MonoBehaviour {
- void OnGUI(){
- if(Input.anyKey){
- GUI.Label(new Rect(100,100,400,100),"测试任意按键");
- }
- }
- }
•GetButton(string buttonName)
GetButton用于监听Button的输入,参数为自己指定的button的名字,在Unity中可以使用管理器添加或修改Input参数。unity已经为用户预设了多种输入情况,在button中预设了Fire、Jump等输入情况。用户也可以自行修改,打开Edit-->Project Settings-->Input可以看到预设如下:
以Fire1为例,可以看到使用左ctil键或者鼠标左键控制Fire1按钮。
示例:
- public class Test3 : MonoBehaviour {
- void OnGUI(){
- if(Input.GetButton("Fire1")){
- GUI.Label(new Rect(100,100,400,100),"测试按钮点击");
- }
- }
- }
另外还有GetButtonDown( 当某个按钮被按下的那一帧返回true)
GetButtonUp( 当某个按钮弹起时返回true)两个方法,就不详细介绍了。
二.鼠标的输入
•mousePosition
Input.mousePosition返回当前鼠标的位置,这里指的是距离原点的像素位置,说明一下,Unity中的原点(0,0)位置为左下角,上位y轴正方向,右为x轴正方向。返回值类型为Vector3。
示例:
- public class mono2 : MonoBehaviour {
- void OnGUI(){
- GUI.Label(new Rect(100,100,400,100),"x="+Input.mousePosition.x+" y="+Input.mousePosition.y+" z="+Input.mousePosition.z);
- }
- }
当用户移动鼠标是即可显示x,y坐标,z为0。
•GetMouseButton
GetMouseButton 对应的键处于按下状态时返回true
GetMouseButtonDown 对应的键被按下时返回true
GetMouseButtonUp 对应的键弹起时返回true
示例:
- public class mono2 : MonoBehaviour {
- void OnGUI(){
- <span style="white-space:pre"> </span> GUI.Label(new Rect(100,100,400,100),"X="+Input.GetAxis("Fire1")+"Y="+Input.GetAxis("Fire1"));
- if(Input.GetMouseButton(0)){
- GUI.Label(new Rect(100,100,400,100),"鼠标左键按下");
- }else if(Input.GetMouseButton(1)){
- GUI.Label(new Rect(100,100,400,100),"鼠标右键按下");
- }else if(Input.GetMouseButton(2)){
- GUI.Label(new Rect(100,100,400,100),"鼠标中键按下");
- }
- }
- }
在例子中可以看出参数为int型,含义为:0左键,1右键,2中键。
Untiy3D开发会碰到移动设备的触摸开发,在Android中有做过这方面开发的应该可以感觉到输入尤其是多点输入开发比较复杂,而Unity3D给我们轻松的解决的很多问题,Unity3D中是用Input类来控制用户的输入,同样Input类也会控制移动设备的输入,下面我门将介绍Input类中的移动设备输入方法。
1.Input.touchCount
此方法会返回用户触摸点的数量。
返回值为int型。
2.Input.multiTouchEnabled
这个值用于得到和控制用户是否允许多点触控,我们在开发软件过程中常会碰到不需要使用多点触控的情况,这是我们就可以使用Input.multiTouchEnabled=false;这样就只能支持单点触控了。
3.Input.GetTouch(int index)
这个方法类似于Input.touches中获得指定的数组元素。这里注意index是在0开始的。通过index索引到指定触摸点,然后再进一步操作,关于触摸点的数据结构以及相位状态,我们将在touches中进一步介绍。
4.Input.touches
这个是我们最长用的一个方法,此方法返回Touch数组。手指触控使用这个数据结构来描述:
fingerId | 手指索引 | 摸的唯一索引 |
position | 位置 | 触摸屏幕的位置 |
deltaPosition | 增量位置 | 自最后一帧改变的屏幕位置 |
deltaTime | 增量时间 | 从最后状态改变到现在经过的时间 |
tapCount | 点击数 | iPhone/iPad屏幕能够识别用过的快速点击, 这个计数器让你知道用户点击屏幕多少次, 而不是移动手指。android设备不对点击计数,这个方法总是返回1 |
phase | 相位(状态) | 描述触摸的状态,可以帮助开发者确定用户是否刚开始触摸,是否用户移动手指,是否用户刚刚抬起手指。 |
相位状态有以下五种:
开始 | 手指刚刚触摸屏幕 | |
Moved | 移动 | 手指在屏幕上移动 |
Stationary | 静止 | 手指触摸屏幕,但是自最后一帧没有移动 |
Ended | 结束 | 手指从屏幕上抬起,这是触控的最后状态 |
Canceled | 取消 | 系统取消了触控跟踪,如,用户将设备放在了脸上或超过同时超过5个触摸点。这是触控的最后状态 |
下面演示上述几种方法的示例;
示例:
example1:下面是unity官方给出的脚本,这里通过了一个非常重要的Touch集合
- public class Test1 : MonoBehaviour {
- private string countNum;
- void OnGUI(){
- GUI.Label(new Rect(100,100,400,100),"count=="+countNum);
- }
- void Update() {
- int fingerCount = 0;
- foreach (Touch touch in Input.touches) {
- if (touch.phase != TouchPhase.Ended && touch.phase != TouchPhase.Canceled)
- fingerCount++;
- }
- if (fingerCount > 0)
- countNum="User has " + fingerCount + " finger(s) touching the screen";
- }
- }
example2:
- public class Test2 : MonoBehaviour {
- public GUISkin mySkin;
- void OnGUI(){
- GUI.skin=mySkin;
- GUI.Label(new Rect(100,50,400,50),"是否支持多点触摸"+Input.multiTouchEnabled);
- GUI.Label(new Rect(100,100,400,50),"触摸对象的数量:"+Input.touchCount);
- //Input.multiTouchEnabled=false; //当设为false是只能单点触控
- Touch[] touch = Input.touches;
- string nowPhase="";
- for(int i = 0;i<touch.Length;i++){
- GUI.Label(new Rect(100,150+50*i,400,50),"第"+i+"个触摸点: X="+touch[i].position.x+" Y="+touch[i].position.y);
- switch(touch[i].phase){
- case TouchPhase.Began:
- nowPhase = "开始";
- break;
- case TouchPhase.Canceled:
- nowPhase = "取消";
- break;
- case TouchPhase.Ended:
- nowPhase = "结束";
- break;
- case TouchPhase.Moved:
- nowPhase = "移动";
- break;
- case TouchPhase.Stationary:
- nowPhase = "静止";
- break;
- default:
- break;
- }
- GUI.Label(new Rect(100,150+50*i+25,400,50),"第"+i+"个触摸点状态:"+nowPhase);
- }
- }
- }
效果如下所示:(text1和test2同时挂在一个空object上)
【转】Unity3D的输入(Input)——键盘和鼠标的更多相关文章
- unity3d的键盘和鼠标输入
一.键盘的输入 •GetKey,GetKeyDown,GetKeyUp三个方法分别获取用户键盘按键的输入 1. GetKey:用户长按按键有效: bool down = Input.GetKeyDow ...
- DX11 Without DirectX SDK--05 键盘和鼠标输入
回到 DirectX11--使用Windows SDK来进行开发 提供键鼠输入可以说是一个游戏的必备要素.在这里,我们不使用DirectInput,因为Windws SDK本身就不提供该头文件.这里我 ...
- DirectX11 With Windows SDK--05 键盘和鼠标输入
前言 提供键鼠输入可以说是一个游戏的必备要素.在这里,我们不使用DirectInput,而是使用Windows的消息处理机制,不过要从头开始实现会让事情变得很复杂.DXTK提供了鼠标输入的Mouse. ...
- python input()键盘输入8583报文带有\x单反斜杠自动转义问题解决办法
用input()输入的字符串是8385报文比如:\x30\x30\x30\x30...,但是输入后,代码把8583报文字符串中多加了一个\,类似\\x30. 但是我把input()代码注释掉,把858 ...
- WPF嵌入Unity3D之后,unity3D程序的键盘和鼠标事件无法触发(3D程序的焦点无法激活)的解决方案
目前最通用的客户端调用3D的方式,就是WPF程序通过Process启动Unity3D的exe进程,直接上代码: //开启3D进程 internal void Create3DProcess(strin ...
- WPF之路-键盘与鼠标事件 - 简书
原文:WPF之路-键盘与鼠标事件 - 简书 键盘事件 事件类型分为以下几个类型 生命周期事件:在元素加载与卸载的时候发生 鼠标事件:鼠标动作 键盘事件:键盘动作 手写笔事件:适用于win7以上的系统 ...
- WPF 窗体中获取键盘和鼠标无操作时的超时提示
原文:WPF 窗体中获取键盘和鼠标无操作时的超时提示 通过调用Windows API中的GetLastInputInfo来获取最后一次输入的时间 , , ); timer.Tic ...
- winform中键盘和鼠标事件的捕捉和重写(转)
在 编写winform应用程序时,有时需要无论在哪个控件获取焦点时,对某一个键盘输入或者鼠标事件都进行同样的操作.比如编写一个处理图片的应用程序时, 希望无论当前哪个控件获得焦点,当用户按上.下.左. ...
- WPF 中模拟键盘和鼠标操作
转载:http://www.cnblogs.com/sixty/archive/2009/08/09/1542210.html 更多经典文章:http://www.qqpjzb.cn/65015.ht ...
随机推荐
- 查询SQLServer的启动时间
--2008及之后版本才有 SELECT sqlserver_start_time FROM sys.dm_os_sys_info
- POJ3581 Sequence(后缀数组)
题意:给一个串,串的第一个字符比后面的都大,要把它分成三段,然后反转每一段,求能得到的字典序最小的串是什么. 首先,第一段是可以确定的:把原串反转,因为第一个字符是最大的,它是唯一的,不存在反转串的后 ...
- asp.net中导出Excel的方法
一.asp.net中导出Excel的方法: 本文转载 在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出 ...
- Making raycast ignore multiple layers
I know how to make the raycast ignore a layer but I want it to ignore layers 9 and 10 but collide wi ...
- 今年暑假不AC[HDU2037]
今年暑假不AC Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- Fengshui-[SZU_B40]
Description Fengshui is an ancient subject in Chinese tradition. Someone considers it as science and ...
- BZOJ1107 : [POI2007]驾驶考试egz
i可以作为起点说明把边反向后可以从1和n到达i. 设fl[i]表示从1到达i至少需要加几条边,fr[i]表示从n到达i至少需要加几条边. 把图上下翻转后,从左往右依次计算fl[i],有fl[i]=i- ...
- 什么是SQL注入式攻击
什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响 ...
- ejabberd 的框架
最近看源码,总结ejabberd的大致框架如下
- oracle函数listagg的使用说明(分组后连接字段)
关于oracle函数listagg的使用说明 工作中经常遇到客户提出这样的需求,希望在汇总合并中,能够把日期逐个枚举出来. 如图,原始数据是这样的: 客户希望能够实现这样的汇总合并: 那么通常我会使用 ...