C# 统一处理多个不同用途的对撞机
我的敌人有两个不同的对撞机。 第一个是盒子对撞机,它被用作敌人的打击盒 第二个是球体对撞机,我想用它来探测玩家和他的盟友。此碰撞器的属性IsTrigger设置为true(BoxCollider没有) 我的问题是,当我的玩家发射一个抛射物时,它首先击中球体对撞机。球体对撞机被视为一个打击箱,我的敌人受到伤害。 以下是投射脚本:C# 统一处理多个不同用途的对撞机,c#,unity3d,collision-detection,C#,Unity3d,Collision Detection,我的敌人有两个不同的对撞机。 第一个是盒子对撞机,它被用作敌人的打击盒 第二个是球体对撞机,我想用它来探测玩家和他的盟友。此碰撞器的属性IsTrigger设置为true(BoxCollider没有) 我的问题是,当我的玩家发射一个抛射物时,它首先击中球体对撞机。球体对撞机被视为一个打击箱,我的敌人受到伤害。 以下是投射脚本: void OnTriggerEnter (Collider col) { if (col.gameObject.tag == "Player") {
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);
}
}
}
void ontriggenter(对撞机列)
{
如果(col.gameObject.tag==“玩家”)
{
AUnit a=col.gameObject.GetComponent();
如果(a!=null)
{
a、 损坏;
if(goThrough==false)
摧毁(游戏对象);
}
}
}
我的问题很简单,如何只检测BoxCollider而忽略SphereCollider?这可以通过使用来实现 将玩家设置为一层,将玩家投射物设置为另一层
然后,您可以使两个层在碰撞检测中相互忽略。这可以通过使用来实现 将玩家设置为一层,将玩家投射物设置为另一层
然后,您可以在碰撞检测中使两个层相互忽略。如果您不希望它们基于层工作,因为在某些情况下,如果没有较大的解决方案,这将无法完全工作,您可以使用以下解决方案,该解决方案也应该工作良好
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检测同一游戏对象上相同类型的Collider之间的差异。但只要对撞机是另一种类型,它就会工作
如果您希望在单个对象上使用2个相同类型的碰撞器,但仍然希望注意到差异,则很可能必须转到unity的该类型碰撞器的类定义,并添加公共int、float、long,或字符串ID,您可以在代码中获取该ID,以获取与之交互的特定类型的碰撞器。如果您不希望它们基于层工作,因为在某些情况下,如果没有大型解决方案,这将无法完全工作,您可以使用以下解决方案,该解决方案也应该工作良好
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检测同一游戏对象上相同类型的Collider之间的差异。但只要对撞机是另一种类型,它就会工作
如果您希望在单个对象上使用2个相同类型的碰撞器,但仍然希望注意到差异,则很可能必须转到unity的该类型碰撞器的类定义,并添加公共int、float、long,或字符串ID,您可以在代码中获取该ID,以获取与您交互的特定类型的碰撞器。我同意基于层的碰撞,但请注意,您不希望播放器本身位于不同的层中,而只是它是SphereCollider,否则您的投射物将永远不会检测到BoxCollider触发伤害。添加一个空的子对象,将您的SpeRecolder及其逻辑放在玩家和弹道逻辑层之外的另一层中;)@完全正确。此外,添加一个空的子对象而不将其标记为父对象也是有效的。除非你想拥有友军火力,否则你实际上应该让友军炮弹忽略友军,而敌人的炮弹忽略了敌人。我同意基于层的碰撞,但注意到你不想让玩家自己在不同的层中,只是球对撞机,否则你的炮弹永远不会检测到BoxCollider触发伤害。添加一个空的子对象,将您的SpeRecolder及其逻辑放在玩家和弹道逻辑层之外的另一层中;)@完全正确。此外,添加一个空的子对象而不将其标记为父对象也是有效的。除非你想拥有友军火力,否则你实际上应该让友军炮弹忽略友军炮弹,而敌人炮弹忽略敌人炮弹。