【问题标题】:unity OnTriggerStay2D() for two triggersunity OnTriggerStay2D() 用于两个触发器
【发布时间】:2015-07-18 07:31:09
【问题描述】:

我正在使用 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 该消息将被忽略。”

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

【问题讨论】:

    标签: c# unity3d triggers unity5


    【解决方案1】:

    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 对撞机的视频。

    【讨论】:

      【解决方案2】:

      这是我的解决方法。在我的一个游戏中,我有一块巨石,我有一个触发器,它会删除它下面的一个块,让它下落,然后我有另一个触发器,它告诉巨石开始向左或向右移动,然后我还有另一个触发器,它将删除一旦巨石接触到巨石。

      所以你可以做的是创建 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;
      }
      

      附:也不需要使用 other.gameObject.tag == "Player" 吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-29
        相关资源
        最近更新 更多