在 Unity 中检查来自外部脚本的碰撞

Checking collision from external script in Unity

我有以下脚本应该检测两个对象之间的碰撞(BoxCollider2D 是触发器,CircleCollider2D 是普通碰撞器)

public class ArcadeScore : MonoBehaviour {

    public BoxCollider2D bc;
    public CircleCollider2D cc;

    private int score;

    // Use this for initialization
    void Start () {
        score = 0;
    }

    // Update is called once per frame
    void Update ()
    {
        if (bc.IsTouching(cc))
        {
            Debug.Log("collision detected");
            score++;
        }
    }
}

但是脚本不会在控制台中打印任何内容,所以我想知道是否可以从外部脚本中检测到触发器和普通碰撞器之间的碰撞?

您必须使用 OnCollisionEnter2D 而不是 IsTouching。 IsTouching 用于检测它们何时触摸帧,这可能不是真的。 T具有 OnCollisionEnter2D 功能的脚本必须附加到带有碰撞器的 GameObject,而不是空的 GameObject。

the problem is that I constantly destroy that object and all the values revert back to 0

您必须分离您的游戏逻辑,使用在 运行 时间内销毁的对象对系统代码进行评分。基本上,您的游戏逻辑、分数系统代码不应附加到销毁自身的对象上。它们应该附加到一个空的游戏对象。

诀窍是找到分数系统对象,获取其脚本,然后在销毁发生碰撞的对象之前更新分数。

ScoreSystem 脚本(附加到一个空的游戏对象):

public class ArcadeScore : MonoBehaviour 
{
    public int score;

    // Use this for initialization
    void Start () {
        score = 0;
    }
}

Collsion 脚本(使用 Collider 附加到 GameObject):

public class CollsionScript: MonoBehaviour 
{
    ArcadeScore scoreSys;

    void Start()
    {
        //Find the ScoreSystem GameObject
        GameObject obj = GameObject.Find("ScoreSystem");
        //Get the ArcadeScore script
        scoreSys = obj.GetComponent<ArcadeScore >();
    }

    void OnCollisionEnter2D(Collision2D coll) 
    {
        if (coll.gameObject.tag == "YourOtherObject")
        {
            scoreSys.score++;
            //You can now destroy object
            Destroy(gameObject);
        }
    }
}