【问题标题】:Unity - Detection between two different types of colliders is not workingUnity - 两种不同类型的对撞机之间的检测不起作用
【发布时间】:2018-05-29 04:21:19
【问题描述】:

我在gameobject 中有两个不同类型的对撞机:一个用于触发器的球体对撞机和一个用于命中射线投射的胶囊对撞机。我有OnTriggerEnter 的代码,但是当玩家进入球体触发器时什么也没有发生。我做错了什么?

public GameObject canvasTesoroFoto;
public GameObject canvasTesoroDatos;

private GameObject Player;
public SphereCollider sCollider;
public CapsuleCollider cCollider;

void Start()
{
    Player = GameObject.FindGameObjectWithTag("Player");
    sCollider = GetComponent<SphereCollider> ();
    cCollider = GetComponent<CapsuleCollider> ();

}

void OnTriggerEnter(Collider other)
{
    if (other == sCollider) {
        if (other.gameObject.tag == "Player") {
            canvasTesoroFoto.SetActive (true);
            canvasTesoroDatos.SetActive (true);
        }
    } 
    if (other == cCollider) {
        Debug.Log ("HitCollider");
        return;
    }
}

【问题讨论】:

  • 这段代码在什么游戏对象中附加?在玩家中还是在障碍物中?
  • @IgnacioAlorre 在障碍中。
  • 好的,我编辑了答案。那么只有球体有触发器还是胶囊也有?
  • 球体有触发器

标签: c# unity3d


【解决方案1】:

要使其正常工作,您需要:

  • 在障碍物中:已检查触发器的 Sphere 对撞机

在播放器中:

  • 对撞机
  • 刚体

此外,如果纸币在障碍物中,碰撞器other 将指向玩家而不是障碍物。所以你应该直接这样做:

void OnTriggerEnter(Collider other)
{
        if (other.gameObject.tag == "Player") {
            canvasTesoroFoto.SetActive (true);
            canvasTesoroDatos.SetActive (true);
        }
}

根据您的评论。在这种情况下,您应该考虑在玩家的对撞机中添加触发器,以检测障碍物的球体,并将触发器留给胶囊。

如果您需要触发障碍物中的两个碰撞器,您可以做的是创建一个球体游戏对象作为障碍物的子对象,使其透明并在那里添加脚本和球体碰撞器。然后将对撞机保持在障碍物本身中。然后,如有必要,您可以在球体中的脚本和障碍物之间交换信息。

但据我所知,如果两者都被选中“是触发器”,则无法区分游戏对象中的哪个碰撞器触发OnTriggerEnter()

编辑:根据您的 cmets,我想象这样一种情况,碰撞器的 GameObejct 是某种可能被光线投射击中的敌人,同时可能与 Player 崩溃(对于例如夺走他的生命)。

最好的方法是触发 Player 的碰撞器,在附加到 Player 的脚本中检测敌人的球体碰撞器。然后取消选中是在敌人中触发球体对撞机。离开就是触发胶囊对撞机来检测光线投射。

在本教程中,您有一个很好的例子:

https://unity3d.com/learn/tutorials/s/survival-shooter-tutorial

【讨论】:

  • 是的,我有你说的。问题是我有两个不同类型和大小的碰撞器来做两个不同的事情(一个球体碰撞器用于启用游戏对象和一个胶囊碰撞器来执行其他功能),当我进入触发器时我需要区分它们。跨度>
  • @Angelsm 如果只有球体有触发器,你可以使用我添加的代码,你不需要检查玩家是否触发了球体或胶囊。因为只有一个选项(球体)。你执行你的动作
  • 对不起,两个对撞机有触发器
  • @Angelsm 我会考虑触发 Player 的对撞机并从球体中移除 is 触发器。因此,您将使用播放器脚本中的“接近对撞机”。当玩家接近障碍物时会触发它,我开始怀疑这是一个敌人,但你会在玩家的脚本中采取行动。然后你可以将raycast的触发器保留在障碍物中,并且你会知道障碍物脚本中的ontriggerenter()会在物体撞击胶囊对撞机时被触发。
  • @Angelsm 问题是您正在检查障碍物中是否存在对撞机,而不是您输入的对撞机之一。如果对撞机存在于游戏对象中,您刚刚写给我的 if 条件将始终返回 true。不确定这是否可行,但请尝试: if (other.gameObject.GetComponent().sCollider == other)...if (other.gameObject.GetComponent().cCollider == other)
【解决方案2】:

确保您的 Player 游戏对象也附加了 collider

【讨论】:

  • 是的,玩家已经附加了对撞机。似乎没有区分这两个对撞机,因为当我像这样重写代码时它检测到一个对撞机的触发器: void OnTriggerEnter(Collider other) { if (other.gameObject.tag == "Player") { canvasTesoroFoto.SetActive (true) ; canvasTesoroDatos.SetActive (true); } }
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多