嗨,我试图找出一个碰撞器的层,所以当一个特定的敌人来了,我把它们分类在层。目前我添加一个敌人,对玩家有一定的影响。这不是我的问题,但我的问题是我不知道如何从碰撞器检测层。这是我的代码在momem
public LayerMask layer; private void OnTriggerEnter2D(Collider2D collision) { if(Collider2D.) }
64jmpszr1#
为了回答你的问题,Collision2D对象有许多属性供你检查。通过检查gameObject属性,你可以找出“其他”对象在哪个层上。所以,如果你的情况,你可以做这样的事情,使检查层更容易一点:
Collision2D
gameObject
// Grab the integer values, for layers associated with these three enemies. int enemy1, enemy2, enemy3; private void Awake ( ) { enemy1 = LayerMask.NameToLayer ( "EnemyLayer1" ); enemy2 = LayerMask.NameToLayer ( "EnemyLayer2" ); enemy3 = LayerMask.NameToLayer ( "EnemyLayer3" ); } private void OnTriggerEnter2D ( Collider2D collision ) { var layerMask = collision.gameObject.layer; if ( layerMask == enemy1 ) { // ... } else if ( layerMask == enemy2 ) { // ... } else if ( layerMask == enemy3 ) { // ... } }
现在我已经回答了你的问题,你可能不想通过他们所在的层来检查你的敌人。虽然你当然可以这样做,但通常被认为是不合适的。这就是游戏对象标签的作用。你有更多的标签,你不会用额外的层污染物理场景。你的物理层蒙版通常会包括一个“敌人”层,然后你会明确我在那一点上检查一个标签。例如:
private void OnTriggerEnter2D ( Collider2D collision ) { if ( collision.CompareTag ( "Enemy1" ) ) { // ... } else if ( collision.CompareTag ( "Enemy2" ) ) { // ... } else if ( collision.CompareTag ( "Enemy3" ) ) { // ... } }
Here's LayerMask结构的Unity文档。
goucqfw62#
碰撞器本身没有层属性。但是,它所附加的gameObject有一个。所以你应该能够写:
if (collider2D.gameObject.layer == 3)
在Collider 2D上,你还有一个函数IsTouchingLayers,它可能对你想要实现的目标很有用。它接受一个LayerMask并返回一个bool。参见the docs注意:这里我写的是collider2D(示例),而不是Collider2D(类型/类)!这可能就是为什么你在编辑器的自动完成中找不到任何东西的原因。
IsTouchingLayers
LayerMask
bool
collider2D
Collider2D
muk1a3rh3#
假设您使用OnTriggerEnter()来捕获冲突。
OnTriggerEnter()
private void OnTriggerEnter(Collider collider) { if (((1 << collider.gameObject.layer) & MyLayerMask) != 0) { // DO YOUR STUFF } }
这个if (((1 << collider.gameObject.layer) & MyLayerMask) != 0)告诉如果collider.gameObject.layer在MyLayerMask中,则执行if语句中的代码。
if (((1 << collider.gameObject.layer) & MyLayerMask) != 0)
collider.gameObject.layer
MyLayerMask
3条答案
按热度按时间64jmpszr1#
为了回答你的问题,
Collision2D
对象有许多属性供你检查。通过检查gameObject
属性,你可以找出“其他”对象在哪个层上。所以,如果你的情况,你可以做这样的事情,使检查层更容易一点:
现在我已经回答了你的问题,你可能不想通过他们所在的层来检查你的敌人。虽然你当然可以这样做,但通常被认为是不合适的。这就是游戏对象标签的作用。你有更多的标签,你不会用额外的层污染物理场景。你的物理层蒙版通常会包括一个“敌人”层,然后你会明确我在那一点上检查一个标签。
例如:
Here's LayerMask结构的Unity文档。
goucqfw62#
碰撞器本身没有层属性。但是,它所附加的gameObject有一个。
所以你应该能够写:
在Collider 2D上,你还有一个函数
IsTouchingLayers
,它可能对你想要实现的目标很有用。它接受一个
LayerMask
并返回一个bool
。参见the docs注意:这里我写的是
collider2D
(示例),而不是Collider2D
(类型/类)!这可能就是为什么你在编辑器的自动完成中找不到任何东西的原因。muk1a3rh3#
假设您使用
OnTriggerEnter()
来捕获冲突。这个
if (((1 << collider.gameObject.layer) & MyLayerMask) != 0)
告诉如果collider.gameObject.layer
在MyLayerMask
中,则执行if语句中的代码。