Unity-API Camera类属性:eventMask属性,按层响应事件

基本语法:public int eventMask{get;set;}

功能说明:此属性的功能是选择哪个层(layer)的物体可以响应鼠标事件,其使用说明如下。

如果要使物体响应鼠标事件必须首先满足如下两个条件。

第一,物体在摄像机的视野范围内。

第二,在2的layer次方的值与eventMask进行与运算(&)后结果为仍为2的layer次方的值,例如当前物体的层为Default,即layer值为0,则2的0次方为1,如果1与eventMask进行与运算后结果仍为1,则此物体便会响应鼠标事件。由于当eventMask为奇数时,与1的与运算都为1,所以若物体的层为Default并且eventMask为奇数时物体便会响应鼠标事件。

如果想要多个不同层的物体都响应鼠标事件,则需要把所有层的2的layer次方值相加,再与eventMask做与运算。例如,现有两个物体,它们的layer值分别为1和3,则当eventMask与9(因为2的0次幂+2的3次幂=9)进行与运算后若结果仍为9,则这两个物体都会响应鼠标事件。

此属性有一个特殊情况,当物体的layer选择IgnoreRaycast(其为系统内置,值为2)时,无论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 td;//记录与运算(&)的结果

  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);

  }

}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。