[Unity2D]鼠标(或触摸)输入处理
在游戏的编程之中,基本上都需要依赖鼠标的输出,特别是在手机游戏上,绝大部分都需要通过手指触摸来控制游戏。如果要实现一个精灵,当手指点击精灵的会触发相关的操作,或者我们使用一张图片来作为按钮,点击的时候触发相关的操作,这时候就需要使用鼠标输入处理了。处理鼠标输入会有下面的3种方式:
1、使用鼠标事件OnMouseDown、OnMouseDrag、OnMouseEnter、OnMouseExit、OnMouseOver、OnMouseUp
使用鼠标事件需要两个步骤,首先需要先给游戏对象添加Collider,这个Collider可以是2D或者3D的,然后给游戏对象添加脚本处理鼠标事件,示例代码如下所示:
using UnityEngine;
using System.Collections; public class ObjectTouch : MonoBehaviour
{
//Called on mouse down
void OnMouseDown()
{
Debug.Log ("You clicked me");
}
}
2、使用Input.GetMouseButton方法
使用Input.GetMouseButton方法和使用鼠标事件的区别是,鼠标事件是在操作的瞬间触发的,使用Input.GetMouseButton方法是在游戏对象的Update方法里面,通过每一帧的处理来进行判断。脚本如下所示:
// Update is called once per frame
void Update ()
{
//Is left button being pressed?
if(Input.GetMouseButton())
Debug.Log("Left Button Pressed"); //Is middle button being pressed?
if(Input.GetMouseButton())
Debug.Log("Middle Button Pressed"); //Is right button being pressed?
if(Input.GetMouseButton())
Debug.Log("Right Button Pressed"); //Get mouse x position on screen
float X = Input.mousePosition.x;
float Y = Input.mousePosition.y;
}
3、使用射线Ray
射线是3D里面的概念,当然在2D游戏里面一样可以使用。
射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。
用途:射线应用范围比较广, 多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动等 等。
相关API:
(1)Ray Camera.main.ScreenPointToRay(Vector3 pos) 返回一条射线Ray从摄像机到屏幕指定一个点
(2)Ray Camera.main.ViewportPointToRay(Vector3 pos) 返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点
(3)Ray 射线类
(4)RaycastHit 光线投射碰撞信息
(5)bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)
当光线投射与任何碰撞器交叉时为真,否则为假。
bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)
在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()。
bool Physics.Raycast(Ray ray, float distance, int layerMask)
当光线投射与任何碰撞器交叉时为真,否则为假。
bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)
当光线投射与任何碰撞器交叉时为真,否则为假。
注意:如果从一个球型体的内部到外部用光线投射,返回为假。
参数理解:
origin : 在世界坐标中射线的起始点
direction: 射线的方向
distance: 射线的长度
hit: 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。
layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞
(6)RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)
投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。
好的,下面我们再回到我们的主题,鼠标或者触摸的输入判断,使用射线来检测鼠标的输入,首先我们需要给游戏添加Collider,但是注意这个必须是3D的Collider不能是2D的,然后我们给摄像机添加脚本。通常我们也需要给检测鼠标输入的游戏添加一个脚本组件用于表示区别不同的游戏对象,如添加一个ButtonId的脚本如下:
using UnityEngine;
using System.Collections; public class ButtonId : MonoBehaviour
{
//Ids and Strings are modified in the Inspector
public string who;
public string id;
public int idLevel;
}
那么我们就可以通过这个ButtonId的属性信息来区别不同按钮。
接下来我们添加摄像机的脚本如下所示:
using UnityEngine;
using System.Collections; public class MenuManipulator : MonoBehaviour {
public ButtonId buttonPressed;
RaycastHit hit;
// Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown())
{
//获取摄像机到触摸点的位置的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// 射线是否有碰撞到物体 collider
if (Physics.Raycast(ray, out hit))
{
//Menu
// 有ButtonId组件,证明是按钮
if (hit.collider.gameObject.GetComponent<ButtonId>())
{
buttonPressed = hit.collider.gameObject.GetComponent<ButtonId>();
if (buttonPressed.id == "mywebsite")
{
Application.OpenURL("http://www.cnblogs.com/linzheng");
} }
}
}
}
}
如果是针对手机移动设备的,还可以通过Input.GetTouch来进行处理,如
using UnityEngine;
using System.Collections; public class MobileInput : MonoBehaviour
{
// Update is called once per frame
void Update ()
{
#if UNITY_IPHONE || UNITY_ANDROID || UNITY_BLACKBERRY || UNITY_WP8
if(Input.touchCount>)
{
for(int i =; i<Input.touchCount; i++)
{
//Screen position of touch
Vector2 TouchLocation = Input.GetTouch().position; //Get phase of touch
TouchPhase TPhase = Input.GetTouch().phase; //Touch begins
if(TPhase.Equals(TouchPhase.Began))
{
//Click equivalent
}
}
}
#endif
}
}
通过摄像机脚本,用射线进行处理,如:
using UnityEngine;
using System.Collections; public class MobileMouseMap : MonoBehaviour
{
// Update is called once per frame
void Update ()
{
#if UNITY_IPHONE || UNITY_ANDROID || UNITY_BLACKBERRY || UNITY_WP8
if(Input.touchCount>)
{
//Screen position of touch
Vector2 TouchLocation = Input.GetTouch().position; //Get phase of touch
TouchPhase TPhase = Input.GetTouch().phase; //Touch begins
if(TPhase.Equals(TouchPhase.Began))
{
//Generate ray from main camera and mouse position
Ray R = Camera.main.ScreenPointToRay(TouchLocation);
RaycastHit HitInfo; //If intersection
if(Physics.Raycast(R, out HitInfo))
{
//Click equivalent - call mouse event
HitInfo.collider.gameObject.SendMessage("OnMouseDown");
}
}
}
#endif
}
}
[Unity2D]鼠标(或触摸)输入处理的更多相关文章
- 9.2、Libgdx的输入处理之鼠标、触摸和键盘
(官网:www.libgdx.cn) Libgdx支持的最主要的设备是desktop或浏览器的鼠标支持,Android的触摸屏支持和键盘的支持.我们接下来了解一下. 键盘 用户按下或释放一个按键生成了 ...
- 快速入门:触摸输入(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)
原文 http://technet.microsoft.com/zh-cn/subscriptions/hh465387 快速入门:触摸输入(使用 C#/VB/C++ 和 XAML 的 Windows ...
- iOS 9之Advanced Touch Input(高级触摸输入)
金田 今天要讲的主题是iOS 9高级触摸输入,更准确地讲,是在iOS9上如何减少触摸输入到屏幕显示的延迟程度,此次将分 低延迟渲染(iOS9 渲染性能优化)和 触摸点方案改进 两个方面来介绍. 低延迟 ...
- Mac 电脑鼠标和触摸板滚动方向不一致的问题【已解决】
当我们使用鼠标连接到 MacBook 时,会发现无论怎么设置,鼠标和触摸板的滚动方向都是相反的,导致不能同时使用鼠标和触摸板 解决方法: 我安装了下面的程序,它只允许您反转鼠标的滚动行为: Scrol ...
- ubuntu鼠标和触摸板的禁用
ubuntu鼠标和触摸板的禁用 学习了:http://www.2cto.com/os/201308/239403.html 在终端下直接执行以下命令来打开或关闭触摸板. sudo modprobe - ...
- usb之鼠标作为按键输入
1. 首先搞清楚,鼠标点左键.右键等能得到什么数据,然后分析这些数据上报事件即可. 第一个基本点:usb_alloc_urb函数,创建一个struct urb结构体,只能使用这个函数来创建,它是urb ...
- 在 Ubuntu 环境下实现插入鼠标自动关闭触摸板
Ubuntu 以及其他衍生版本,如 Linux Mint 等等都可以用官方的 PPA 来安装"触摸板指示"应用程序.打开一个终端,运行以下命令: sudo add-apt-repo ...
- python 监视和控制鼠标键盘的输入(使用pynput 而非pyhook)
百度上搜到的文章大多基于pyhook, pip不能直接安装,托管在sourceForge上的代码仓库也找不到. google上发现可以使用pynput,貌似控制更为简单,而且可以直接使用pip安装 示 ...
- WPF 触摸到事件
原文:WPF 触摸到事件 本文从代码底层告诉大家,在触摸屏幕之后是如何拿到触摸点并且转换为事件 在 WPF 界面框架核心就是交互和渲染,触摸是交互的一部分.在 WPF 是需要使用多个线程来做触摸和渲染 ...
随机推荐
- TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍
首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...
- 我常用的delphi 第三方控件
转载:http://www.cnblogs.com/xalion/archive/2012/01/09/2317246.html 有网友问我常用的控件及功能.我先大概整理一下,以后会在文章里面碰到时再 ...
- error: library dfftpack has Fortran sources but no Fortran compiler found解决方法
用pip install scipy 时提示 error: library dfftpack has Fortran sources but no Fortran compiler found 解决方 ...
- django-cms 代码研究(七)杂七杂八
实体关系图 核心对象: cms_page/cms_placeholder/cms_cmsplugin. page模型类继承关系图 CMSPlugin&Placeholder模型类继承关系图 = ...
- 【消息队列MQ】各类MQ比较
目录(?)[-] RabbitMQ Redis ZeroMQ ActiveMQ JafkaKafka 目前业界有很多MQ产品,我们作如下对比: RabbitMQ 是使用Erlang编写的一个开源的消息 ...
- sublime text多文件夹查找关键字
Ctrl+shift+F 快捷键在文件夹内查找,与普通编辑器不同的地方是sublime允许添加多个文件夹进行查找 转自:http://www.douban.com/note/362268947/
- zpf 命名规则
2014年8月19日 18:48:39 所有控制器都要继承main类,main类是一个入口类,他里边根据请求初始化了一些变量,也初始化了一些系统变量等等,这些变量和函数可以被控制器类直接使用 控制器类 ...
- Java性能优化权威指南-读书笔记(一)-操作系统性能监控工具
一:CPU 1. 用户态CPU是指执行应用程序代码的时间占总CPU时间的百分比. 系统态CPU是指应用执行操作系统调用的时间占总CPU时间的百分比.系统态CPU高意味着共享资源有竞争或者I/O设备之间 ...
- [MAC] mac系统如何显示和隐藏文件
转载地址: http://www.cnblogs.com/lm3515/archive/2010/12/08/1900271.html 显示Mac隐藏文件的命令:defaults write com. ...
- 在Spring3中,配置DataSource的方法有6种。
第一种:beans.xml Xml代码 收藏代码<bean id="dataSource" class="org.apache.commons.dbcp.Basic ...