![](/img/trans.png)
[英]How to detect if two colliders/two triggers are colliding - Unity c#
[英]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.