Raycast2D无法使用LayerMask

时间:2015-03-06 00:57:25

标签: c# unity3d mono

我正在尝试使用Raycast2D来检测攻击是否击中了敌人。我为" Enemy"创建了一个LayerMask。层和我有一个对象在" Enemy"层。在没有使用LayerMask的情况下击中对撞机没有问题,但是当我这样做时,我什么也得不到。我在这里缺少什么?

LayerMask EnemyLayer;

void Start ()
{
    EnemyLayer = LayerMask.NameToLayer ("Enemy");
}

public void BasicAttack()
{
    PlayerVitality.Stamina = 0;

    Vector2 attackDirection = CalculateAttackDirection ();
    float attackDamage = CalculateDamage (BasicAttackDamage);
    Debug.Log (EnemyLayer.value);
    RaycastHit2D hit = Physics2D.Raycast(new Vector2(transform.position.x + 2, transform.position.y), attackDirection, BasicAttackDistance, EnemyLayer.value);

    if (hit.collider != null)
    {
        Debug.Log("You hit: " + hit.collider.gameObject.name);
    }
}

1 个答案:

答案 0 :(得分:5)

intLayerMask之间的投射可能有点令人困惑。

当您致电LayerMask.NameToLayer("Enemy")时,您会获得图层索引。我们假设“Enemy”是第7层,因此调用将返回7

不幸的是,图层掩码是一个位掩码。要屏蔽第七层,请设置第七位:1 << 7,即128。如果您不熟悉按位运算符,例如|按位OR,&按位AND或<<左移,您可以查找其他一些教程来理解位掩码。

所以,你要传递7(第0,1和2位),你需要传递128(第7位)

长话短说,您需要将索引转换为位掩码。

其中任何一个都可行:

//get layer index, use it to make a bitmask
EnemyLayer = 1 << LayerMask.NameToLayer("Enemy");

//ask unity for a bitmask directly
EnemyLayer = LayerMask.GetMask("Enemy");