Unity3D中Camera类的eventMask属性作用解析

原创 2014年09月18日 22:45:24

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

摄像机按层响应事件Camera.eventMask

Camera.eventMask属性可以设置拿个层的物体响应鼠标事件 如果使物体响应鼠标有三个条件 1.物体在摄像机的视野范围内 2.eventMask与物体的layer进行与运算&后结果仍为物体的l...
  • jk823394954
  • jk823394954
  • 2016年09月03日 23:48
  • 689

GTK Gossip: 事件遮罩(Event Mask)

事件遮罩決定了一個Widget會接收到哪些事件,不同的Widget會有不同預設的事件遮罩,您可以使用gtk_widget_set_events()來設定事件遮罩:void gtk_widget_set...
  • uunubt
  • uunubt
  • 2010年12月09日 09:18
  • 452

Unity3D中Camera类的eventMask属性作用解析

2.1.4 eventMask属性:按层响应事件 基本语法:public inteventMask { get; set; } 功能说明:此属性的功能是用来选择哪个层(layer)的物体可以响应鼠...
  • QUAN2008HAPPY
  • QUAN2008HAPPY
  • 2014年09月18日 22:45
  • 1604

unity 动态创建摄像机

摄像机本身的depth越大,则它所渲染的东西越靠顶     public GameObject CameraObj;     public const int CAM_DEPTH = 2;   ...
  • linxinfa
  • linxinfa
  • 2015年06月04日 16:27
  • 1674

Unity3D类分析——全局的类分析

今天 开始了另一种模式的学习,那就是学习unity3d脚本中的类。纵观整个Unity3D的脚本我们可以将其分为两中类型:运行时类和编辑器类。(由于编辑器类到目前只是实验了一些功能,所以不敢多说,这里就...
  • jbjwpzyl3611421
  • jbjwpzyl3611421
  • 2013年10月13日 15:37
  • 4739

Unity3D 摄像机(Camera)属性详解

摄像机的设备捕获和显示世界玩家。 通过定制和操作相机,你可以使你的游戏真正独特的演讲。 你可以有一个无限数量的摄像机在场景。他们可以在任何顺序集呈现在屏幕上的任何地方,或只有某些部分的屏幕。 Uni...
  • jbjwpzyl3611421
  • jbjwpzyl3611421
  • 2013年10月14日 12:05
  • 37481

摄像机按层渲染Camera.cullingMask

摄像机Camera的属性cullingMask用于按层(即GameObject)有选择性的渲染场景中的物体。 我们先在Layer中加两个层 Cube和Sphere层 分别是第8和第9层 我们在场景...
  • jk823394954
  • jk823394954
  • 2016年09月03日 23:14
  • 1504

UNITY 5.2 Camera类

Camera 是用于显示显示游戏中的世界的,显示范围为视锥体内。 屏幕中的点用像素定义,左下角为(0, 0),右上角为(pixelWidth,pixelHeight)。Z坐标使用世界坐标系中的单位。...
  • u010270148
  • u010270148
  • 2015年12月02日 15:21
  • 1510

Unity3d中Camera类的aspect属性解析

2.1.1 aspect属性:设置摄像机视口比例 基本语法:public float aspect{ get; set; } 功能说明:此属性用于获取或设置Camera视口的宽高比例值。例如,设c...
  • QUAN2008HAPPY
  • QUAN2008HAPPY
  • 2014年09月18日 22:38
  • 3361

openGL中camera类的设计以及使用

简介:        首先,camera类是什么?它相当于摄像机镜头,通过设定合适的位置和角度可以实现对3D绘制图形的观察,而camera类的优势就在于可以围绕绘制的物体进行漫游,唯一需要完成的工作...
  • hobbit1988
  • hobbit1988
  • 2012年09月07日 23:28
  • 11390
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3D中Camera类的eventMask属性作用解析
举报原因:
原因补充:

(最多只允许输入30个字)