繁体   English   中英

碰撞在 C# (Unity)

[英]Colliding in C# (Unity)

我是 C# 的新手,目前正在开发一款小型 2D 游戏。 我有一个碰撞脚本,所以只要我的角色碰到什么东西,我就会得到一个Debug.Log() 这是脚本:

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

public class Collidable : MonoBehaviour
{
    public ContactFilter2D filter;
    private BoxCollider2D boxCollider;
    private Collider2D[] hits = new Collider2D[10];

    protected virtual void Start()
    {
        boxCollider = GetComponent<BoxCollider2D>();
    }

    protected virtual void Update()
    {
        //Collision Work
        boxCollider.OverlapCollider(filter, hits);
        for(int i=0; i<hits.Length; i++)
        {
            if(hits[i] == null)
                continue;
          
            OnCollide(hits[i]);


            hits[i] = null;
        }
    }
    protected virtual void OnCollide(Collider2D coll)
    {
        Debug.Log(coll.name);
    }
}

例如,每当我的角色拿起一个箱子时,我只想获得 1 个控制台日志,因此,触摸一个箱子并收到一条他捡起的消息,但只要角色接触箱子,日志就不会不要停止飞行。 我该如何解决?

提前致谢

您必须添加一个flag (a boolean )才能仅调用一次该方法

在脚本的顶部,初始化一个boolean变量hasCollided ,默认设置为 false。

private bool hasCollided = false;

只有在碰撞尚未发生时才调用OnCollide()方法,当碰撞发生时,将hasCollided设置为true

protected virtual void OnCollide(Collider2D coll)
{
    if(!hasCollided)
    {
        Debug.Log(coll.name);
        hasCollided = true;
    }
}

这只调用一次OnCollide()方法。

Collider2D.OverlapCollider的官方文档指出

获取与此碰撞器重叠的所有碰撞器的列表。

并且您正在检查Update()意味着每次有任何碰撞器与您的BoxCollider2D重叠时您的碰撞代码都会执行

您应该查看Collider.OnCollisionEnter ,当此对撞机/刚体开始接触另一个刚体/对撞机时,它会被调用。

但是,仅当其中一个碰撞器还附加了非运动学刚体时才会发送碰撞事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM