[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 是需要使用多个线程来做触摸和渲染 ...
随机推荐
- editorial-render A
PROBLEM LINK: PracticeContest Author: adminTester: Kevin AtienzaEditorialist: Ajay K. VermaRussian T ...
- 2014-08-07 SSDB 使用 rocksdb 引擎
http://www.ideawu.net/blog/archives/824.html 为了满足各位对 Facebook 出品的 rocksdb 的爱好, SSDB 数据库也可以使用 rocksdb ...
- CI邮箱中SMTP的一些端口
介绍其他几个常用邮箱设置,并以网易126邮箱为例,发图. 一.新浪邮箱(1)新浪邮箱自08年6月分服务器被攻击后开始对pop取件频率进行了严格**,同时新注册的用户需要手动才能开通pop ...
- Mybatis 动态sql标签
1.动态SQL片段 通过SQL片段达到代码复用 <!-- 动态条件分页查询 --> <sql id="sql_count"> ...
- OpenStack
[官网]http://www.openstack.org/ [视频教程1]http://blog.csdn.net/u010973404/article/details/16841229 [视频教程2 ...
- iOS block 声明时和定义时的不同格式
今天写程序时,在实现一个block时总提示格式错误,对比api的block参数格式,没发现错误.后来查阅了资料,发现这两个格式是不同的! 具体格式见下方 NSString * (^testBlock) ...
- Java for LeetCode 164 Maximum Gap
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- ubuntu tar 命令详细讲解
Ubuntu--tar命令 tar zxvf ut6410-android2.1.tgz tar zcvf ut6410-android2.1.tgz ut6410-android2.1/ tar - ...
- atom初体验
今天捣鼓了一天的atom,也测试了那个传说中绚丽的敲代码方式,感觉就是装逼利器,这里总结一下今天捣鼓的过程吧 首页,下载atom,这个在地址是:搜索 之后是安装插件,在这之前如果下载的是.exe的,那 ...
- Flesch Reading Ease (poj 3371)
题意: 给出一篇规范的文章,求其 句子数.单词数 和 音节数把这3个值代入题目给出的公式,输出其结果,保留2位小数. 标记单词分隔符: 逗号(,) 和 空格( ) 句子分隔符:句号(.) 问号(?) ...