【问题标题】:Unity 5.6 2D- How can I check if 2 colliders isn't touching any other collider?Unity 5.6 2D-我如何检查两个对撞机是否没有接触任何其他对撞机?
【发布时间】:2019-12-21 20:18:16
【问题描述】:

在 Unity 5.6 C# 中,我知道有一种方法可以使用 IsTouching 检查碰撞器是否被任何其他碰撞器接触。

但是,我想知道如何将两个碰撞器组合在一起(彼此接触),以及如何检查它们是否都接触到彼此之外的任何碰撞器。

【问题讨论】:

  • 将碰撞保存在一个列表中,检查两者是否与其他任何东西碰撞,然后是它们的“伙伴”
  • @derHugo,我该怎么做? IsTouching 返回一个布尔值
  • OnCollisionEnter -> 将碰撞器添加到列表中; OnCollisionExit -> 从列表中删除该对撞机 => 列表中的所有内容当前正在接触。 => if(collisions.Count == 1) 你知道只有 1 个“伙伴”接触这个物体。现在您只需要检查其他对象是否也只有 1 次触摸以及您是否是此对象。
  • 您也可以将碰撞器放在一个图层中并使用contactFilter设置图层蒙版
  • 实际上我猜它更容易......你只需要一个脚本,对吧?

标签: c# unity3d 2d


【解决方案1】:

我会尝试一下我在 cmets 中提到的想法(我认为仅使用 cmets 部分很难理解)。

我会使用碰撞列表并在此处存储所有触摸,使用 OnCollisionEnterOnCollisionExit 过滤掉“伙伴”碰撞器。

由于两者都附加到同一个游戏对象,因此很容易过滤它们:

public class Collisions : MonoBehaviour
{
    // Show in the Inspector for debug
    [SerializeField] private List<Collider> colliderList = new List<Collider>();

    public bool IsTouching => colliderList.Count != 0;

    private void Awake ()
    {
        // Make sure list is empty at start
        colliderList.Clear();
    }

    private void OnCollisionEnter(Collision collision)
    {
        // Filter out own collider
        if(collision.gameObject == gameObject) return;

        if(!colliderList.Contains(collision.collider) colliderList.Add(collision.collider);
    }

    private void OnCollisionExit(Collision collision)
    {
        // Filter out own collider
        if(collision.gameObject == gameObject) return;

        if(colliderList.Contains(collision.collider) colliderList.Remove(collision.collider);
    }
}

在智能手机上输入,但我希望思路清晰

【讨论】:

  • 谢谢你,但我找到了一种解决方法(这样我就可以通过检测伙伴对撞机的碰撞来保留 2 个对撞机并进行壁挂。不确定您的代码是否也这样做。)无论如何,我确实使用了你的 OnCollisionEnter 和 Exit 想法,所以你帮了大忙!非常感谢!
  • 这是我用的:) { if (AirDetect == 3) { AirDetect = 2; AirDetect2 = 2; } } void OnCollisionEnter2D(Collision2D col) { AirDetect = AirDetect + 1; AirDetect2 = AirDetect2 + 1; } void OnCollisionExit2D(Collision2D col) { AirDetect = AirDetect - 1; AirDetect2 = AirDetect2 - 1; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
相关资源
最近更新 更多