0

我正在使用 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;
    } 
}

我尝试将第一个触发器设为 public void OnTriggerStay2D(PolygonCollider2D other) 但它说“此消息参数必须是类型:Collider2D 该消息将被忽略。”

我想要做的是在游戏对象前面有一个多边形触发器,并且在游戏对象附近有一个不同的框触发器,所以当你靠近游戏对象时,你进入第一个触发器,它会抬起它的盾牌,但是当你靠近它时(在它的射击范围内)它会放下它的盾牌并开始射击你。

4

2 回答 2

0

Well collider2d 检测到所有类型的 2d 对撞机。它是多边形还是只是一个盒子都没关系。正如文档建议的那样,它不需要是公共的或私有的。然而,它只需要一个 collider2d 作为它的论点。

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

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

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

如果您必须在一个对象上使用 2 个触发对撞机。这不是最好的主意。您可以使用 shapeCount 来确定它击中的是哪一个。尽管就像我说的那样,当您尝试在两个单独的对象上更容易做任何事情时,我会保证不会在同一个对象上执行 2 个触发对撞机。

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

于 2015-07-18T09:03:29.357 回答
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();
    } 
}

然后在您的 Enemy 课程中,您将拥有

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

PS你也不需要使用 other.gameObject.tag == "Player" 吗?

于 2015-07-18T09:20:52.967 回答