unity3d 使2D碰撞器只命中特定的2D碰撞器而不使用碰撞层遮罩

wkyowqbh  于 2023-03-23  发布在  其他
关注(0)|答案(2)|浏览(128)

在我的2D游戏中,有一些随机放置的圆圈和一些球。
每个球都有一个对其中一个圆的引用,这个圆将施加一个力将球拉向它的中心。
然而,球可以改变它们的圆圈。当它们这样做时,它们会从当前的圆圈飞到新的圆圈。
我的问题是:如何让球只与属于同一个圆的球发生碰撞?当一个球改变了它的圆时,我希望它忽略与所有其他球的碰撞,除了属于同一个新圆的球。
因为我可以有很多圆,我不认为使用碰撞层将做的工作,所以有没有更好的方法?

4xrmg8kj

4xrmg8kj1#

您可以通过Physics2D.IgnoreCollision将球存储在单独的集合中。
然后

  • 初始运行它们一次并使它们忽略所有其它碰撞器
  • 然后每次进入一个圆圈时,你运行通过属于那个圆圈的球,并为那些设置IgnoreCollisionfalse
  • 一旦你离开一个圆,你就把它们都设置回true
xam8gpfp

xam8gpfp2#

这个技术解决了这个问题。您可以将所有碰撞器设置为默认的IsTrigger模式,并且只有在接触同组(或相同颜色......)的球时才暂时关闭IsTrigger。此时将完成类似的物理过程,并且在退出碰撞时IsTrigger将再次禁用。

public class Ball : MonoBehaviour
{
    public int group;

    private Collider2D _collider2D;
    void Start() => _collider2D = GetComponent<Collider2D>();
    private void OnTriggerEnter2D(Collider2D other)
    {
     if (other.TryGetComponent(out Ball _b))
     {
         if (_b.group == group)
         {
             _collider2D.isTrigger = false;
         }
     }
    }
    private void OnCollisionExit2D(Collider2D other)
    {
        _collider2D.isTrigger = true;
    }
}

使用碰撞一次忽略

就像@derHugo上面提到的,Physics2D.IgnoreCollision也可以用,我的新想法是,第一次和其他群冲击时忽略它,这样就解决了问题。

public int group;

private Collider2D _collider2D;
void Start()
{
    _collider2D = GetComponent<Collider2D>();
}

private void OnCollisionEnter2D(Collision2D other)
{
     if (other.transform.TryGetComponent(out Ball _b))
     {
         if (_b.group != group)
         {
             Physics2D.IgnoreCollision(_collider2D, other.collider);
         }
     }
}

更改组

要更改组,请将忽略的碰撞器存储在HashSet中,并使用下面的SetGroup方法,除了刷新(False Ignore)和清除hash Set外,还可以更改值number。
一个二个一个一个

相关问题