【问题标题】:Raycast2D not working with LayerMaskRaycast2D 不能与 LayerMask 一起使用
【发布时间】:2015-03-06 00:57:24
【问题描述】:

我正在尝试使用 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);
    }
}

【问题讨论】:

    标签: c# unity3d mono


    【解决方案1】:

    intLayerMask 之间的转换可能有点混乱。

    当您调用LayerMask.NameToLayer("Enemy") 时,您将获得图层索引。假设“敌人”是第 7 层,因此该调用将返回 7。到目前为止,一切都很好,但是层索引与 raycast 函数使用的按位层掩码不同。

    为了屏蔽第七层,您设置第七位:1 << 7,即128。如果您不熟悉按位运算符,例如 | 按位 OR、& 按位与或 << 左移,您可以查看其他一些教程来了解位掩码。

    所以,您传入 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");
    

    【讨论】:

    • 这不适用于我使用RaycastHit2D ray = Physics2D.Raycast(transform.position, dir, Mathf.Infinity, 1 &lt;&lt; LayerMask.NameToLayer("player"));
    猜你喜欢
    • 2022-01-21
    • 2021-04-27
    • 1970-01-01
    • 2017-01-09
    • 2017-04-14
    • 2016-09-16
    • 2016-04-19
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多