OnTriggerEnter2D发生得太慢

时间:2019-11-14 00:12:06

标签: c# unity3d

我有一个2D角色,可以使用下面的脚本射击一个附着有刚体2d的钩弹。当弹丸与某个图层(在Physics2D项目设置中选择)上的tilemapcollider2d碰撞时,应该立即停止。但是,OnTriggerEnter2D发生的时间并不总是足够快,导致抛射物在停下来之前就被剪辑到了瓦片中。脚本的基本原理是使用此设置,而不是剪切。

我知道onCollisionEnter2D并使用速度而不是MoveTowards是这里的解决方案,当弹丸与该层的瓷砖碰撞时,可以停止弹丸。不幸的是,我无法使它正常工作,我不确定为什么。我在tilemapcollider2d和弹丸刚体2d上都未选中“是触发器”,并且一直执行到onCollisionEnter2D事件从未注册。

public class Hookshot : MonoBehaviour
{
private GameObject player;
private Vector2 playerPos;

private BoxCollider2D col;
private Rigidbody2D rbody;
public GameObject DustParticle;

private readonly float hookshotCastTime = 0.2f;
private readonly float hookshotReturnSpeed = 200f;
private readonly float hookshotDistanceBuffer = 0.2f;

private void Awake()
{
    col = GetComponent<BoxCollider2D>();
    rbody = GetComponent<Rigidbody2D>();
}

public IEnumerator CastHookshot(float castDistance, Vector2 aimDir, GameObject playerInstance)
{
    player = playerInstance;
    playerPos = gameObject.transform.position;
    Vector2 target = playerPos + (castDistance * aimDir);
    float speed = castDistance / hookshotCastTime * Time.deltaTime;
    while (Vector2.Distance(transform.position, target) > hookshotDistanceBuffer)
    {
        //transform.position = Vector2.MoveTowards(transform.position, target, speed);
        rbody.velocity = speed * 10 * aimDir;
        yield return new WaitForFixedUpdate();
    }
    transform.position = target;
    StartCoroutine(ReturnHookshot());
}

public IEnumerator ReturnHookshot()
{
    col.enabled = false;
    playerPos = player.transform.position;
    while (Vector2.Distance(transform.position, playerPos) > hookshotDistanceBuffer)
    {
        playerPos = player.transform.position;
        transform.position = Vector2.MoveTowards(transform.position, playerPos, hookshotReturnSpeed * Time.deltaTime);

        yield return new WaitForEndOfFrame();
    }
    Destroy(gameObject);
}

//private void OnTriggerEnter2D(Collider2D collision)
//{
//    StopAllCoroutines();
//    Player playerInstance = player.GetComponent<Player>();
//    playerInstance.hookshotAttached = true;

//    if (GameManager.instance != null)
//    {
//        GameManager.instance.Emit(DustParticle, 5, transform.position, Vector2.one * 3f);
//    }

//}

private void OnCollisionEnter2D(Collision2D collision)
{
    StopAllCoroutines();
    rbody.velocity = Vector2.zero;
    Player playerInstance = player.GetComponent<Player>();
    playerInstance.hookshotAttached = true;

    if (GameManager.instance != null)
    {
        GameManager.instance.Emit(DustParticle, 5, transform.position, Vector2.one * 3f);
    }
}

}

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

尝试在其上带有TileMapCollider的对象上添加刚体,并将其设置为运动学。碰撞事件应该在运动刚体对撞机和常规刚体对撞机之间进行记录。另外,我没有看到任何代码监听OnCollision事件。可以分享两个对象的配置图片吗?