在游戏的编程之中,基本上都需要依赖鼠标的输出,特别是在手机游戏上,绝大部分都需要通过手指触摸来控制游戏。如果要实现一个精灵,当手指点击精灵的会触发相关的操作,或者我们使用一张图片来作为按钮,点击的时候触发相关的操作,这时候就需要使用鼠标输入处理了。处理鼠标输入会有下面的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]鼠标(或触摸)输入处理的更多相关文章

  1. 9.2、Libgdx的输入处理之鼠标、触摸和键盘

    (官网:www.libgdx.cn) Libgdx支持的最主要的设备是desktop或浏览器的鼠标支持,Android的触摸屏支持和键盘的支持.我们接下来了解一下. 键盘 用户按下或释放一个按键生成了 ...

  2. 快速入门:触摸输入(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)

    原文 http://technet.microsoft.com/zh-cn/subscriptions/hh465387 快速入门:触摸输入(使用 C#/VB/C++ 和 XAML 的 Windows ...

  3. iOS 9之Advanced Touch Input(高级触摸输入)

    金田 今天要讲的主题是iOS 9高级触摸输入,更准确地讲,是在iOS9上如何减少触摸输入到屏幕显示的延迟程度,此次将分 低延迟渲染(iOS9 渲染性能优化)和 触摸点方案改进 两个方面来介绍. 低延迟 ...

  4. Mac 电脑鼠标和触摸板滚动方向不一致的问题【已解决】

    当我们使用鼠标连接到 MacBook 时,会发现无论怎么设置,鼠标和触摸板的滚动方向都是相反的,导致不能同时使用鼠标和触摸板 解决方法: 我安装了下面的程序,它只允许您反转鼠标的滚动行为: Scrol ...

  5. ubuntu鼠标和触摸板的禁用

    ubuntu鼠标和触摸板的禁用 学习了:http://www.2cto.com/os/201308/239403.html 在终端下直接执行以下命令来打开或关闭触摸板. sudo modprobe - ...

  6. usb之鼠标作为按键输入

    1. 首先搞清楚,鼠标点左键.右键等能得到什么数据,然后分析这些数据上报事件即可. 第一个基本点:usb_alloc_urb函数,创建一个struct urb结构体,只能使用这个函数来创建,它是urb ...

  7. 在 Ubuntu 环境下实现插入鼠标自动关闭触摸板

    Ubuntu 以及其他衍生版本,如 Linux Mint 等等都可以用官方的 PPA 来安装"触摸板指示"应用程序.打开一个终端,运行以下命令: sudo add-apt-repo ...

  8. python 监视和控制鼠标键盘的输入(使用pynput 而非pyhook)

    百度上搜到的文章大多基于pyhook, pip不能直接安装,托管在sourceForge上的代码仓库也找不到. google上发现可以使用pynput,貌似控制更为简单,而且可以直接使用pip安装 示 ...

  9. WPF 触摸到事件

    原文:WPF 触摸到事件 本文从代码底层告诉大家,在触摸屏幕之后是如何拿到触摸点并且转换为事件 在 WPF 界面框架核心就是交互和渲染,触摸是交互的一部分.在 WPF 是需要使用多个线程来做触摸和渲染 ...

随机推荐

  1. python如何安装pip和easy_installer工具

    1.在以下地址下载最新的PIP安装文件:http://pypi.python.org/pypi/pip#downloads 2.解压安装 3.下载Windows的easy installer,然后安装 ...

  2. Linux 千万不要执行的10个命令

    1. rm -rf 命令 rm -rf命令是删除文件夹及其内容最快的方式之一.仅仅一丁点的敲错或无知都可能导致不可恢复的系统崩坏.下列是一些rm 命令的选项. rm 命令在Linux下通常用来删除文件 ...

  3. 黑客逃避追踪,为什么要用虚拟机 + TOR + VPN 呢?

    为啥要使用虚拟机 使用虚拟机主要有俩原因. 第一个是为了好收拾,清理痕迹什么的.特别是MAC地址,系统指纹信息等等,这些一旦被收集到都可以作为呈堂证供.用虚拟机,干了坏事把快照恢复一下就好,省的清理c ...

  4. .Net Attribute特性

    1.什么是Atrribute 首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标 ...

  5. Two Sum I & II

    Two Sum I Given an array of integers, find two numbers such that they add up to a specific target nu ...

  6. (转)SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)

    二.完整的锁兼容性矩阵(见下图) 对上图的是代码说明:见下图. 三.下表列出了数据库引擎可以锁定的资源. 名称 资源 缩写 编码 呈现锁定时,描述该资源的方式 说明 数据行 RID RID 9 文件编 ...

  7. ubuntu下Tomcat7的安装和配置

    和前几个软件一样,Tomcat 同样是由JAVA开发的,所以,在安装前一定要装好JDK. 大家可以到 http://tomcat.apache.org/download-70.cgi 下载最新的Tom ...

  8. 使用JS构建简单Map(转)

    转载自:http://freejvm.iteye.com/blog/768025 最近使用源生的js处理页面数据,所谓源生的就是指没有经过包装的.最基本的JavaScript代码: 像使用ext,jQ ...

  9. mybatis There is no getter for property named 'xx' in 'class java.lang.String

    转载自://http://www.cnblogs.com/anee/p/3324140.html 用mybatis查询时,传入一个字符串传参数,且进行判断时,会报 There is no getter ...

  10. 【读书笔记】读《编写高质量代码—Web前端开发修炼之道》 - JavaScript原型继承与面向对象

    JavaScript是基于原型的语言,通过new实例化出来的对象,其属性和行为来自于两部分,一部分来自于构造函数,另一部分是来自于原型.构造函数中定义的属性和行为的优先级比原型中定义的属性和优先级高, ...