【问题标题】:Unity C# 3dCollisionTrigger not working as intendedUnity C# 3dCollisionTrigger 未按预期工作
【发布时间】:2021-05-29 00:23:32
【问题描述】:

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

我不知道为什么会这样。我不完全理解统一中的碰撞。据我所知,它应该可以工作。

编辑: 10000 小时后我自己修复了它,我重新定位了所有东西,并在主要对象上攻击了一个新对象,现在它可以工作了。

如果学到了什么: 不要用同一个物体进行攻击和受到伤害。

代码:

public class MeleeAttackScript : MonoBehaviour
{
    public float Range = 1.0f;
    public float AttackSpeed = 1.2f;
    public float AttackCooldown = 0f;
    public float Damage = 5f;

    bool Collision = false;
    BoxCollider RangeCollider;
    Collider HitObject;

    public void Awake()
    {
        RangeCollider = GetComponent<BoxCollider>();
        RangeCollider.size = new Vector3(1, 1, Range);
        RangeCollider.center = new Vector3(0, 0.00001f, (RangeCollider.size.z+1)/2);
    }

    public void Update()
    {
        if (AttackCooldown > 0)
        {
            AttackCooldown -= Time.deltaTime;
        }

        if (Mathf.Clamp(AttackCooldown, 0, (1 / AttackSpeed)) == 0 && Collision && HitObject.gameObject.tag == "Object")
        {
            Attack();
            Collision = false;
        }
    }

    private void OnTriggerStay (Collider collider)
    {
        if (collider.GetComponent<Collider>().GetType() == typeof(CapsuleCollider))
        {
            Debug.Log(collider.name);
            HitObject = collider;
            Collision = true;
        }
    }

    public void Attack()
    {

            HitObject.gameObject.GetComponent<LifePointScript>().CurrentLifePoints -= Damage;






        AttackCooldown = 1 / (AttackSpeed);
    }


}

图片: Visualized

【问题讨论】:

  • 我不明白这个问题。那么,武器也在攻击玩家?
  • @ken y 它会自损

标签: c# unity3d


【解决方案1】:

在你的对象上设置不同的layers,然后在物理设置中,禁用与自身对应的碰撞矩阵中的索引。这样,在同一层上分层的碰撞器就不会与自身发生碰撞。

首先,选择任意对象上的图层下拉菜单

接下来,创建一个新层

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

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

【讨论】:

  • 为此使用层将您限制为 32 个对象(包括 Unity 内置层)
  • 不会工作,因为两个对象都是彼此的克隆,他们只是不能再互相攻击了,我让它工作了,但它只有在伤害设置为 0 并且我手动设置时才有效在检查器中对其旧值(5)的损坏并且它没有工作,当我用脚本将它设置为 5 时,我不知道为什么会这样:()
【解决方案2】:

您的初始方法还可以,但是您缺少一个小细节,这就是为什么敌人和玩家都受到伤害(以及盒子本身)的原因。

你的盒子对撞机检查碰撞......很好......但是......玩家和敌人都有碰撞(和你的盒子对撞机)。

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

换句话说,在你的触发停留中,你可以比较触发器中对象的标签是否是敌人,伤害它。如果触发器中有其他人(例如玩家),它将忽略它,因为它的标签或游戏对象名称不是“敌人”。

【讨论】:

  • 如果对象相同,它们是什么,那将不起作用,因为它们是相同的单位,而且我让它工作,但它只有在伤害设置为 0 并且我手动设置时才起作用在检查器中将损坏设置为其旧值(5)并且它不起作用,当我使用脚本将其设置为 5 时,我不知道为什么会这样:()
【解决方案3】:

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

相反,您可以通过Physics.IgnoreCollision 简单地忽略一组对撞机

并做类似的事情,例如

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

private void Awake()
{
    ...

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

所以任何MeleeAttackScript 实例都可以根据玩家对象的碰撞器忽略它自己的实例。

【讨论】:

  • 没有工作,它仍然受到损坏,可能是我做错了什么,但没有进一步修复它,我让它工作,但它只有在损坏设置为 0 和我在检查器中手动将损坏设置为它的旧值(5)并且它没有工作,当我用脚本将它设置为 5 时,我不知道为什么会这样:()
猜你喜欢
  • 2022-08-07
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 2021-01-19
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多