C# 统一-两种不同类型的对撞机之间的检测不起作用

C# 统一-两种不同类型的对撞机之间的检测不起作用,c#,unity3d,C#,Unity3d,我在一个游戏对象中有两个不同类型的碰撞器:一个用于触发器的球体碰撞器和一个用于命中光线投射的胶囊碰撞器。我有这个OnTriggerEnter的代码,但是当玩家进入球体触发器时,什么都不会发生。我做错了什么 public GameObject canvasTesoroFoto; public GameObject canvasTesoroDatos; private GameObject Player; public SphereCollider sCollider; public Capsul

我在一个游戏对象中有两个不同类型的碰撞器:一个用于触发器的球体碰撞器和一个用于命中光线投射的胶囊碰撞器。我有这个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;
    }
}

确保您的玩家游戏对象还附带了collider,以使其正常工作,您需要:

在障碍物中:已检查带有触发器的球体碰撞器 在播放器中:

对撞机 刚体 此外,如果纸条在障碍物中,碰撞器其他将指代玩家不指向障碍物。所以你应该直接这样做:

void OnTriggerEnter(Collider other)
{
        if (other.gameObject.tag == "Player") {
            canvasTesoroFoto.SetActive (true);
            canvasTesoroDatos.SetActive (true);
        }
}
根据你的评论。在这种情况下,你应该考虑在玩家的对撞器中添加触发器,以检测障碍物的球体,并为触发器留下触发器。

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

但据我所知,如果两个碰撞器都已被选中,则无法区分游戏对象中哪个碰撞器触发了OnTiggerEnter

编辑:根据你的评论,我想象一种情况,对撞机的游戏对象是某种敌人,它可能被光线投射击中,同时可能与玩家发生碰撞,例如夺走他的生命

最好的方法是触发玩家的碰撞器,在附加到玩家的脚本中检测敌人的球体碰撞器。然后取消选中是在敌人中触发球体对撞机。刚刚离开的是触发太空舱对撞机来探测光线投射

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


是的,玩家已经连接了对撞机。它似乎没有区分两个碰撞器,因为当我重写如下代码时,它用一个碰撞器检测触发器:void ontriggereintercollider other{if other.gameObject.tag==Player{canvastesorofto.SetActive true;canvasTesoroDatos.SetActive true;}这段代码附加在哪个游戏对象上?在玩家身上还是在障碍物里?@IgnacioAlorre在障碍物里。好的,我试着回答。所以只有球体有触发器还是胶囊?球体有触发器是的,我知道你说的。问题是我有两个不同类型和大小的碰撞器来做两件不同的事情一个用于启用游戏对象的球体碰撞器和一个用于执行其他功能的胶囊碰撞器,当我进入触发器时,我需要区分它们。@Angelsm如果只有球体有触发器,你可以使用我添加的代码,你不需要检查玩家是否触发了球体或胶囊。因为只有一个选项,球体。当你执行动作教学时,两台对撞机trigger@Angelsm我会考虑让玩家触发玩家的对撞器,并从球中移除IS触发器。因此,您将在播放器中使用脚本中的接近碰撞器。当玩家接近障碍物时,它会被触发,我开始怀疑这是一个敌人,但你会按照玩家的脚本采取行动。然后,您可以将障碍物中光线投射的触发器保持为触发器状态,这样您就知道当有东西击中胶囊碰撞器时,将触发障碍物脚本中的OnTriggerCenter。@Angelsm问题是您正在检查碰撞器是否存在于障碍物中,而不是您已输入的碰撞器之一。如果游戏对象中存在碰撞器,那么您刚才编写的if条件将始终返回true。不确定这是否可行,但请尝试:if other.gameObject.GetComponent.sCollider==other…if other.gameObject.GetComponent.ccolider==other