统一OnTriggerStay2D()用于两个触发器

时间:2015-07-18 07:31:10

标签: c# unity3d triggers unity5

我正在使用unity 5 c#并且我有一个带有2个触发器对撞机的游戏对象,其中一个位于不同的位置。 我需要能够为他们使用OnTriggerStay2D和OnTriggerEnter2D,但我需要找到正在输入的触发器。现在,如果我输入第一个(多边形)触发器,OnTriggerEnter将激活第二个(框)。 我怎么能把两个对手分开?

public void OnTriggerEnter2D(Collider2D other) //2nd collider trigger
{
    if (other.tag == "Player") {
        Found = true; //if the player is in shooting range
        Idle = false; 
    } 
}
public void OnTriggerStay2D(Collider2D other) //1st collider trigger
{
        if (Found != true) {
            if (other.tag == "Player") {
                Shield = true;
                Idle = false;
            } 
    }
}

public void OnTriggerExit2D(Collider2D other) //2nd collider trigger
{
    if (other.tag == "Player") {
        Found = false;
        Shield = false;
        Shooting = false;
        Idle = true;
    } 
}

我试过使第一个触发器公共void OnTriggerStay2D(PolygonCollider2D其他),但它说“此消息参数必须是类型:Collider2D 该消息将被忽略。“

我要做的是在游戏对象前面有一个多边形触发器,并且在靠近游戏对象时有一个不同的盒子触发器,所以当你靠近游戏对象时,你进入第一个触发器并将它的盾牌放好但是当你得到它时接近它(在它的射击范围内)它将屏蔽它并开始射击你。

2 个答案:

答案 0 :(得分:0)

好的collider2d会检测所有类型的2d对撞机。它的多边形或仅仅是一个盒子并不重要。作为文档建议,它不需要公开或私有。然而,它只需要一个collider2d作为它的参数。

出于调试目的,为什么不使用print?

Print("you've entered the trigger function");

此外,我不会在同一个GameObject上使用2个不同的触发器对撞机。为什么不制作2个单独的游戏对象,以便您可以进行更彻底的检测。每个具有自己的触发器对撞机的GameObject都可以有不同的标签。

如果必须在一个物体上使用2个触发器碰撞器。这不是最好的主意。你可以使用shapeCount来确定它击中了哪一个。虽然就像我说的那样,我保证不会在同一个物体上做2个触发器碰撞器,而无论你想要做什么,在两个单独的物体上都会更容易。

但我认为通常不会禁止链接。我会观看和研究这些视频。它们对于解释引擎非常有用,它们甚至都不长。 https://unity3d.com/learn/tutorials/modules/beginner/2d 他们甚至有一个视频解释了2d对撞机。

答案 1 :(得分:0)

这是我的修复。在我的一个游戏中,我有一块巨石,我有一个触发器,它将删除它下方的一个块,所以它下降,然后我有另一个触发器告诉巨石开始向左或向右移动我然后还有另一个触发器将删除一块巨石接触到了巨石。

所以你可以做的是创建2个新的游戏对象,创建一个新的CS文件并对它们进行恰当的命名,然后用这两个新的类允许它们接收你在问题中提到的游戏对象。

然后当它们被触发时,你可以使用他们班级的代码。

所以你的第一堂课会变得像这样

public void OnTriggerEnter2D(Collider2D other)
{
    if (other.tag == "Player") {
        Enemy.Found = true; //if the player is in shooting range
        Enemy.Idle = false; 
    } 
}

public void OnTriggerExit2D(Collider2D other)
{
    if (other.tag == "Player") {
        Enemy.Exit2DTrigger();
    } 
}

然后另一个类就是这样的

public void OnTriggerStay2D(Collider2D other)
{
        if (Enemy.Found != true) {
            if (other.tag == "Player") {
                Enemy.Shield = true;
                IEnemy.dle = false;
            } 
    }
}

public void OnTriggerExit2D(Collider2D other)
{
    if (other.tag == "Player") {
        Enemy.Exit2DTrigger();
    } 
}

然后在你的敌人课上你会有

public void Exit2DTrigger()
{
    Found = false;
    Shield = false;
    Shooting = false;
    Idle = true;
}

P.S。你也不需要使用other.gameObject.tag ==“Player”?