Unity 处理多个具有不同目的的碰撞器
Unity handle multiple collider with different purpose
我有一个 Enemy 有两个不同的 Collider。
第一个是 Box Collider,它被用作敌人的碰撞箱。
第二个是 Sphere Collider,我想用它来检测玩家和他的盟友。此碰撞器将 属性 IsTrigger 设置为 true(BoxCollider 没有)。
我的问题是,当我的播放器发射弹丸时,它首先击中 Sphere Collider。球体碰撞器被视为碰撞箱,我的敌人会受到伤害。
这是射弹脚本:
void OnTriggerEnter (Collider col)
{
if (col.gameObject.tag == "Player")
{
AUnit a = col.gameObject.GetComponent<AUnit>();
if (a != null)
{
a.takeDamage(damage);
if (goThrough == false)
Destroy(gameObject);
}
}
}
我的问题很简单,怎么才能只检测BoxCollider而忽略SphereCollider?
这可以通过使用 Layer-Based Collision Detection 来实现。
您将播放器设置为一层,并将播放器弹射物设置为另一层。
然后你可以让两层在碰撞检测中互相忽略。
如果您不希望它们基于层工作,因为在某些情况下,如果没有大量解决方法,这将无法完全工作,您可以使用以下解决方案,它应该也能正常工作。
public class "ClassNameHere": MonoBehaviour
{
public BoxCollider2D Collider1;
public CircleCollider2D Collider2;
public CircleCollider2D Collider3;
private void OnCollisionEnter2D(Collision2D other)
{
if(other.collider==Collider1)
{
Debug.Log("1");
}
if(other.collider==Collider2)
{
Debug.Log("2");
}
if(other.collider==Collider3)
{
Debug.Log("3")
}
}
}
使用这个你会在与特定的碰撞器碰撞时执行特定的动作,即使它们在同一个游戏对象上也是如此。
但是请注意,Collider 没有 id 变量或类似的东西,它允许 unity 检测同一游戏对象上相同类型的碰撞器之间的差异。但只要碰撞器的类型不同,它就会起作用。
如果您想在单个对象上使用 2 个相同类型的碰撞器,但仍想注意它们之间的差异,您很可能必须转到 unity 的 class 对该类型碰撞器的定义并添加一个 public int、float、long 或字符串 ID,您可以在代码中获取这些 ID,以获取您与之交互的特定类型的碰撞器。
我有一个 Enemy 有两个不同的 Collider。 第一个是 Box Collider,它被用作敌人的碰撞箱。
第二个是 Sphere Collider,我想用它来检测玩家和他的盟友。此碰撞器将 属性 IsTrigger 设置为 true(BoxCollider 没有)。
我的问题是,当我的播放器发射弹丸时,它首先击中 Sphere Collider。球体碰撞器被视为碰撞箱,我的敌人会受到伤害。 这是射弹脚本:
void OnTriggerEnter (Collider col)
{
if (col.gameObject.tag == "Player")
{
AUnit a = col.gameObject.GetComponent<AUnit>();
if (a != null)
{
a.takeDamage(damage);
if (goThrough == false)
Destroy(gameObject);
}
}
}
我的问题很简单,怎么才能只检测BoxCollider而忽略SphereCollider?
这可以通过使用 Layer-Based Collision Detection 来实现。
您将播放器设置为一层,并将播放器弹射物设置为另一层。
然后你可以让两层在碰撞检测中互相忽略。
如果您不希望它们基于层工作,因为在某些情况下,如果没有大量解决方法,这将无法完全工作,您可以使用以下解决方案,它应该也能正常工作。
public class "ClassNameHere": MonoBehaviour
{
public BoxCollider2D Collider1;
public CircleCollider2D Collider2;
public CircleCollider2D Collider3;
private void OnCollisionEnter2D(Collision2D other)
{
if(other.collider==Collider1)
{
Debug.Log("1");
}
if(other.collider==Collider2)
{
Debug.Log("2");
}
if(other.collider==Collider3)
{
Debug.Log("3")
}
}
}
使用这个你会在与特定的碰撞器碰撞时执行特定的动作,即使它们在同一个游戏对象上也是如此。
但是请注意,Collider 没有 id 变量或类似的东西,它允许 unity 检测同一游戏对象上相同类型的碰撞器之间的差异。但只要碰撞器的类型不同,它就会起作用。
如果您想在单个对象上使用 2 个相同类型的碰撞器,但仍想注意它们之间的差异,您很可能必须转到 unity 的 class 对该类型碰撞器的定义并添加一个 public int、float、long 或字符串 ID,您可以在代码中获取这些 ID,以获取您与之交互的特定类型的碰撞器。