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
我是新手
我正在尝试创建一个游戏对象,它有两个碰撞器,可以触发它们以产生不同的功能。假设它就像一个家,如果玩家对撞机在家的进入对撞机内并且你按 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