2.1.4 eventMask属性:按层响应事件
基本语法:public inteventMask { get; set; }
功能说明:此属性的功能是用来选择哪个层(layer)的物体可以响应鼠标事件,对其使用说明如下。
q 如果要使物体响应鼠标事件必须首先满足如下两个条件:
第一,物体在摄像机的视野范围内;
第二,在2的layer次方的值与eventMask进行与运算(&)后结果为扔为2的layer次方的值,例如当前物体的层为Default,即layer值为0,则2的0次方为1,当1与eventMask进行与运算后结果如果扔为1,则此物体便会响应鼠标事件。由于当eventMask为奇数时,与1的与运算结果都为1,所以若物体的层为Default并且eventMask为奇数时物体便会响应鼠标事件。
q 如果想要多个不同层的物体都响应鼠标事件,则需要把所有层的值相加,再与eventMask做运算。例如,现有两个物体,它们的layer值分别为1和3,则当eventMask与9(因为 )进行与运算后若结果扔为9,则这两个物体都会响应鼠标事件。
q 此属性有一个特殊情况,当物体的layer选择IgnoreRaycast(其为系统内置,值为2)时,无论eventMask值为多少,物体都无法响应鼠标事件。原因很简单,因为这个层的物体都忽略了射线碰撞,鼠标就探测不到物体的存在,因而也就无法响应鼠标事件了。
提示:此属性的计算比较消耗资源,在不使用鼠标事件时建议将其值设为零。
实例演示:下面通过实例演示属性eventMask的使用。
using UnityEngine;
using System.Collections;
public class EventMask_ts : MonoBehaviour
{
bool is_rotate = false;//控制物体旋转
public Camera c;//指向场景中摄像机
//记录摄像机的eventMask值,可以在程序运行时在Inspector面板中修改其值的大小
public int eventMask_now = -1;
//记录当前物体的层
int layer_now;
int tp;//记录2的layer次方的值
int ad;//记录与运算(&)的结果
string str = null;
void Update()
{
//记录当前对象的层,可以在程序运行时在Inspector面板中选择不同的层
layer_now = gameObject.layer;
//求2的layer_now次方的值
tp = (int)Mathf.Pow(2.0f, layer_now);
//与运算(&)
ad = eventMask_now & tp;
c.eventMask = eventMask_now;
//当is_rotate为true时旋转物体
if (is_rotate)
{
transform.Rotate(Vector3.up * 15.0f * Time.deltaTime);
}
}
//当鼠标左键按下时,物体开始旋转
void OnMouseDown()
{
is_rotate = true;
}
//当鼠标左键抬起时,物体结束旋转
void OnMouseUp()
{
is_rotate = false;
}
void OnGUI()
{
GUI.Label(new Rect(10.0f, 10.0f, 300.0f, 45.0f), "当前对象的layer值为:" + layer_now + " , 2的layer次方的值为" + tp);
GUI.Label(new Rect(10.0f, 60.0f, 300.0f, 45.0f), "当前摄像机eventMask的值为:" + eventMask_now);
GUI.Label(new Rect(10.0f, 110.0f, 500.0f, 45.0f), "根据算法,当eventMask的值与" + tp + "进行与运算(&)后, 若结果为" + tp + ",则物体相应OnMousexxx方法,否则不响应!");
if (ad == tp)
{
str = " ,所以物体会相应OnMouseXXX方法!";
}
else
{
str = " ,所以物体不会相应OnMouseXXX方法!";
}
GUI.Label(new Rect(10.0f, 160.0f, 500.0f, 45.0f), "而当前eventMask与" + tp + "进行与运算(&)的结果为" + ad + str);
}
}
在这段代码中已对各段代码的功能做了较为详细的注释,请读者自行运行程序查看。在运行程序后,请在脚本所在物体的Inspector面板中选择不同的layer和设置不同的eventMask参数,然后查看界面文字的说明,并用鼠标点击相应的物体,查看物体的变化状态。图2-3是一张程序运行时截图。
本文章内容摘自图书《Unity API解析》,源码下载地址:http://www.ituring.com.cn/book/1474