在我的2D游戏中,有一些随机放置的圆圈和一些球。每个球都有一个对其中一个圆的引用,这个圆将施加一个力将球拉向它的中心。然而,球可以改变它们的圆圈。当它们这样做时,它们会从当前的圆圈飞到新的圆圈。我的问题是:如何让球只与属于同一个圆的球发生碰撞?当一个球改变了它的圆时,我希望它忽略与所有其他球的碰撞,除了属于同一个新圆的球。因为我可以有很多圆,我不认为使用碰撞层将做的工作,所以有没有更好的方法?
4xrmg8kj1#
您可以通过Physics2D.IgnoreCollision将球存储在单独的集合中。然后
Physics2D.IgnoreCollision
IgnoreCollision
false
true
xam8gpfp2#
这个技术解决了这个问题。您可以将所有碰撞器设置为默认的IsTrigger模式,并且只有在接触同组(或相同颜色......)的球时才暂时关闭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。一个二个一个一个
SetGroup
2条答案
按热度按时间4xrmg8kj1#
您可以通过
Physics2D.IgnoreCollision
将球存储在单独的集合中。然后
IgnoreCollision
到false
。true
xam8gpfp2#
这个技术解决了这个问题。您可以将所有碰撞器设置为默认的
IsTrigger
模式,并且只有在接触同组(或相同颜色......)的球时才暂时关闭IsTrigger
。此时将完成类似的物理过程,并且在退出碰撞时IsTrigger
将再次禁用。使用碰撞一次忽略
就像@derHugo上面提到的,
Physics2D.IgnoreCollision
也可以用,我的新想法是,第一次和其他群冲击时忽略它,这样就解决了问题。更改组
要更改组,请将忽略的碰撞器存储在HashSet中,并使用下面的
SetGroup
方法,除了刷新(False Ignore)和清除hash Set外,还可以更改值number。一个二个一个一个