如何防止GameObject检测未引用的碰撞

时间:2019-02-04 18:23:20

标签: unity3d

我正在创建一个无尽的跑步游戏,其基本思想是避免出现尖峰并收集宝石-非常基本。我遇到的问题是,每当玩家与宝石发生碰撞时,即使它破坏了宝石,播放了集合动画并在得分计数器上加了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);
    }
}

我还认为值得一提的是,玩家还附带了一个“尖峰型碰撞”脚本,即使宝石被破坏,玩家也将做出与击中尖峰时完全相同的反应。似乎认为这枚宝石的类型与秒杀类型相同,但我不确定。

问题更新:

这是真正的问题-当玩家与任何东西发生碰撞时,Unity认为他正在与一切发生碰撞,例如OnTriggerEnter2D方法,而不是使用我提供的Collider2D参数,它只是忽略了信息并思考了每次撞机都会触发玩家。有人知道解决该问题的方法吗?

1 个答案:

答案 0 :(得分:1)

根据您发布的代码,我只是猜测您在播放器峰值碰撞脚本中犯了与以下相同的错误:

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


您应该Tag适当地放置您的对象,例如“ 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;

    // ...
}