Jam*_*gle 1 c# mono unity-game-engine
我正在尝试使用Raycast2D来检测攻击是否击中了敌人。我为“敌人”图层创建了一个图层蒙版,并且在“敌人”图层上有一个带有碰撞器的对象。如果不使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
int
和之间的转换LayerMask
可能会有些混乱。
调用时LayerMask.NameToLayer("Enemy")
,您将获得图层索引。假设“敌人”是第7层,那么调用将返回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");
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3232 次 |
最近记录: |