Raycast2D 不适用于 LayerMask
Raycast2D not working with LayerMask
我正在尝试使用 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);
}
}
int
和 LayerMask
之间的转换可能有点混乱。
当你调用LayerMask.NameToLayer("Enemy")
时,你会得到图层索引。让我们假设“Enemy”是第 7 层,因此该调用将 return 7
。到目前为止一切顺利,但层索引与光线投射函数使用的按位层掩码不同。
为了屏蔽第七层,您设置了第七位:1 << 7
,即128
。如果您不熟悉 |
按位或、&
按位与或 <<
左移等位运算符,您可以查阅其他一些教程来了解位掩码。
因此,您要传递 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");
我正在尝试使用 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);
}
}
int
和 LayerMask
之间的转换可能有点混乱。
当你调用LayerMask.NameToLayer("Enemy")
时,你会得到图层索引。让我们假设“Enemy”是第 7 层,因此该调用将 return 7
。到目前为止一切顺利,但层索引与光线投射函数使用的按位层掩码不同。
为了屏蔽第七层,您设置了第七位:1 << 7
,即128
。如果您不熟悉 |
按位或、&
按位与或 <<
左移等位运算符,您可以查阅其他一些教程来了解位掩码。
因此,您要传递 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");