我正在尝试使用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);
}
}
答案 0 :(得分:5)
int
和LayerMask
之间的投射可能有点令人困惑。
当您致电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");