我有一个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);
}
}
}
答案 0 :(得分:1)
尝试在其上带有TileMapCollider的对象上添加刚体,并将其设置为运动学。碰撞事件应该在运动刚体对撞机和常规刚体对撞机之间进行记录。另外,我没有看到任何代码监听OnCollision事件。可以分享两个对象的配置图片吗?