如何解决如何检查哪些对象发生碰撞
我有一个例子:玩家对象、障碍物_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;
}
解决方法
您似乎在问如何区分对象。有很多方法可以这样做,很难说哪种方法最适合您,因为您没有提供很多上下文。以下是一些想法:
- 最简单的方法之一是比较对象的名称:
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
}
}
-
您可以将 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 } }
-
您可以为障碍物_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 举报,一经查实,本站将立刻删除。