Unity:同一游戏对象中具有不同功能的多个对撞机

Unity: more than one collider with different functionality in the same game object

我是新手

我正在尝试创建一个游戏对象,它有两个碰撞器,可以触发它们以产生不同的功能。假设它就像一个家,如果玩家对撞机在家的进入对撞机内并且你按 space 你可以把东西放在家里,如果玩家在第二个对撞机内你可以出去家里的东西(类似的东西,家里就像一个队列,你在红点介绍玩家的东西,一旦他们准备好了,你就可以在绿点把它们拿出来)

关键是在同一个游戏对象中不可能有多个触发器碰撞器,因为无法区分何时是触发器

制作过程是怎样的

public Color normalColor;
     public Color playerOnTopColor;
     public GameObject receiveArea;
     private SpriteRenderer receiveArearRenderer;
 
     public float refresTime = 5f;
 
     public int totalCapacity = 5;
     public int currentCapacity = 0;
 
     public int totalReady = 5;
     public int currentReady = 0;
 
     public Text capacityText;
     public Text readyText;
 
     void Start()
     {
         receiveArearRenderer = receiveArea.GetComponent<SpriteRenderer>();
         receiveArearRenderer.color = normalColor;
         updateText();
         StartCoroutine(checkForQueue());
     }
 
 
     private void OnTriggerEnter2D(Collider2D collision)
     {
         receiveArearRenderer.color = playerOnTopColor;
     }
 
     private void OnTriggerExit2D(Collider2D collision)
     {
         receiveArearRenderer.color = normalColor;
     }

现在,即使我进入一个或另一个对撞机,它也会改变底部的颜色,因为无法检查玩家进入其中一个和何时进入另一个。

您可以(并且可能不应该)在同一个对象上使用两个碰撞器。您可以改为将房子设为一个父对象和两个子对象,每个子对象都有自己的碰撞器。如果您想保留房屋对象上的所有代码,您仍然可以这样做。只需创建一个中继组件。只需制作一个包含此代码的新脚本即可:

 public UnityEvent OnTriggerEnter;
 public UnityEvent OnTriggerExit;

 private void OnTriggerEnter2D(Collider2D collision)
 {
     OnTriggerEnter?.Invoke();
 }

 private void OnTriggerExit2D(Collider2D collision)
 {
     OnTriggerExit?.Invoke();
 }

将此脚本放在每个子对象上,然后您可以使用 UnityEvents 运行 从 Home 脚本中为每个对象单独使用您想要的任何方法。


或者,如果您真的非常想将两个碰撞器都放在同一个对象上,那么您可以 运行 手动碰撞检查。在这种情况下,您将删除 OnTriggerEnter/Exit 方法,而是在 FixedUpdate 中对每个碰撞器执行 Collider2D.OverlapCollider 检查。您希望将每个对撞机分配给一个变量,以确定您正在使用哪个对撞机。

我终于改变了实现方式。 我错了,正如 Thomas 所说,这不是统一编程的方式,现在它是一个不同的子游戏对象(它拥有碰撞器和脚本)并且每个子游戏对象都有自己的功能,可以调用父游戏对象以在功能上与父对象相关目的是显示数字等等...感谢@Thomas Finch