首页 > 解决方案 > 如何防止 GameObject 检测到未引用的碰撞

问题描述

我正在创建一个无尽的跑步游戏,其基本理念是避免尖峰并收集宝石——非常基本。我遇到的问题是,每当玩家与宝石发生碰撞时,即使它破坏了宝石,播放收集动画并将计分器加 1,它也会像尖刺一样摧毁玩家。为什么会发生这种情况,我该如何解决?这是我的“GemTypeCollision.cs”代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GemTypeCollision : MonoBehaviour 
{
    public GameObject gem;
    public Collider2D gemCollider;
    public float numberOfGems;
    public Animator gemAnimator;

    private void OnTriggerEnter2D(Collider2D gemCollider)
    {
        numberOfGems += 1;
        gemAnimator.SetBool("gemCollected", true);
        Destroy(gem, 0.5f);
    }
}

我还认为值得注意的是,玩家还附加了一个“尖刺型碰撞”脚本,玩家的反应与击中尖刺时完全一样,即使在宝石被摧毁时也是如此。似乎认为 gem 既是尖峰类型又是 gem 类型,但我不完全确定。

问题更新:

这是真正的问题——当玩家与任何东西发生碰撞时,Unity 认为他正在与任何东西发生碰撞,例如 OnTriggerEnter2D 方法,而不是采用我给它的 Collider2D 参数,它只是忽略信息并认为玩家被触发一次通过每个对撞机。有人知道解决这个问题的方法吗?

标签: unity3d

解决方案


从您发布的代码中,我只是猜测您在玩家尖峰碰撞脚本中犯了与此处相同的错误:

您不检查碰撞是否真的发生在正确的对象类型上,因此两个脚本都会对任何碰撞器触发器做出反应。


您应该适当地标记您的对象,例如“Spike”和“Gem”,而不是这样做

private void OnTriggerEnter2D(Collider2D gemCollider)
{
    // You should always check e.g. via a tag
    // if it's not a Gem -> do nothing
    if(gemCollider.tag != "Gem") return;

    // or alternatively if there is a certain component on the collision object you might also do
    if(!gemCollider.GetComponent<GemComponent>()) return;

    // ...
}

现在在您的尖峰碰撞中也是如此,您应该添加一个检查,例如

private void OnTriggerEnter2D(Collider2D other)
{
    // if it's not a spike do nothing
    if(other.tag != "Spike") return;

    // ...
}

推荐阅读