Unity官方文档相对于这一部分的解释:
中文文档:https://connect.unity.com/doc/Manual/EventSystem(感觉这个加载速度很随缘)
英文文档:我是参看编辑器自带的,网址的话大家自行百度,搜索词:unity manual。
其实官方文档对于这一部分的解释,相对于其他模块,真的是有一点少,下面我会就官方文档中没有提到的部分跟大家分享讨论。
以下均为个人愚见,请大家带着批判的目光去看,如有指教,敬请评论。
Unity版本:2018.4.11c1
概述
其实从官方文档少的可怜的解释中,有这样一句话:使用事件系统可以根据输入(即键盘、鼠标、触摸或自定义输入)将事件发送到应用程序中的对象。事件系统包含一些共同协作以发送事件的组件。
在UI上的应用
举个最常见的例子,就是UI交互***。在创建UI元素时,系统会自行创建EventSystem*对象,其上添加两个组件:Event System和Standalone Input Module。
而在Canvas上,与EventSystem相关的一个组件则是Graphic Raycaster。
Event System,Standalone Input Module,Graphic Raycaster。这三个构成了之前所说的共同协作以发送事件的组件。而UI系统具体怎样搭建使用,请各位参看官方文档中的描述。
可变动的地方
上述三个组件中,Standalone Input Module可以替换为任何继承自BaseInputModule的组件(Touch Input Module现已弃用,触摸输入的处理在Standalone Input Module中进行)。
而Graphic Raycaster亦可替换为Physics 2D Raycaster或Physics Raycaster。
Physcis Raycaster,用于3D物理元素,例如可以实现鼠标与3D物理元素的交互。
Physics 2D Raycaster,用于2D物理元素。
在3D场景中的应用
这一部分是在我的项目中想要使用的,也是本文的重点。
1 - 需要在场景中创建一个EventSystem(UI->Event System)。
2 - 在你所使用的Camera上,添加组件Physics Raycaster。
3 - 在希望以鼠标可交互的对象上添加脚本,实现事件接口(事件接口描述的链接https://connect.unity.com/doc/Manual/SupportedEvents)
示例:检测是否在一个Cube上进行鼠标点击,给Cube添加脚本ClickHandler.cs。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class ClickHandler : MonoBehaviour, IPointerDownHandler
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void OnPointerDown(PointerEventData eventData)
{
if (eventData.pointerId == -1)
{
Debug.Log("你左键点我了!!");
}
if (eventData.pointerId == -2)
{
Debug.Log("你又用右键点我了!!");
}
if (eventData.pointerId == -3)
{
Debug.Log("好吧,这次是中键。。");
}
}
}
效果图如下(动图太麻烦了,就直接一个截图吧):
以下几点需要注意:
- 脚本中应当自行添加
using UnityEngine.EventSystems;
。 - 在类后面进行接口的继承。相关事件接口列表的中文链接。
有关于事件处理函数(即本例中的OnPointerDown(PointerEventData eventData)
),其参数中的eventData
有很多属性,可以参看官方的中文API文档。
最后推荐一个我觉得相关的写的不错的文章:http://www.manew.com/home.php?mod=space&uid=56596&do=blog&id=2917&page=1#comment