微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查哪些对象发生碰撞

如何解决如何检查哪些对象发生碰撞

我有一个例子:玩家对象、障碍物_1 对象和障碍物_2 对象。我如何检查与哪个玩家发生碰撞?我的意思是我想做 script_1 来让玩家与障碍物_1 碰撞,并在玩家与障碍物_2 碰撞时做 script_2。示例:

private void OnTriggerEnter2D(Collider2D collision)
{
    //script 1 when this object(player) collides with obstacle_1;

    //script 2 when this object(player) collides with obstacle_2;
}

解决方法

您似乎在问如何区分对象。有很多方法可以这样做,很难说哪种方法最适合您,因为您没有提供很多上下文。以下是一些想法:

  1. 最简单的方法之一是比较对象的名称:

private void OnTriggerEnter2D(Collider2D collision)
{
    if(collision.gameObject.name == "Obstacle_1"){
      //React to obstacle 1
    }
    else if (collision.gameObject.name == "Obstacle_2"){
      //React to obstacle 2
    }
}
不过我真的不鼓励这样做,因为可以很容易地更改对象的名称。

  1. 您可以将 Tags 添加到障碍_1 和障碍_2,以及compare tags,例如:

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.gameObject.CompareTag("Obstacle 1")){
          //React to obstacle 1
        }
        else if (collision.gameObject.CompareTag("Obstacle 2")){
          //React to obstacle 2
        }
    }
    这要好一些,因为更改标签不像更改名称那么容易,但仍有拼写错误的空间。比较字符串也不是很有效,特别是如果经常进行的话。

  2. 您可以为障碍物_1 (BouncyObstacle) 和障碍物_2 (SpikeObstacle) 创建不同的组件,然后让您的玩家尝试get these components,例如:

private void OnTriggerEnter2D(Collider2D collision) {
    if(collision.gameObject.TryGetComponent(out BouncyObstacle bouncyObs){
      // React to bouncy obstacle
    }
    else if(collision.gameObject.TryGetComponent(out SpikeObstacle spikeObs)
    {
      //React to spike obstacle
    }
}
这样好一点,但每次要添加新障碍时,都需要在播放器代码中添加 if

同样,很难说哪种解决方案最好。从您的代码片段来看,似乎玩家类负责对障碍物做出反应,这意味着每次要添加新障碍物时,都需要打开玩家类并更改 OnTriggerEnter 方法。也许最好将此责任转移到单独的组件上。这样,您就可以添加任意数量的障碍,而无需更改您之前创建的任何课程。类似的东西:

public class BouncyObstacle : MonoBehaviour
{
  void OnTriggerEnter2D(Collider2D other)
  {
    if(other.TryGetComponent(out Player player))
    {
      player.Bounce();
    }
  }
}

public class SpikeObstacle : MonoBehaviour
{
  void OnTriggerEnter2D(Collider2D other)
  {
    if(other.TryGetComponent(out Player player))
    {
      player.Kill();
    }
  }
}

// etc..

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。