Unity C#3碰撞触发器未按预期工作

Unity C#3碰撞触发器未按预期工作,c#,unity3d,C#,Unity3d,我制作了一个对敌人造成伤害的脚本。它被连接到一个带有一个盒子碰撞器的武器上,这个盒子碰撞器是一个触发器。每当武器击中某个游戏对象时,我从中获得生命值,并用伤害减去生命值。问题是不仅敌人的物体会被击中,而且武器的物体也会被击中 我不知道为什么会这样。我不完全理解统一中的冲突。据我所知,它应该会起作用 编辑: 我自己修复了10000小时后,我重新安置了所有东西,在主要物体上攻击了一个新物体,现在它工作了 如果学会了: 不要用同一个物体进行攻击和伤害 代码: 公共类MeleeAttackScript:

我制作了一个对敌人造成伤害的脚本。它被连接到一个带有一个盒子碰撞器的武器上,这个盒子碰撞器是一个触发器。每当武器击中某个游戏对象时,我从中获得生命值,并用伤害减去生命值。问题是不仅敌人的物体会被击中,而且武器的物体也会被击中

我不知道为什么会这样。我不完全理解统一中的冲突。据我所知,它应该会起作用

编辑: 我自己修复了10000小时后,我重新安置了所有东西,在主要物体上攻击了一个新物体,现在它工作了

如果学会了: 不要用同一个物体进行攻击和伤害

代码:

公共类MeleeAttackScript:MonoBehavior
{
公共浮动范围=1.0f;
公共浮点数攻击速度=1.2f;
公共浮点数攻击冷却时间=0f;
公众浮子损坏=5f;
布尔碰撞=假;
BoxCollider测距对撞机;
对撞机;
公共图书馆
{
RangeCollider=GetComponent();
RangeCollider.size=新矢量3(1,1,范围);
RangeCollider.center=新矢量3(0,0.00001f,(RangeCollider.size.z+1)/2);
}
公共无效更新()
{
如果(攻击冷却时间>0)
{
攻击冷却时间-=Time.deltaTime;
}
if(Mathf.Clamp(AttackCooldown,0,(1/AttackSpeed))==0&&Collision&&HitObject.gameObject.tag==“对象”)
{
攻击();
冲突=错误;
}
}
私人void OnTriggerStay(对撞机对撞机)
{
if(collider.GetComponent().GetType()==typeof(CapsuleCollider))
{
Log(collider.name);
HitObject=对撞机;
碰撞=真;
}
}
公开无效攻击()
{
HitObject.gameObject.GetComponent().CurrentLifePoints-=伤害;
攻击冷却时间=1/(攻击速度);
}
}
图片:

在对象上设置“不同”,然后在“物理设置”中,禁用与自身对应的碰撞矩阵中的索引。这样,在同一层上分层的碰撞器将不会与其自身碰撞

首先,在任何对象上选择“图层”下拉列表

接下来,创建一个新层

创建新图层并将其分配给两个对象后,转到项目中的“物理设置”编辑->项目设置->物理

在该设置选项卡的底部,您将找到碰撞矩阵。找到新图层与自身之间的交点,然后禁用该碰撞图层。

在对象上设置“不同”,然后在“物理设置”中,禁用与自身对应的碰撞矩阵中的索引。这样,在同一层上分层的碰撞器将不会与其自身碰撞

首先,在任何对象上选择“图层”下拉列表

接下来,创建一个新层

创建新图层并将其分配给两个对象后,转到项目中的“物理设置”编辑->项目设置->物理

在该设置选项卡的底部,您将找到碰撞矩阵。找到新图层与自身之间的交点,然后禁用该碰撞图层。

你最初的方法还可以,但有一个小细节你遗漏了,这就是为什么敌人和玩家都受到了伤害(还有盒子本身)

您的长方体碰撞器检查碰撞。。。好的但是玩家和敌人都有碰撞(和你的箱子碰撞器)

你必须区分它们。一个简单的方法是比较你正在碰撞的物体的标签,或者物体的名称,这两种方法都应该有效


换句话说,在你的扣动状态下,你可以比较一下,如果扳机上物体的标签是敌人,你可以伤害它。如果触发器中有其他人(例如玩家),它将忽略它,因为它的标签或游戏对象名称不是“敌人”。

你最初的方法是可以的,但有一个小细节你丢失了,这就是为什么敌人和玩家都会受到伤害(以及盒子本身)

您的长方体碰撞器检查碰撞。。。好的但是玩家和敌人都有碰撞(和你的箱子碰撞器)

你必须区分它们。一个简单的方法是比较你正在碰撞的物体的标签,或者物体的名称,这两种方法都应该有效


换句话说,在你的扣动状态下,你可以比较一下,如果扳机上物体的标签是敌人,你可以伤害它。如果触发器中有其他人(例如玩家),它将忽略它,因为它的标签或游戏对象名称不是“敌人”。

我不知道你的确切层次结构,但通常使用建议的层有一个很大的缺点:它限制了可用层的数量(32个,包括8个Unity内置层)

相反,你可以有一套碰撞器,你只需通过

然后做一些类似的事情

// reference via the Inspector
[SerializeField] private Collider[] ignoreColliders;

private void Awake()
{
    ...

    foreach(var collider in ignoreColliders)
    {
        Physics.IgnoreCollision(RangeCollider, collider);
    }
}

因此,任何
MeleeAttackScript
实例都可以根据播放器对象的碰撞器忽略它自己的实例。

我不知道您的确切层次结构,但通常使用建议的层有一个很大的缺点:它限制了可用层的数量(32个,包括8个Unity内置层)

相反,你可以有一套碰撞器,你只需通过

然后做一些类似的事情

// reference via the Inspector
[SerializeField] private Collider[] ignoreColliders;

private void Awake()
{
    ...

    foreach(var collider in ignoreColliders)
    {
        Physics.IgnoreCollision(RangeCollider, collider);
    }
}

因此,任何
MeleeAttackScript
实例都可以根据播放器对象的碰撞器忽略它自己的实例。

我不理解这个问题。那么,武器也在攻击玩家吗?@ken y,它会自我伤害。我不明白这个问题。那么,武器也在攻击玩家吗?@ken y它得到了自毁层,因为这限制了你最多32个对象(包括Unity内置层)无法工作,因为两个对象都是彼此的克隆体,它们只是无法再攻击对方