最常被相机 (Camera)用来仅渲染场景中的一部分,被灯 (Light) 用来仅照亮场景中的某些部分。但层还能由光线投射 (raycasting) 用来有选择地忽略碰撞体或用来创建碰撞

创建层

第一步是创建我们可以分配给游戏对象 (GameObject)的新层。要创建一个新层,请打开“编辑”(Edit) 菜单并选择工程设置 (Project Settings) -> 标记 (Tags)

我们在其中一个空白用户层 (User Layer) 中创建一个新层。我们选择第 8 层。

分配层

既然您已经创建了一个新层,您就必须将该层分配给其中一个游戏对象。

在标记管理器中,我们把“玩家”(Player) 层分配到了第 8 层中。

用相机的剔除遮蔽图仅绘制场景的一部分

使用相机的剔除遮蔽图,您可以有选择地渲染某个特定层中的对象。要执行此操作,请选择会有选择地渲染对象的相机。

通过勾选或不勾选剔除遮蔽图属性中的层来修改剔除遮蔽图。

有选择地投射光线

使用层,您可以在特定层中投射光线以及忽略碰撞体。例如,您可能想忽略所有其他碰撞体,只对玩家层投射光线。

Physics.Raycast 函数采用一个位元遮蔽图,其中每一个位元都能决定某一层是否会被忽略。如果 layerMask 中的每个位元都启用,则会与所有碰撞体碰撞。如果 layerMask = 0,我们将永远找不到任何与光线的碰撞。

// JavaScript 示例。

//位元移动层的索引以获得一个位元遮蔽图
var layerMask = 1 << 8;
//光线是否与玩家层中的任何对象相交。
if (Physics.Raycast (transform.position, Vector3.forward, Mathf.Infinity, layerMask))
    print ("The ray hit the player");


// C# 示例。

int layerMask = 1 << 8;

//光线是否与玩家层中的任何对象相交。
if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))
    Debug.Log("The ray hit the player");

但是,在真实世界中您会想执行相反的操作。我们想对除“玩家”(Player) 层中的碰撞体外的所有碰撞体投射光线。

// JavaScript 示例。
function Update () {
  //位元移动层 (8) 的索引以获得一个位元遮蔽图
  var layerMask = 1 << 8;
  //这样仅会对层 8 中的碰撞体投射光线。
  //相反,我们想与一切碰撞,但不包括层 8。~ 操作符执行此操作,它会反转位元遮蔽图。
  layerMask = ~layerMask;

  var hit :RaycastHit;
  //光线是否与除玩家层外的任何对象相交
  if (Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask)) {
    Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
    print ("Did Hit");
  } else {
    Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
    print ("Did not Hit");
  }
}


// C# 示例。
void Update () {
    //位元移动层 (8) 的索引以获得一个位元遮蔽图
    int layerMask = 1 << 8;

    //这样仅会对层 8 中的碰撞体投射光线。
    //相反,我们想与一切碰撞,但不包括层 8。~ 操作符执行此操作,它会反转位元遮蔽图。
    layerMask = ~layerMask;

    RaycastHit hit;
    //光线是否与除玩家层外的任何对象相交
    if (Physics.Raycast(transform.position, transform.TransformDirection (Vector3.forward), out hit, Mathf.Infinity, layerMask)) {
        Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
        Debug.Log("Did Hit");
    } else {
        Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
        Debug.Log("Did not Hit");
    }
}

当您不向光线投射 (Raycast) 函数传递 layerMask 时,它就只会忽略使用 IgnoreRaycast 层的碰撞体。要在投射光线时忽略一些碰撞器,这种方法最简单。

Page last updated: 2013-06-25