Unity:在 Parent 脚本中检测 Child 触发器
Unity: Detect Child Trigger inside Parent Script
我目前正在学习如何在 Unity 中制作游戏,我想检测 Child 的对撞机何时被触发以对被击中的物体造成伤害。但我对它的工作原理感到困惑。
- Parent的
OntriggerEnter
是否检测到ChildObject的触发事件?
- 我怎么知道触发器来自 Child 而不是 Parent?
- 哪个Child的对撞机被触发了?
Parent 的碰撞器未被触发,但 Child 的碰撞器被触发。 Child object 也没有附加刚体
你说的叫self-collision。处理这个问题的一种方法是忽略某些碰撞器,看看 documentation here.
如果我对你的理解正确的话,你有一个像这样的 GameObject 层次结构:
parentGO (contains player mesh and Capsule Collider 2D)
|-childGO (contains attack mesh and Mesh Collider 2D)
我会附加到 childGO
一个脚本,它应该在其多边形碰撞器上注册碰撞并通知武器脚本 parentGO
被击中的物体。然后武器可以对目标造成伤害。
我没有足够的声誉来发表评论,所以我要回答。
我认为这里也得到了回答:.
如果子碰撞不在父碰撞内,则无需为父碰撞设置 IsTrigger = true
,只需为碰撞尝试不同的层即可。
这是 Unity 文档:https://docs.unity3d.com/Manual/LayerBasedCollision.html
我知道你很可能得到了你的回应,但也值得一提的是,也许你应该考虑分离这些对象并将它们附加到新的游戏对象,它有一个包含两个碰撞器的脚本 - 这可能会更多可靠且易于阅读。
您可以使用Collider2D.IsTouching(Collider2D other);
Here is documentation for IsTouching
或者编写使用观察者的自定义脚本并通知主游戏对象发生了碰撞。
private Action _onGameObjectCollided;
private void OnTriggerEnter2D(Collider2D col){
if(col.gameObject.CompareTag("TAG")
_onGameObjectCollided?.Invoke();
}
public void AddOnColliderEnterObserver(Action observer)
{
_onGameObjectCollided += observer;
}
public void RemoveOnColliderEnterObserver(Action observer)
{
_onGameObjectCollided -= observer;
}
在新游戏对象中:
collider.AddOnColliderEnterObserver(MethodToCallOnTriggerEntered);
我目前正在学习如何在 Unity 中制作游戏,我想检测 Child 的对撞机何时被触发以对被击中的物体造成伤害。但我对它的工作原理感到困惑。
- Parent的
OntriggerEnter
是否检测到ChildObject的触发事件? - 我怎么知道触发器来自 Child 而不是 Parent?
- 哪个Child的对撞机被触发了?
Parent 的碰撞器未被触发,但 Child 的碰撞器被触发。 Child object 也没有附加刚体
你说的叫self-collision。处理这个问题的一种方法是忽略某些碰撞器,看看 documentation here.
如果我对你的理解正确的话,你有一个像这样的 GameObject 层次结构:
parentGO (contains player mesh and Capsule Collider 2D)
|-childGO (contains attack mesh and Mesh Collider 2D)
我会附加到 childGO
一个脚本,它应该在其多边形碰撞器上注册碰撞并通知武器脚本 parentGO
被击中的物体。然后武器可以对目标造成伤害。
我没有足够的声誉来发表评论,所以我要回答。
我认为这里也得到了回答:
如果子碰撞不在父碰撞内,则无需为父碰撞设置 IsTrigger = true
,只需为碰撞尝试不同的层即可。
这是 Unity 文档:https://docs.unity3d.com/Manual/LayerBasedCollision.html
我知道你很可能得到了你的回应,但也值得一提的是,也许你应该考虑分离这些对象并将它们附加到新的游戏对象,它有一个包含两个碰撞器的脚本 - 这可能会更多可靠且易于阅读。
您可以使用Collider2D.IsTouching(Collider2D other);
Here is documentation for IsTouching
或者编写使用观察者的自定义脚本并通知主游戏对象发生了碰撞。
private Action _onGameObjectCollided;
private void OnTriggerEnter2D(Collider2D col){
if(col.gameObject.CompareTag("TAG")
_onGameObjectCollided?.Invoke();
}
public void AddOnColliderEnterObserver(Action observer)
{
_onGameObjectCollided += observer;
}
public void RemoveOnColliderEnterObserver(Action observer)
{
_onGameObjectCollided -= observer;
}
在新游戏对象中:
collider.AddOnColliderEnterObserver(MethodToCallOnTriggerEntered);